Een beknopte handleiding voor Spring Cloud Consul

1. Overzicht

Het Spring Cloud Consul-project biedt eenvoudige integratie met Consul voor Spring Boot-applicaties.

Consul is een tool die componenten levert voor het oplossen van enkele van de meest voorkomende uitdagingen in een microservices-architectuur:

  • Service Discovery - om de netwerklocaties van service-instances automatisch te registreren en uit te schrijven
  • Health Checking - om te detecteren wanneer een service-exemplaar actief is
  • Gedistribueerde configuratie - om ervoor te zorgen dat alle service-instances dezelfde configuratie gebruiken

In dit artikel zullen we zien hoe we een Spring Boot-applicatie kunnen configureren om deze functies te gebruiken.

2. Vereisten

Om te beginnen is het aan te raden om even naar Consul en al zijn functies te kijken.

In dit artikel gaan we een consul-agent gebruiken die wordt uitgevoerd localhost: 8500. Raadpleeg deze link voor meer informatie over het installeren van Consul en het runnen van een agent.

Eerst moeten we de afhankelijkheid spring-cloud-starter-consul-all toevoegen aan onze pom.xml:

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

3. Dienstopsporing

Laten we onze eerste Spring Boot-applicatie schrijven en contact opnemen met de actieve consul-agent:

@SpringBootApplication openbare klasse ServiceDiscoveryApplication {openbare statische leegte hoofd (String [] args) {nieuwe SpringApplicationBuilder (ServiceDiscoveryApplication.class) .web (true) .run (args); }}

Spring Boot probeert standaard verbinding te maken met de consul-agent op localhost: 8500. Om andere instellingen te gebruiken, moeten we het application.yml het dossier:

spring: cloud: consul: host: localhost poort: 8500

Als we vervolgens de site van de consul-agent bezoeken in de browser op // localhost: 8500, we zullen zien dat onze applicatie correct is geregistreerd in Consul met de identificatie van "$ {Spring.application.name}: $ {profielen gescheiden door komma}: $ {server.port}".

Om deze identifier aan te passen, moeten we de eigenschap updaten spring.cloud.discovery.instanceId met een andere uitdrukking:

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

Als we de applicatie opnieuw starten, zullen we zien dat deze is geregistreerd met behulp van de ID "MyApp" plus een willekeurige waarde. We hebben dit nodig om meerdere instanties van onze applicatie op onze lokale computer uit te voeren.

Tenslotte, om Service Discovery uit te schakelen, moeten we de eigenschap instellen spring.cloud.consul.discovery.enabled naar false.

3.1. Services opzoeken

We hebben onze applicatie al geregistreerd in Consul, maar hoe kunnen klanten de service-eindpunten vinden? We hebben een Discovery-klantenservice nodig om een ​​actieve en beschikbare service van Consul te krijgen.

De lente biedt een DiscoveryClient API voor deze, die we kunnen inschakelen met de @EnableDiscoveryClient annotatie:

@SpringBootApplication @EnableDiscoveryClient openbare klasse DiscoveryClientApplication {// ...}

Dan kunnen we de DiscoveryClient bean in onze controller en krijg toegang tot de instanties:

@RestController openbare klasse DiscoveryClientController {@Autowired privé DiscoveryClient discoveryClient; openbaar Optioneel serviceUrl () {return discoveryClient.getInstances ("myApp") .stream () .findFirst () .map (si -> si.getUri ()); }}

Ten slotte zullen we onze applicatie-eindpunten definiëren:

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

De "MyApp / ping" pad is de naam van de Spring-toepassing met het service-eindpunt. Consul zal alle beschikbare applicaties met de naam verstrekken "MyApp".

4. Gezondheidscontrole

Consul controleert periodiek de status van de service-eindpunten.

Standaard, Spring implementeert het gezondheidseindpunt om terug te keren 200 OK als de app actief is. Als we het eindpunt willen aanpassen, moeten we het application.yml:

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

Als gevolg hiervan zal de consul de "/ My-health-check" eindpunt elke 20 seconden.

Laten we onze aangepaste healthcheck-service definiëren om een VERBODEN toestand:

@GetMapping ("/ my-health-check") public ResponseEntity myCustomCheck () {String message = "Mijn gezondheidscontrole testen"; retourneer nieuwe ResponseEntity (bericht, HttpStatus.FORBIDDEN); }

Als we naar de site van de consul gaan, zien we dat onze aanvraag niet werkt. Om dit op te lossen, moet het "/ My-health-check" service moet de HTTP retourneren 200 OK status code.

5. Gedistribueerde configuratie

Deze functie maakt synchronisatie van de configuratie tussen alle services mogelijk. Consul let op eventuele configuratiewijzigingen en activeert vervolgens de update van alle services.

Eerst moeten we de afhankelijkheid spring-cloud-starter-consul-config toevoegen aan onze pom.xml:

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

We moeten ook de instellingen van de consul- en Spring-toepassingsnaam verplaatsen van het application.yml bestand naar het bootstrap.yml bestand dat Spring als eerste laadt.

Vervolgens moeten we Spring Cloud Consul Config inschakelen:

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

Spring Cloud Consul Config zoekt de eigendommen in Consul op "/ Config / myApp". Dus als we een woning hebben gebeld "My.prop", zouden we deze eigenschap moeten aanmaken op de site van de consul-agent.

We kunnen de woning creëren door naar de "SLEUTEL WAARDE" sectie en vervolgens invoeren "/ Config / myApp / my / prop" in de "Sleutel maken" vorm en "Hallo Wereld" als waarde. Klik ten slotte op het "Maken" knop.

Houd er rekening mee dat als we Spring-profielen gebruiken, we de profielen naast de Spring-toepassingsnaam moeten toevoegen. Als we bijvoorbeeld de dev profiel, zal het laatste pad in Consul zijn "/ Config / myApp, dev".

Laten we nu eens kijken hoe onze controller met de geïnjecteerde eigenschappen eruit ziet:

@RestController openbare klasse DistributedPropertiesController {@Value ("$ {my.prop}") Stringwaarde; @Autowired privé MyProperties-eigenschappen; @GetMapping ("/ getConfigFromValue") openbare String getConfigFromValue () {retourwaarde; } @GetMapping ("/ getConfigFromProperty") openbare String getConfigFromProperty () {return properties.getProp (); }}

En de MyProperties klasse:

@RefreshScope @Configuration @ConfigurationProperties ("mijn") openbare klasse MyProperties {private String prop; // standaard getter, setter}

Als we de applicatie uitvoeren, wordt het veld waarde en eigendommen hebben hetzelfde "Hallo Wereld" waarde van consul.

5.1. De configuratie bijwerken

Hoe zit het met het updaten van de configuratie zonder de Spring Boot-applicatie opnieuw te starten?

Als we teruggaan naar de site van de consul-agent en we updaten het pand "/ Config / myApp / my / prop" met een andere waarde zoals "New Hello World", dan het veld waarde zal niet veranderen en het veld eigendommen zal zijn bijgewerkt naar "New Hello World" zoals verwacht.

Dit komt omdat het veld eigendommen is een MyProperties klasse heeft de @RefreshScope annotatie. Alle bonen geannoteerd met de @RefreshScope annotatie wordt vernieuwd na configuratiewijzigingen.

In het echte leven zouden we de eigendommen niet rechtstreeks in Consul moeten hebben, maar we moeten ze permanent ergens opslaan. We kunnen dit doen met behulp van een Config Server.

6. Conclusie

In dit artikel hebben we gezien hoe u onze Spring Boot-applicaties instelt om met Consul te werken voor Service Discovery-doeleinden, de regels voor gezondheidscontrole aanpast en een gedistribueerde configuratie deelt.

We hebben ook een aantal benaderingen geïntroduceerd voor de klanten om een ​​beroep te doen op deze geregistreerde services.

Zoals gewoonlijk zijn bronnen te vinden op GitHub.