1. Обзор
Spring Cloud предоставляет разработчикам инструменты для быстрого построения некоторых распространенных шаблонов в распределенных системах (например, управление конфигурацией, обнаружение служб, автоматические выключатели, интеллектуальная маршрутизация, микро-прокси, шина управления, одноразовые токены, глобальные блокировки, выборы руководителей, распределенные сеансы, состояние кластера).
Это помогает управлять сложностью, связанной с построением распределенной системы.
2. Микросервисы
Microservices — это архитектурный стиль разработки программного обеспечения, который разбивает приложение на набор слабо связанных сервисов.
Это улучшает модульность, облегчая разработку, тестирование и развертывание приложения.
Это также делает процесс разработки более эффективным за счет распараллеливания небольших групп для работы с различными службами.
Существуют также различные трудности в отношении связи между службами, управления конфигурациями и т. Д. В архитектуре микросервисов.
Чтобы решить многие проблемы, возникающие в микросервисной архитектуре, нужно пройти манифест приложения из двенадцати факторов .
3. Spring Cloud Config
Spring Cloud Config обеспечивает поддержку на стороне сервера и на стороне для внешней конфигурации в распределенной системе.
Он состоит из двух компонентов: сервера конфигурации и клиента конфигурации.
Config Server — это центральное место для управления внешними свойствами приложений во всех средах. Мы также могли бы создавать версии файлов конфигурации, используя Git. Он предоставляет REST API для подключения клиентов и получения необходимой конфигурации. Мы также можем использовать Spring Profiles для управления различными файлами конфигурации для разных профилей (сред).
3. Зависимости
Мы будем использовать Gradle для создания нашего проекта. Я рекомендую использовать Spring Initializr для начальной загрузки вашего проекта.
Мы будем использовать:
- Spring Boot 2
- Spring Webflux
- Spring Reactive Data MongoDB
- Spring Security Reactive Webflux
- Ломбок
Не все библиотеки Spring имеют стабильную версию.
Lombok используется для сокращения стандартного кода для моделей и POJO. Он может автоматически генерировать методы установки / получения, конструкторы по умолчанию, методы toString и т. Д.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
buildscript { ext { springBootVersion = '2.0.0.M2' }...}dependencies { compile('org.springframework.boot:spring-boot-starter-data-mongodb-reactive') compile('org.springframework.boot:spring-boot-starter-webflux') compile('org.springframework.security:spring-security-core') compile('org.springframework.security:spring-security-config') compile('org.springframework.security:spring-security-webflux') compileOnly('org.projectlombok:lombok')...} |
4. Автоконфигурация
Мы оставим Spring Boot для автоматической настройки нашего приложения на основе добавленных зависимостей.
|
1
2
3
4
5
6
7
8
|
@SpringBootApplication@EnableReactiveMongoRepositories@EnableWebFluxSecuritypublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }} |
Для использования нестандартных значений в конфигурации нашего приложения мы можем указать их как свойства, и Spring Boot автоматически использует их для создания bean-компонентов.
|
1
|
spring.data.mongodb.database=demo |
Все компоненты, необходимые для MongoDB, Web и Security, будут созданы автоматически.
5. База данных
Мы будем использовать MongoDB в нашем примере и простой POJO. PersonRepository будет создан автоматически.
|
01
02
03
04
05
06
07
08
09
10
11
12
|
@Data@NoArgsConstructor@Documentpublic class Person { @Id private String id; private String name;}public interface PersonRespository extends ReactiveMongoRepository<Person, String> { Flux<Person> findByName(String name);} |
6. Веб-API
Мы создадим конечные точки REST для Person .
В Spring 5 добавлена поддержка функционального создания маршрутов, но при этом поддерживается традиционный способ их создания на основе аннотаций.
Давайте посмотрим на них обоих с помощью примеров.
6.1. Аннотация на основе
Это традиционный способ создания конечных точек.
|
01
02
03
04
05
06
07
08
09
10
11
12
|
@RestController@RequestMapping("/person")public class PersonController { @Autowired private PersonRespository personRespository; @GetMapping public Flux<Person> index() { return personRespository.findAll(); }} |
Это создаст конечную точку / лицо REST, которая будет возвращать все записи о людях реактивно.
6.2. Функции маршрутизатора
Это новый и краткий способ создания конечных точек.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
@BeanRouterFunction<?> routes(PersonRespository personRespository) { return nest(path("/person"), route(RequestPredicates.GET("/{id}"), request -> ok().body(personRespository.findById(request.pathVariable("id")), Person.class)) .andRoute(method(HttpMethod.POST), request -> { personRespository.insert(request.bodyToMono(Person.class)).subscribe(); return ok().build(); }) );} |
Метод nest используется для создания вложенных маршрутов, где группа маршрутов имеет общий путь (префикс), заголовок или другой RequestPredicate .
Итак, в нашем случае все соответствующие маршруты имеют общий префикс / person .
В первом маршруте мы выставили GET API / person / {id}, который будет извлекать соответствующую запись и возвращать ее.
Во втором маршруте мы выставили POST API / person, который получит объект Person и сохранит его в БД.
Команды cURL для того же:
|
1
2
3
|
curl http://localhost:8080/person -v -u tom:passwordcurl http://localhost:8080/person/{id} -v -u tom:passwordcurl http://localhost:8080/person -X POST -d '{"name":"John Doe","age":20}' -H "Content-Type: application/json" -v -u tom:password |
Мы должны определить маршруты в конфигурационном файле Spring.
7. Безопасность
Мы будем использовать очень простой базовый механизм аутентификации в нашем примере.
|
1
2
3
4
5
6
|
@BeanUserDetailsRepository userDetailsRepository() { UserDetails tom = withUsername("tom").password("password").roles("USER").build(); UserDetails harry = withUsername("harry").password("password").roles("USER", "ADMIN").build(); return new MapUserDetailsRepository(tom, harry);} |
Мы добавили некоторых пользователей для нашего приложения и присвоили им разные роли.
8. Заключение
Я попытался объяснить на простом примере, как создать простое веб-приложение Reactive, используя Spring Boot.
Вы можете прочитать больше о:
Вы можете найти полный пример службы сервера и библиотеки Config на Github.
|
Опубликовано на Java Code Geeks с разрешения Mohit Sinha, партнера нашей программы JCG . Смотреть оригинальную статью здесь: Введение в Spring Cloud — Config (часть I) Мнения, высказанные участниками Java Code Geeks, являются их собственными. |