Uvod u Spring Cloud Netflix - Eureka

1. Pregled

U ovom uputstvu ćemo vam predstaviti usluga na strani klijenta otkriće putem “Proljetni oblak Netflix Eureka“.

Otkrivanje usluge na strani klijenta omogućuje uslugama da se međusobno pronađu i komuniciraju bez čvrsto kodiranog imena hosta i porta. Jedina "fiksna točka" u takvoj arhitekturi sastoji se od registar usluga kod kojih se svaka služba mora registrirati.

Nedostatak je što svi klijenti moraju implementirati određenu logiku da bi komunicirali s ovom fiksnom točkom. To podrazumijeva dodatno mrežno kružno putovanje prije stvarnog zahtjeva.

Uz Netflix Eureka svaki klijent može istodobno djelovati kao poslužitelj, replicirajući svoj status na povezani peer. Drugim riječima, klijent dohvaća popis svih povezanih vršnjaka a registar usluga i upućuje sve daljnje zahtjeve bilo kojim drugim uslugama putem algoritma za uravnoteženje opterećenja.

Da bi bili informirani o prisutnosti klijenta, oni moraju poslati signal otkucaja srca u registar.

Da bismo postigli cilj ovog opisa, primijenit ćemo tri mikrousluge:

  • a registar usluga (Eureka poslužitelj),
  • a ODMOR služba koja se sama registrira u registru (Klijent Eureke) i
  • web aplikacija koja troši ODMOR usluga kao klijent koji je svjestan registra (Proljetni oblak Netflix Pretvarani klijent).

2. Eureka poslužitelj

Provedba a Eureka poslužitelj za registar usluga jednostavno je kao:

  1. dodavanje spring-cloud-starter-netflix-eureka-server do ovisnosti
  2. omogućiti Eureka Server u a @SpringBootApplication bilježeći ga sa @EnableEurekaServer
  3. konfigurirati neka svojstva

Ali učinit ćemo to korak po korak.

Prvo ćemo stvoriti novi Maven projekt i staviti ovisnosti u njega. Morate primijetiti da uvozimo proljeće-oblak-starter-roditelj svim projektima opisanim u ovom vodiču:

 org.springframework.cloud spring-cloud-starter-netflix-eureka-server org.springframework.cloud spring-cloud-starter-parent Greenwich.RELEASE pom import 

Napomena: najnovija izdanja Spring Cloud-a možemo provjeriti u dokumentaciji Spring's Projects.

Dalje kreiramo glavnu klasu aplikacije:

@SpringBootApplication @EnableEurekaServer javna klasa EurekaServerApplication {javna statička void glavna (String [] args) {SpringApplication.run (EurekaServerApplication.class, args); }}

Konačno, konfiguriramo svojstva u YAML format; tako an primjena.iml bit će naša konfiguracijska datoteka:

poslužitelj: port: 8761 eureka: klijent: registerWithEureka: false fetchRegistry: false

Ovdje konfiguriramo priključak aplikacije - 8761 je zadani za Eureka poslužitelji. Kažemo ugrađenom Klijent Eureke da se ne registriramo kod sebe, jer bi naša aplikacija trebala djelovati kao poslužitelj.

Sada ćemo usmeriti naš preglednik na // localhost: 8761 da bi pogledao Eureka nadzornoj ploči, gdje ćemo kasnije pregledavati registrirane instance.

Trenutno vidimo osnovne pokazatelje kao što su pokazatelji statusa i zdravlja.

3. Eureka klijent

Za @SpringBootApplication da bismo bili svjesni otkrića, moramo ih uključiti Klijent proljetnog otkrića (na primjer proljeće-oblak-starter-netflix-eureka-klijent) u naš razredna staza.

Tada moramo označiti a @Konfiguracija s bilo kojim @EnableDiscoveryClient ili @EnableEurekaClient - imajte na umu da je ova napomena neobavezna ako imamo proljeće-oblak-starter-netflix-eureka-klijent ovisnost o putu predavanja.

Ovaj drugi govori Proljetni čizme izričito koristiti Spring Netflix Eureka za otkrivanje usluga. Da bismo našu klijentsku aplikaciju ispunili nekim životnim vijekom, uključit ćemo i proljeće-boot-starter-web paket u pom.xml i provesti a ODMOR kontrolor.

Ali prvo ćemo dodati ovisnosti. Opet, možemo to prepustiti proljeće-oblak-starter-roditelj ovisnost kako bismo pronašli verzije artefakata za nas:

 org.springframework.cloud spring-cloud-starter-netflix-eureka-starter org.springframework.boot spring-boot-starter-web 

Ovdje ćemo implementirati glavnu klasu aplikacije:

@SpringBootApplication @RestController javna klasa EurekaClientApplication implementira GreetingController {@Autowired @Lazy private EurekaClient eurekaClient; @Value ("$ {spring.application.name}") private String appName; javna statička void glavna (String [] args) {SpringApplication.run (EurekaClientApplication.class, args); } @Override public String pozdrav () {return String.format ("Pozdrav iz '% s'!", EurekaClient.getApplication (appName) .getName ()); }}

I GreetingController sučelje:

javno sučelje GreetingController {@RequestMapping ("/ pozdrav") Pozdrav u nizu (); }

Ovdje bismo, umjesto sučelja, mogli jednostavno deklarirati mapiranje unutar EurekaClientApplication razred. Sučelje može biti korisno ako ga želimo dijeliti između poslužitelja i klijenta.

Dalje, moramo postaviti primjena.iml s konfiguriranim Proljeće naziv aplikacije za jedinstveno prepoznavanje našeg klijenta na popisu registriranih aplikacija.

Možemo dopustiti Proljetni čizme odaberite slučajni port za nas jer kasnije pristupamo ovoj usluzi s njezinim imenom.

Na kraju, moramo reći našem klijentu gdje mora pronaći registar:

spring: application: name: spring-cloud-eureka-client server: port: 0 eureka: client: serviceUrl: defaultZone: $ {EUREKA_URI: // localhost: 8761 / eureka} instance: preferIpAddress: true

Kada smo odlučili postaviti svog Eureka klijenta na ovaj način, imali smo na umu da bi ova vrsta usluge kasnije trebala biti lako skalabilna.

Sada ćemo pokrenuti klijenta i usmeriti naš preglednik na // localhost: 8761 opet, da biste vidjeli svoj status registracije na Eureka nadzornoj ploči. Korištenjem Nadzorne ploče možemo izvršiti daljnju konfiguraciju npr. povežite početnu stranicu registriranog klijenta s Nadzornom pločom u administrativne svrhe. Međutim, opcije konfiguracije izvan su dosega ovog članka.

4. Lažni klijent

Da bismo dovršili naš projekt s tri ovisna mikro servisa, sada ćemo implementirati a ODMOR-konzumiranje web aplikacija pomoću Proljetni Netflix-ov klijent za pretvaranje.

Razmislite Pretvaranje kao svjestan otkrića ProljećeRestTemplate pomoću sučelja za komunikaciju s krajnjim točkama. Ova sučelja automatski će se implementirati tijekom izvođenja i umjesto URL-ovi usluga, koristi se imena usluga.

Bez Pretvaranje morali bismo automatski spojiti instancu EurekaClient u naš kontroler pomoću kojeg bismo mogli dobiti uslužne informacije naziv usluge kao an Primjena objekt.

Koristili bismo ovo Primjena da biste dobili popis svih primjeraka ove usluge, odaberite prikladnu i upotrijebite ovu InstanceInfo da biste dobili ime hosta i port. Uz to bismo mogli uputiti standardni zahtjev s bilo kojim http klijent.

Na primjer:

@Autowired privatni EurekaClient eurekaClient; javna void doRequest () {Application application = eurekaClient.getApplication ("spring-cloud-eureka-client"); InstanceInfo instanceInfo = application.getInstance (). Get (0); Niz ime hosta = instanceInfo.getHostName (); int port = instanceInfo.getPort (); // ...}

A RestTemplate također se može koristiti za pristup Eureka klijentske usluge po imenu, ali ova je tema izvan ovog pisanja.

Za postavljanje našeg Klijent koji glumi projektu, dodat ćemo mu sljedeće četiri ovisnosti pom.xml:

 org.springframework.cloud spring-cloud-starter-feign org.springframework.cloud spring-cloud-starter-netflix-eureka-client org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter -timeleaf 

The Klijent koji glumi nalazi se u proljeće-oblak-starter-finga paket. Da bismo to omogućili, moramo označiti a @Konfiguracija s @EnableFeignClients. Da bismo ga koristili, jednostavno bilježimo sučelje s @FeignClient ("naziv usluge") i automatski ga spojite u kontroler.

Dobra metoda za stvaranje takvih PretvaranjeKlijenti je stvaranje sučelja s @RequestMapping anotirane metode i stavite ih u zasebni modul. Na taj ih način mogu dijeliti poslužitelj i klijent. Na strani poslužitelja možete ih implementirati kao @Controller, a na strani klijenta mogu se proširiti i označiti kao @FeignClient.

Nadalje, paket-proljeće-oblak-starter-eureka mora biti uključen u projekt i omogućen označavanjem glavne klase aplikacije s @EnableEurekaClient.

The proljeće-boot-starter-web i opruga-čizma-starter-majčina dušica ovisnosti koriste se za prikaz pogleda koji sadrži dohvaćene podatke iz našeg ODMOR servis.

Ovo će biti naše Klijent koji glumi sučelje:

@FeignClient ("spring-cloud-eureka-client") javno sučelje GreetingClient {@RequestMapping ("/ pozdrav") String pozdrav (); }

Ovdje ćemo implementirati glavnu klasu aplikacija koja istovremeno djeluje kao kontroler:

@SpringBootApplication @EnableFeignClients @Controller javna klasa FeignClientApplication {@Autowired privatni GreetingClient pozdravClient; javna statička void glavna (String [] args) {SpringApplication.run (FeignClientApplication.class, args); } @RequestMapping ("/ get-pozdrav") javni pozdrav niza (model modela) {model.addAttribute ("pozdrav", pozdravKlijent.greeting ()); povratak "pozdrav-pogled"; }} 

Ovo će biti HTML predložak za naš pogled:

   Stranica s pozdravom 

Barem primjena.iml konfiguracijska datoteka gotovo je ista kao u prethodnom koraku:

spring: application: name: spring-cloud-eureka-feign-client server: port: 8080 eureka: client: serviceUrl: defaultZone: $ {EUREKA_URI: // localhost: 8761 / eureka}

Sada možemo graditi i pokretati ovu uslugu. Napokon ćemo uputiti naš preglednik na // localhost: 8080 / get-pozdrav i trebao bi prikazivati ​​nešto poput sljedećeg:

Pozdrav iz PROLJETNI-OBLAK-EUREKA-KLIJENT!

5. ‘TransportException: Nije moguće izvršiti zahtjev ni na jednom poznatom poslužitelju '

Tijekom izvođenja Eureka poslužitelja često nailazimo na iznimke poput:

com.netflix.discovery.shared.transport.TransportException: Nije moguće izvršiti zahtjev ni na jednom poznatom poslužitelju

U osnovi, to se događa zbog pogrešne konfiguracije u primjena.svojstva ili primjena.iml. Eureka nudi dva svojstva za klijenta koja se mogu konfigurirati.

  • registerWithEureka: Ako ovo svojstvo napravimo kao pravi onda će se dok poslužitelj pokrene ugrađeni klijent pokušati registrirati na Eureka poslužitelju.
  • fetchRegistry: Ugrađeni klijent pokušat će dohvatiti Eureka registar ako ovo svojstvo konfiguriramo kao istinito.

Sada kada pokrenemo Eureka poslužitelj, ne želimo registrirati ugrađeni klijent da se konfigurira s poslužiteljem.

Označimo li gore navedena svojstva kao pravi (ili ih nemojte konfigurirati onakvima kakvi jesu pravi po defaultu) tijekom pokretanja poslužitelja, ugrađeni klijent pokušava se registrirati s Eureka poslužitelju i također pokušava dohvatiti registar koji još nije dostupan. Kao rezultat, dobivamo TransportException.

Dakle, ta svojstva nikada ne bismo trebali konfigurirati kao pravi u Eureka poslužiteljske aplikacije. Ispravne postavke koje treba unijeti primjena.iml dati su u nastavku:

eureka: client: registerWithEureka: false fetchRegistry: false

6. Zaključak

Kao što smo vidjeli, sada smo u mogućnosti implementirati registar usluga pomoću Proljetni Netflix Eureka poslužitelj i registrirajte neke Klijenti Eureke s tim.

Jer naša Klijent Eureke od koraka 3 sluša na slučajno odabranom priključku, ne zna svoje mjesto bez podataka iz registra. S Klijent koji glumi i naš registar možemo pronaći i konzumirati ODMOR usluge, čak i kada se mjesto promijeni.

Napokon, imamo veliku sliku korištenja otkrivanja usluga u arhitekturi mikroservisa.

Kao i obično, pronaći ćete izvore na GitHubu, koji također uključuje skup Lučki radnik- povezane datoteke za upotrebu s docker-compose za stvaranje kontejnera iz našeg projekta.