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 @EnableWebFluxSecurity public 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 @Document public 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
|
@Bean RouterFunction<?> 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:password curl http: //localhost :8080 /person/ { id } - v -u tom:password curl 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
|
@Bean UserDetailsRepository 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, являются их собственными. |