Статьи

Введение в Spring Cloud — Config (часть I)

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, являются их собственными.