Proljetni oblak - Bootstrapping

1. Pregled

Spring Cloud je okvir za izgradnju robusnih aplikacija u oblaku. Okvir olakšava razvoj aplikacija pružajući rješenja za mnoge uobičajene probleme s kojima se suočavaju prilikom prelaska u distribuirano okruženje.

Aplikacije koje se izvode s arhitekturom mikroservisa imaju za cilj pojednostavljenje razvoja, implementacije i održavanja. Razgrađena priroda aplikacije omogućuje programerima da se usredotoče na jedan po jedan problem. Poboljšanja se mogu uvesti bez utjecaja na druge dijelove sustava.

S druge strane, različiti izazovi pojavljuju se kada pristupamo pristupu mikro uslugama:

  • Eksternaliziranje konfiguracije tako da je fleksibilno i ne zahtijeva ponovnu izgradnju usluge pri promjeni
  • Otkrivanje usluge
  • Skrivanje složenosti usluga raspoređenih na različitim hostovima

U ovom ćemo članku izraditi pet mikrousluga: konfiguracijski poslužitelj, otkrivajući poslužitelj, gateway poslužitelj, uslugu knjiga i na kraju uslugu ocjenjivanja. Ovih pet mikrousluga čine solidnu osnovnu aplikaciju za započinjanje razvoja oblaka i rješavanje gore spomenutih izazova.

2. Konfigurirajte poslužitelj

Pri razvoju aplikacije u oblaku jedno je pitanje održavanje i distribucija konfiguracije našim uslugama. Zaista ne želimo trošiti vrijeme na konfiguriranje svakog okruženja prije horizontalnog skaliranja naše usluge ili riskirati narušavanje sigurnosti unošenjem naše konfiguracije u našu aplikaciju.

Da bismo to riješili, objedinit ćemo svu našu konfiguraciju u jedno Git spremište i povezati je s jednom aplikacijom koja upravlja konfiguracijom za sve naše aplikacije. Postavit ćemo vrlo jednostavnu implementaciju.

Da biste saznali više detalja i vidjeli složeniji primjer, pogledajte naš članak Spring Cloud Configuration.

2.1. Postaviti

Dođite do //start.spring.io i odaberite Maven i Spring Boot 2.2.x.

Postavite artefakt na “config. U odjeljku ovisnosti potražite "config server" i dodajte taj modul. Zatim pritisnite generirati gumb i moći ćemo preuzeti zip datoteku s unaprijed konfiguriranim projektom unutar i spremnim za rad.

Alternativno, možemo generirati Proljetni čizme projekt i ručno dodajte neke ovisnosti u POM datoteku.

Ove ovisnosti podijelit će svi projekti:

 org.springframework.boot spring-boot-starter-parent 2.2.6.RELEASE org.springframework.boot spring-boot-starter-test test org.springframework.cloud spring-cloud-ovisnosti Hoxton.SR4 pom import org.springframework.boot dodatak za proljetni boot-maven 

Dodajmo ovisnost za konfiguracijski poslužitelj:

 org.springframework.cloud spring-cloud-config-server 

Za referencu, najnoviju verziju možemo pronaći na Maven Central (Spring-Cloud-zavisnosti, test, config-server).

2.2. Spring Config

Da bismo omogućili konfiguracijski poslužitelj, moramo dodati neke napomene u glavnu klasu aplikacije:

@SpringBootApplication @EnableConfigServer javna klasa ConfigApplication {...}

@EnableConfigServer će našu aplikaciju pretvoriti u konfiguracijski poslužitelj.

2.3. Svojstva

Dodajmo i primjena.svojstva u src / glavni / resursi:

server.port = 8081 spring.application.name = config spring.cloud.config.server.git.uri = datoteka: // $ {user.home} / application-config

Najznačajnija postavka za konfiguracijski poslužitelj je git.uri parametar. Ovo je trenutno postavljeno na relativni put datoteke koji se općenito rješava c: \ Korisnici \ {korisničko ime} \ na Windowsima ili / Korisnici / {korisničko ime} / na * nixu. Ovo svojstvo upućuje na Git spremište u kojem su pohranjene datoteke svojstava za sve ostale aplikacije. Ako je potrebno, može se postaviti na apsolutni put do datoteke.

Savjet: Na Windows računalu predgovorite vrijednost s “file: ///”, na * nixu upotrijebite “file: //”.

2.4. Git spremište

Idite do mape koju je definirao spring.cloud.config.server.git.uri i dodajte mapu aplikacija-konfiguracija. CD u tu mapu i upišite git init. Ovo će inicijalizirati Git spremište gdje možemo pohranjivati ​​datoteke i pratiti njihove promjene.

2.5. Trčanje

Pokrenimo config server i provjerite radi li. Iz vrste naredbenog retka mvn spring-boot: trčanje. Ovo će pokrenuti poslužitelj.

Trebali bismo vidjeti ovaj izlaz koji pokazuje da je poslužitelj pokrenut:

Tomcat pokrenut u luci: 8081 (http)

2.6. Konfiguracija podizanja sustava

Na našim sljedećim poslužiteljima željet ćemo njihova svojstva aplikacija kojima upravlja ovaj konfiguracijski poslužitelj. Da bismo to učinili, zapravo ćemo morati napraviti malo piletine i jaja: Konfigurirajte svojstva u svakoj aplikaciji koja znaju odgovoriti na ovaj poslužitelj.

To je postupak bootstrapa, i svaka od ovih aplikacija imat će datoteku pod nazivom bootstrap.svojstva. Sadržat će svojstva poput primjena.svojstva ali s pomakom:

Roditeljsko proljeće ApplicationContext učitava bootstrap.svojstva prvi. To je presudno kako bi poslužitelj Config mogao početi upravljati svojstvima u primjena.svojstva. Ovo je ovo posebno ApplicationContext koji će također dešifrirati sva šifrirana svojstva aplikacije.

Pametno je držati ove datoteke svojstava različitim.bootstrap.svojstva je za pripremu konfiguracijskog poslužitelja i primjena.svojstva je za svojstva specifična za našu primjenu. Tehnički je, međutim, svojstva aplikacije moguće smjestiti u bootstrap.svojstva.

I na kraju, budući da Config Server upravlja našim svojstvima aplikacije, moglo bi se zapitati zašto imati primjena.svojstva uopće? Odgovor je da ti još uvijek dobro dođu kao zadane vrijednosti koje možda Config Server nema.

3. Otkriće

Sad kad smo se pobrinuli za konfiguraciju, potreban nam je način da se svi naši poslužitelji mogu pronaći jedni druge. Taj ćemo problem riješiti postavljanjem Eureka otkrivanje poslužitelja gore. Budući da bi se naše aplikacije mogle izvoditi na bilo kojoj kombinaciji ip / port, potreban nam je središnji registar adresa koji može poslužiti kao traženje adrese aplikacije.

Kada je osiguran novi poslužitelj, on će komunicirati s poslužiteljem za otkrivanje i registrirati njegovu adresu kako bi drugi mogli komunicirati s njim. Na taj način druge aplikacije mogu trošiti ove podatke dok upućuju zahtjeve.

Da biste saznali više detalja i vidjeli složeniju implementaciju otkrića, pogledajte članak Spring Cloud Eureka.

3.1. Postaviti

Opet ćemo se kretati do start.spring.io. Postavite artefakt na "otkriće". Potražite "eureka server" i dodajte tu ovisnost. Potražite "config client" i dodajte tu ovisnost. Konačno, generirajte projekt.

Alternativno, možemo stvoriti Proljetni čizme projekt, kopirajte sadržaj POM s config poslužitelja i swap u ovim ovisnostima:

 org.springframework.cloud spring-cloud-starter-config org.springframework.cloud spring-cloud-starter-eureka-server 

Za referencu ćemo svežnjeve pronaći na Maven Central (config-client, eureka-server).

3.2. Spring Config

Dodajmo Java config u glavnu klasu:

@SpringBootApplication @EnableEurekaServer javna klasa DiscoveryApplication {...}

@EnableEurekaServer će konfigurirati ovaj poslužitelj kao poslužitelj za otkrivanje pomoću Netflix Eureka. Proljetni čizme automatski će otkriti konfiguracijsku ovisnost o putu puta i potražiti konfiguraciju s konfiguracijskog poslužitelja.

3.3. Svojstva

Sada ćemo dodati dvije datoteke svojstava:

Prvo, dodajemo bootstrap.svojstva u src / glavni / resursi:

spring.cloud.config.name = discovery spring.cloud.config.uri = // localhost: 8081

Ova svojstva omogućit će poslužitelju za otkrivanje da pri pokretanju pita poslužitelj za konfiguriranje.

I drugo, dodajemo otkriće.svojstva u naše spremište Git

spring.application.name = discovery server.port = 8082 eureka.instance.hostname = localhost eureka.client.serviceUrl.defaultZone = // localhost: 8082 / eureka / eureka.client.register-with-eureka = false eureka.client. fetch-registry = false

Naziv datoteke mora odgovarati proljeće.aplikacija.ime imovine.

Uz to, ovom poslužitelju govorimo da radi u zadanoj zoni, što se podudara s postavkom regije klijenta konfiguracije. Također poručujemo poslužitelju da se ne registrira s drugom instancom otkrivanja.

U proizvodnji bismo imali više od jednog koji bi osigurao višak u slučaju kvara i ta bi postavka bila istinita.

Predajmo datoteku u Git spremište. Inače datoteka neće biti otkrivena.

3.4. Dodajte ovisnost na poslužitelj za konfiguriranje

Dodajte ovu ovisnost u POM datoteku konfiguracijskog poslužitelja:

 org.springframework.cloud proljeće-oblak-starter-eureka 

Za referencu, svežanj možemo pronaći na Maven Central (eureka-klijent).

Dodajte ova svojstva u primjena.svojstva uloži u src / glavni / resursi konfiguracijskog poslužitelja:

eureka.client.region = zadani eureka.client.registryFetchIntervalSeconds = 5 eureka.client.serviceUrl.defaultZone = // localhost: 8082 / eureka /

3.5. Trčanje

Pokrenite poslužitelj za otkrivanje pomoću iste naredbe, mvn spring-boot: trčanje. Izlaz iz naredbenog retka trebao bi sadržavati:

Preuzimanje konfiguracije s poslužitelja na: // localhost: 8081 ... Tomcat je pokrenut na lukama: 8082 (http)

Zaustavite i ponovno pokrenite uslugu konfiguriranja. Ako je sve u redu, izlaz bi trebao izgledati ovako:

DiscoveryClient_CONFIG / 10.1.10.235: config: 8081: registracija usluge ... Tomcat pokrenut na lukama: 8081 (http) DiscoveryClient_CONFIG / 10.1.10.235: config: 8081 - status registracije: 204

4. Gateway

Sad kad smo riješili probleme s konfiguracijom i otkrivanjem, i dalje imamo problem s klijentima koji pristupaju svim našim aplikacijama.

Ako sve ostavimo u distribuiranom sustavu, morat ćemo upravljati složenim CORS zaglavljima kako bismo omogućili zahtjeve za međusobno podrijetlo na klijentima. To možemo riješiti stvaranjem gateway poslužitelja. Ovo će djelovati kao obrnuti proxy shuttling zahtjevi od klijenata do naših pozadinskih poslužitelja.

Gateway poslužitelj izvrsna je aplikacija u arhitekturi mikroservisa jer omogućuje da svi odgovori potječu s jednog domaćina. To će eliminirati potrebu za CORS-om i pružiti nam prikladno mjesto za rješavanje uobičajenih problema poput autentifikacije.

4.1. Postaviti

Do sada znamo vježbu. Dođite do //start.spring.io. Postavite artefakt na "gateway". Potražite "zuul" i dodajte tu ovisnost. Potražite "config client" i dodajte tu ovisnost. Potražite "otkriće eureke" i dodajte tu ovisnost. Na kraju, generirajte taj projekt.

Alternativno, mogli bismo stvoriti Proljetni čizme aplikacija sa sljedećim ovisnostima:

 org.springframework.cloud proljeće-oblak-starter-konfiguracija org.springframework.cloud proljeće-oblak-starter-eureka org.springframework.cloud proljeće-oblak-starter-zuul 

Za referencu, svežanj možemo pronaći na Maven Central (config-client, eureka-client, zuul).

4.2. Spring Config

Dodajmo konfiguraciju glavnoj klasi:

@SpringBootApplication @EnableZuulProxy @EnableEurekaClient javna klasa GatewayApplication {...}

4.3. Svojstva

Sada ćemo dodati dvije datoteke svojstava:

bootstrap.svojstva u src / glavni / resursi:

spring.cloud.config.name = gateway spring.cloud.config.discovery.service-id = config spring.cloud.config.discovery.enabled = true eureka.client.serviceUrl.defaultZone = // localhost: 8082 / eureka /

gateway.svojstva u našem Git spremištu

spring.application.name = gateway server.port = 8080 eureka.client.region = zadani eureka.client.registryFetchIntervalSeconds = 5 zuul.routes.book-service.path = / book-service / ** zuul.routes.book-service .sensitive-headers = Set-cookie, autorizacija hystrix.command.book-service.execution.isolation.thread.timeoutInMilliseconds = 600000 zuul.routes.rating-service.path = / rating-service / ** zuul.routes.rating- service.sensitive-headers = Postavi kolačić, autorizacija hystrix.command.rating-service.execution.isolation.thread.timeoutInMilliseconds = 600000 zuul.routes.discovery.path = / discovery / ** zuul.routes.discovery.sensitive-headers = Set-cookie, autorizacija zuul.routes.discovery.url = // localhost: 8082 hystrix.command.discovery.execution.isolation.thread.timeoutInMilliseconds = 600000

The zuul.rute svojstvo nam omogućuje definiranje aplikacije za usmjeravanje određenih zahtjeva na temelju podudaranja URL-a mrava. Naša imovina kaže Zuulu da usmjeri svaki zahtjev koji nam se javi / book-service / ** aplikaciji s proljeće.aplikacija.ime od knjiga-usluga. Zuul će tada potražiti hosta s poslužitelja za otkrivanje pomoću naziva aplikacije i proslijediti zahtjev tom poslužitelju.

Ne zaboravite izvršiti promjene u spremištu!

4.4. Trčanje

Pokrenite programe za konfiguriranje i otkrivanje i pričekajte dok se aplikacija za konfiguriranje ne registrira na poslužitelju za otkrivanje. Ako se već izvode, ne moramo ih ponovno pokrenuti. Kada je to završeno, pokrenite gateway poslužitelj. Poslužitelj pristupnika trebao bi se pokrenuti na priključku 8080 i registrirati se na poslužitelju za otkrivanje. Izlaz s konzole trebao bi sadržavati:

Preuzimanje konfiguracije s poslužitelja na: //10.1.10.235:8081/ ... DiscoveryClient_GATEWAY / 10.1.10.235: gateway: 8080: registracija usluge ... DiscoveryClient_GATEWAY / 10.1.10.235: gateway: 8080 - status registracije: 204 Tomcat je pokrenut na portu (i): 8080 (http)

Jednostavnu grešku je pokrenuti poslužitelj prije nego što se konfiguracijski poslužitelj registrirao kod Eureke. U ovom ćemo slučaju vidjeti zapisnik s ovim izlazom:

Preuzimanje konfiguracije s poslužitelja na: // localhost: 8888

Ovo je zadani URL i priključak za konfiguracijski poslužitelj i ukazuje da naša usluga otkrivanja nije imala adresu kada je podnijet zahtjev za konfiguracijom. Samo pričekajte nekoliko sekundi i pokušajte ponovo, nakon što se konfiguracijski poslužitelj registrira kod Eureke, problem će se riješiti.

5. Usluga knjiga

U arhitekturi mikro usluga možemo slobodno izraditi što više aplikacija kako bismo ispunili poslovni cilj. Inženjeri će često podijeliti svoje usluge prema domeni. Slijedit ćemo ovaj obrazac i stvoriti uslugu knjiga koja će obrađivati ​​sve radnje za knjige u našoj aplikaciji.

5.1. Postaviti

Još jednom. Dođite do //start.spring.io. Postavite artefakt na "book-service". Potražite "web" i dodajte tu ovisnost. Potražite "config client" i dodajte tu ovisnost. Potražite "otkriće eureke" i dodajte tu ovisnost. Generirajte taj projekt.

Alternativno, dodajte ove ovisnosti u projekt:

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

Za referencu, svežanj možemo pronaći na Maven Central (config-client, eureka-client, web).

5.2. Spring Config

Izmijenimo našu glavnu klasu:

@SpringBootApplication @EnableEurekaClient @RestController @RequestMapping ("/ books") javna klasa BookServiceApplication {public static void main (String [] args) {SpringApplication.run (BookServiceApplication.class, args); } privatni popis bookList = Arrays.asList (nova knjiga (1L, "Baeldung ide na tržište", "Tim Schimandle"), nova knjiga (2L, "Baeldung ide u park", "Slavisa")); @GetMapping ("") javni popis findAllBooks () {return bookList; } @GetMapping ("/ {bookId}") javna knjiga findBook (@PathVariable Long bookId) {return bookList.stream (). Filter (b -> b.getId (). Jednako (bookId)). FindFirst (). OrElse (null); }}

Također smo dodali REST kontroler i polje koje je postavila naša datoteka svojstava da bi vratili vrijednost koju ćemo postaviti tijekom konfiguracije.

Dodajmo sada knjigu POJO:

javna klasa Book {private Long id; privatni autor niza; privatni naslov niza; // standardni geteri i postavljači}

5.3. Svojstva

Sada samo trebamo dodati naše dvije datoteke svojstava:

bootstrap.svojstva u src / glavni / resursi:

spring.cloud.config.name = book-service spring.cloud.config.discovery.service-id = config spring.cloud.config.discovery.enabled = true eureka.client.serviceUrl.defaultZone = // localhost: 8082 / eureka /

usluga knjiga.svojstva u našem Git spremištu:

spring.application.name = book-service server.port = 8083 eureka.client.region = zadani eureka.client.registryFetchIntervalSeconds = 5 eureka.client.serviceUrl.defaultZone = // localhost: 8082 / eureka /

Zabilježimo promjene u spremištu.

5.4. Trčanje

Nakon što pokrenu sve ostale aplikacije, možemo pokrenuti uslugu knjiženja. Izlaz konzole trebao bi izgledati ovako:

DiscoveryClient_BOOK-SERVICE / 10.1.10.235: book-service: 8083: registracija usluge ... DiscoveryClient_BOOK-SERVICE / 10.1.10.235: book-service: 8083 - status registracije: 204 Tomcat pokrenut na lukama: 8083 (http)

Nakon što završi, pomoću preglednika možemo pristupiti krajnjoj točki koju smo upravo stvorili. Dođite do // localhost: 8080 / book-service / books i dobit ćemo natrag JSON objekt s dvije knjige koje smo dodali u kontroler out. Primijetite da usluzi knjiga ne pristupamo izravno na portu 8083, već prolazimo kroz gateway poslužitelj.

6. Rejting usluga

Poput naše usluge knjiženja, i naša će usluga ocjenjivanja biti usluga vođena domenom koja će se baviti operacijama povezanim s ocjenama.

6.1. Postaviti

Još jednom. Dođite do //start.spring.io. Postavite artefakt na "rating-service". Potražite "web" i dodajte tu ovisnost. Potražite "config client" i dodajte tu ovisnost. Traziti otkriće eureke i dodajte tu ovisnost. Zatim generirajte taj projekt.

Alternativno, dodajte ove ovisnosti u projekt:

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

Za referencu, svežanj možemo pronaći na Maven Central (config-client, eureka-client, web).

6.2. Spring Config

Izmijenimo našu glavnu klasu:

@SpringBootApplication @EnableEurekaClient @RestController @RequestMapping ("/ ratings") javna klasa RatingServiceApplication {public static void main (String [] args) {SpringApplication.run (RatingServiceApplication.class, args); } privatni popis ratingList = Arrays.asList (nova ocjena (1L, 1L, 2), nova ocjena (2L, 1L, 3), nova ocjena (3L, 2L, 4), nova ocjena (4L, 2L, 5)); @GetMapping ("") javni popis findRatingsByBookId (@RequestParam Long bookId) bookId.equals (0L)? Collections.EMPTY_LIST: ratingList.stream (). Filter (r -> r.getBookId (). Jednako (bookId)). Collect (Collectors.toList ()); @GetMapping ("/ all") javni popis findAllRatings () {return ratingList; }}

Također smo dodali REST kontroler i polje koje je postavila naša datoteka svojstava da bi vratili vrijednost koju ćemo postaviti tijekom konfiguracije.

Dodajmo ocjenu POJO:

ocjena javne klase {private Long id; privatni Long bookId; privatne int zvijezde; // standardni geteri i postavljači}

6.3. Svojstva

Sada samo trebamo dodati naše dvije datoteke svojstava:

bootstrap.svojstva u src / glavni / resursi:

spring.cloud.config.name = rating-service spring.cloud.config.discovery.service-id = config spring.cloud.config.discovery.enabled = true eureka.client.serviceUrl.defaultZone = // localhost: 8082 / eureka /

rating-service.svojstva u našem Git spremištu:

spring.application.name = rating-service server.port = 8084 eureka.client.region = zadani eureka.client.registryFetchIntervalSeconds = 5 eureka.client.serviceUrl.defaultZone = // localhost: 8082 / eureka /

Zabilježimo promjene u spremištu.

6.4. Trčanje

Nakon što su svi ostali programi započeli, možemo pokrenuti uslugu ocjenjivanja. Izlaz konzole trebao bi izgledati ovako:

DiscoveryClient_RATING-SERVICE / 10.1.10.235: rating-service: 8083: registracija usluge ... DiscoveryClient_RATING-SERVICE / 10.1.10.235: rating-service: 8083 - status registracije: 204 Tomcat pokrenut na lukama: 8084 (http)

Nakon što završi, pomoću preglednika možemo pristupiti krajnjoj točki koju smo upravo stvorili. Dođite do // localhost: 8080 / rating-service / ratings / all i vraćamo JSON koji sadrži sve naše ocjene. Primijetite da usluzi ocjenjivanja ne pristupamo izravno na portu 8084, već prolazimo kroz gateway poslužitelj.

7. Zaključak

Sada smo u mogućnosti povezati razne dijelove Spring Cloud-a u funkcionalnu aplikaciju mikroservisa. To čini osnovu koju možemo koristiti za započinjanje izgradnje složenijih aplikacija.

Kao i uvijek ovaj izvorni kod možemo pronaći na GitHubu.


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