Кратко ръководство за Spring Cloud Consul

1. Общ преглед

Проектът Spring Cloud Consul осигурява лесна интеграция с приложенията Consul за Spring Boot.

Consul е инструмент, който предоставя компоненти за решаване на някои от най-често срещаните предизвикателства в архитектурата на микро услуги:

  • Service Discovery - за автоматично регистриране и отписване на мрежовите местоположения на екземпляри на услуги
  • Проверка на състоянието - за откриване, когато екземпляр на услуга е стартиран и работи
  • Разпределена конфигурация - за да се гарантира, че всички екземпляри на услуги използват една и съща конфигурация

В тази статия ще видим как можем да конфигурираме приложението Spring Boot, за да използваме тези функции.

2. Предпоставки

Като начало се препоръчва да разгледате набързо Консула и всички негови функции.

В тази статия ще използваме агент на консул, работещ на localhost: 8500 . За повече подробности как да инсталирате Consul и да стартирате агент, вижте тази връзка.

Първо, ще трябва да добавим зависимостта spring-cloud-starter-consul-all към нашия pom.xml :

 org.springframework.cloud spring-cloud-starter-consul-all 1.3.0.RELEASE 

3. Откриване на услугата

Нека напишем първото си приложение Spring Boot и се свържем с работещия агент на Consul:

@SpringBootApplication public class ServiceDiscoveryApplication { public static void main(String[] args) { new SpringApplicationBuilder(ServiceDiscoveryApplication.class) .web(true).run(args); } }

По подразбиране Spring Boot ще се опита да се свърже с консулския агент на localhost: 8500 . За да използваме други настройки, трябва да актуализираме файла application.yml :

spring: cloud: consul: host: localhost port: 8500

След това, ако посетим сайта на консулския агент в браузъра на // localhost: 8500 , ще видим, че нашето приложение е правилно регистрирано в Consul с идентификатора от „$ {spring.application.name}: $ {профили, разделени от запетая}: $ {server.port} ” .

За да персонализираме този идентификатор, трябва да актуализираме свойството spring.cloud.discovery.instanceId с друг израз:

spring: application: name: myApp cloud: consul: discovery: instanceId: ${spring.application.name}:${random.value}

Ако стартираме приложението отново, ще видим, че то е регистрирано с помощта на идентификатора „MyApp“ плюс произволна стойност. Нуждаем се от това за стартиране на множество екземпляри от нашето приложение на локалната ни машина.

И накрая, за да деактивираме Discovery Service, трябва да зададем свойството spring.cloud.consul.discovery.enabled на false .

3.1. Търсене на услуги

Вече имаме регистрирано приложение в Consul, но как клиентите могат да намерят крайните точки на услугата? Нуждаем се от услуга за откриване на клиенти, за да получим текуща и достъпна услуга от Консул.

Spring предоставя API за DiscoveryClient за това , което можем да активираме с анотацията @EnableDiscoveryClient :

@SpringBootApplication @EnableDiscoveryClient public class DiscoveryClientApplication { // ... }

След това можем да инжектираме боб DiscoveryClient в нашия контролер и да осъществим достъп до екземплярите:

@RestController public class DiscoveryClientController { @Autowired private DiscoveryClient discoveryClient; public Optional serviceUrl() { return discoveryClient.getInstances("myApp") .stream() .findFirst() .map(si -> si.getUri()); } }

И накрая, ще дефинираме крайните точки на нашето приложение:

@GetMapping("/discoveryClient") public String discoveryPing() throws RestClientException, ServiceUnavailableException { URI service = serviceUrl() .map(s -> s.resolve("/ping")) .orElseThrow(ServiceUnavailableException::new); return restTemplate.getForEntity(service, String.class) .getBody(); } @GetMapping("/ping") public String ping() { return "pong"; }

Пътят „myApp / ping“ е името на приложението Spring с крайна точка на услугата. Консулът ще предостави всички налични приложения с име „myApp“.

4. Проверка на здравето

Консулът периодично проверява изправността на крайните точки на услугата.

По подразбиране Spring прилага крайната точка на здравето, за да върне 200 OK, ако приложението работи . Ако искаме да персонализираме крайната точка, трябва да актуализираме application.yml:

spring: cloud: consul: discovery: healthCheckPath: /my-health-check healthCheckInterval: 20s

В резултат на това Консул ще анкетира крайната точка „/ my-health-check“ на всеки 20 секунди.

Нека дефинираме нашата персонализирана услуга за проверка на състоянието, за да върнем ЗАБРАНЕН статус:

@GetMapping("/my-health-check") public ResponseEntity myCustomCheck() { String message = "Testing my healh check function"; return new ResponseEntity(message, HttpStatus.FORBIDDEN); }

Ако отидем на сайта на консулския агент, ще видим, че нашето приложение е неуспешно. За да поправи това, услугата “/ my-health-check” трябва да върне кода на състоянието HTTP 200 OK .

5. Разпределена конфигурация

Тази функция позволява синхронизиране на конфигурацията между всички услуги . Консулът ще следи за всякакви промени в конфигурацията и след това ще задейства актуализацията на всички услуги.

Първо, трябва да добавим зависимостта spring-cloud-starter-consul-config към нашия pom.xml :

 org.springframework.cloud spring-cloud-starter-consul-config 1.3.0.RELEASE 

Също така трябва да преместим настройките на името на приложението Consul и Spring от файла application.yml във файла bootstrap.yml, който Spring зарежда първо.

След това трябва да активираме Spring Cloud Consul Config:

spring: application: name: myApp cloud: consul: host: localhost port: 8500 config: enabled: true

Spring Cloud Consul Config ще търси свойствата в Consul на “/ config / myApp” . Така че, ако имаме свойство, наречено „my.prop“ , ще трябва да създадем това свойство в сайта на консулския агент.

Можем да създадем свойството, като отидем в раздела „KEY / VALUE“ , след което въведем „/ config / myApp / my / prop“ във формуляра „Create Key“ и „Hello World“ като стойност. Накрая щракнете върху бутона „Създаване“ .

Имайте предвид, че ако използваме Spring профили, трябва да добавим профилите до името на приложението Spring. Например, ако използваме dev профила, крайният път в Consul ще бъде „/ config / myApp, dev“.

Сега да видим как изглежда нашият контролер с инжектираните свойства:

@RestController public class DistributedPropertiesController { @Value("${my.prop}") String value; @Autowired private MyProperties properties; @GetMapping("/getConfigFromValue") public String getConfigFromValue() { return value; } @GetMapping("/getConfigFromProperty") public String getConfigFromProperty() { return properties.getProp(); } }

И класът MyProperties :

@RefreshScope @Configuration @ConfigurationProperties("my") public class MyProperties { private String prop; // standard getter, setter }

Ако стартираме приложението, стойността на полето и свойствата имат една и съща стойност „Hello World” от Consul.

5.1. Актуализиране на конфигурацията

Какво ще кажете за актуализиране на конфигурацията, без да рестартирате приложението Spring Boot?

Ако се върнем на сайта на консулския агент и актуализираме свойството “/ config / myApp / my / prop” с друга стойност като “New Hello World” , тогава стойността на полето няма да се промени и свойствата на полето ще бъдат актуализирани до „Нов Hello World“, както се очаква.

Това е така, защото свойствата на полето е клас MyProperties с анотация @RefreshScope . Всички зърна, коментирани с анотацията @RefreshScope, ще бъдат опреснени след промени в конфигурацията.

В реалния живот не бива да имаме свойствата директно в Консул, но трябва постоянно да ги съхраняваме някъде. Можем да направим това с помощта на Config Server.

6. Заключение

В тази статия видяхме как да настроим нашите приложения Spring Boot да работят с Consul за целите на Discovery Service, да персонализираме правилата за проверка на състоянието и да споделим разпределена конфигурация.

Също така въведохме редица подходи за клиентите да се позоват на тези регистрирани услуги.

Както обикновено, източници могат да бъдат намерени в GitHub.