En rask guide til vårskolekonsul

1. Oversikt

Spring Cloud Consul-prosjektet gir enkel integrering med Consul for Spring Boot-applikasjoner.

Consul er et verktøy som gir komponenter for å løse noen av de vanligste utfordringene i en mikrotjenestearkitektur:

  • Service Discovery - for å automatisk registrere og avregistrere nettverksstedene for tjenesteinstanser
  • Health Checking - for å oppdage når en tjenesteinstans er oppe og går
  • Distribuert konfigurasjon - for å sikre at alle tjenesteforekomster bruker samme konfigurasjon

I denne artikkelen ser vi hvordan vi kan konfigurere et Spring Boot-program for å bruke disse funksjonene.

2. Forutsetninger

Til å begynne med anbefales det å ta en rask titt på Consul og alle funksjonene.

I denne artikkelen skal vi bruke en konsulagent som kjører videre lokal vert: 8500. For mer informasjon om hvordan du installerer Consul og kjører en agent, se denne lenken.

Først må vi legge til vår-sky-start-konsul-all avhengighet til vår pom.xml:

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

3. Service Discovery

La oss skrive vår første Spring Boot-applikasjon og koble oss til den løpende konsulagenten:

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

Som standard vil Spring Boot prøve å koble til konsulagenten kl lokal vert: 8500. For å bruke andre innstillinger, må vi oppdatere application.yml fil:

vår: sky: konsul: vert: localhost port: 8500

Så hvis vi besøker nettstedet til konsulagenten i nettleseren kl // lokal vert: 8500, vi ser at søknaden vår ble riktig registrert i Consul med identifikatoren fra “$ {Spring.application.name}: $ {profiler atskilt med komma}: $ {server.port}”.

For å tilpasse denne identifikatoren, må vi oppdatere eiendommen spring.cloud.discovery.instanceId med et annet uttrykk:

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

Hvis vi kjører applikasjonen igjen, ser vi at den ble registrert ved hjelp av identifikatoren “MyApp” pluss en tilfeldig verdi. Vi trenger dette for å kjøre flere forekomster av applikasjonen vår på vår lokale maskin.

Endelig, for å deaktivere Service Discovery, må vi angi eiendommen spring.cloud.consul.discovery.enabled til falsk.

3.1. Slå opp tjenester

Vi har allerede søknaden vår registrert i Consul, men hvordan kan klienter finne endepunktene for tjenestene? Vi trenger en discovery-klienttjeneste for å få en løpende og tilgjengelig tjeneste fra Consul.

Våren gir en API for DiscoveryClient for dette, som vi kan aktivere med @EnableDiscoveryClient kommentar:

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

Så kan vi injisere DiscoveryClient bønne inn i kontrolleren vår og få tilgang til forekomster:

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

Til slutt vil vi definere endepunktene for søknaden:

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

De “MyApp / ping” banen er vårens applikasjonsnavn med tjenestens endepunkt. Konsul vil tilby alle tilgjengelige applikasjoner “MyApp”.

4. Helsekontroll

Konsul sjekker helsen til tjenestens endepunkter med jevne mellomrom.

Som standard, Våren implementerer helseendepunktet for å komme tilbake 200 OK hvis appen er oppe. Hvis vi vil tilpasse sluttpunktet, må vi oppdatere application.yml:

vår: sky: konsul: discovery: healthCheckPath: / my-health-check healthCheckInterval: 20s

Som et resultat vil konsul avstemme “/ My-health-check” sluttpunkt hvert 20. sekund.

La oss definere vår tilpassede helsetjekktjeneste for å returnere en FORBUDT status:

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

Hvis vi går til nettstedet for konsulagenten, ser vi at søknaden vår mislykkes. For å fikse dette, “/ My-health-check” tjenesten skal returnere HTTP 200 OK statuskode.

5. Distribuert konfigurasjon

Denne funksjonen tillater synkronisering av konfigurasjonen mellom alle tjenestene. Konsul vil se etter eventuelle konfigurasjonsendringer og deretter utløse oppdateringen av alle tjenestene.

Først må vi legge til vår-sky-start-konsul-konfigurasjonsavhengighet til vår pom.xml:

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

Vi må også flytte innstillingene for Consul og Spring-applikasjonsnavnet fra application.yml filen til bootstrap.yml fil som våren laster først.

Deretter må vi aktivere Spring Cloud Consul Config:

vår: applikasjon: navn: myApp sky: konsul: vert: localhost port: 8500 config: aktivert: true

Spring Cloud Consul Config vil se etter eiendommene i Consul kl “/ Config / myApp”. Så hvis vi har en eiendom som heter “My.prop”, må vi opprette denne egenskapen på Consul-agentområdet.

Vi kan opprette eiendommen ved å gå til “NØKKEL / VERDI” seksjon, deretter inn “/ Config / myApp / my / prop” i “Opprett nøkkel” form og "Hei Verden" som verdi. Til slutt klikker du på "Skape" knapp.

Husk at hvis vi bruker Spring-profiler, må vi legge til profilene ved siden av Spring-applikasjonsnavnet. For eksempel hvis vi bruker dev profil, vil den endelige banen i konsul være “/ Config / myApp, dev”.

La oss nå se hvordan kontrolleren vår med de injiserte egenskapene ser ut:

@RestController offentlig klasse DistributedPropertiesController {@Value ("$ {my.prop}") Strengverdi; @Autowired private MyProperties egenskaper; @GetMapping ("/ getConfigFromValue") offentlig streng getConfigFromValue () {returverdi; } @GetMapping ("/ getConfigFromProperty") offentlig streng getConfigFromProperty () {return properties.getProp (); }}

Og MyProperties klasse:

@RefreshScope @Configuration @ConfigurationProperties ("min") offentlig klasse MyProperties {private String prop; // standard getter, setter}

Hvis vi kjører applikasjonen, feltet verdi og eiendommer har det samme "Hei Verden" verdi fra konsul.

5.1. Oppdaterer konfigurasjonen

Hva med å oppdatere konfigurasjonen uten å starte Spring Boot-applikasjonen på nytt?

Hvis vi går tilbake til Consul-agentområdet og vi oppdaterer eiendommen “/ Config / myApp / my / prop” med en annen verdi som “Ny Hello World”, deretter feltet verdi vil ikke endre seg og feltet eiendommer vil ha blitt oppdatert til “Ny Hello World” som forventet.

Dette er fordi feltet eiendommer er en MyProperties klassen har @RefreshScope kommentar. Alle bønner kommentert med @RefreshScope merknader vil bli oppdatert etter konfigurasjonsendringer.

I det virkelige liv skal vi ikke ha eiendommene direkte i konsul, men vi bør lagre dem vedvarende et sted. Vi kan gjøre dette ved hjelp av en Config Server.

6. Konklusjon

I denne artikkelen har vi sett hvordan vi konfigurerer Spring Boot-applikasjonene for å fungere med Consul for Service Discovery, tilpasse helsekontrollreglene og dele en distribuert konfigurasjon.

Vi har også introdusert en rekke tilnærminger for kundene å påberope seg disse registrerte tjenestene.

Som vanlig kan du finne kilder på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found