Proljetni pokretač čizme

1. Pregled

U ovom članku uvodimo proljetni pokretač pokretača. Prvo ćemo pokriti osnove, a zatim detaljno razgovarati o tome što je dostupno u Spring Boot 2.x vs 1.x.

Naučit ćemo kako koristiti, konfigurirati i proširiti ovaj alat za praćenje u Spring Boot 2.x i WebFlux, iskorištavajući model reaktivnog programiranja. Zatim ćemo razgovarati o tome kako učiniti isto koristeći Boot 1.x.

Spring Boot Actuator dostupan je od travnja 2014, zajedno s prvim izdanjem Spring Boot.

Objavljivanjem Spring Boot 2, Actuator je redizajniran i dodane su nove uzbudljive krajnje točke.

Ovaj smo vodič podijelili u tri glavna odjeljka:

  • Što je aktuator?
  • Pokretač opružne čizme 2.x
  • Pokretač opružnog prtljažnika 1.x.

2. Što je aktuator?

U osnovi, Actuator u našu aplikaciju donosi značajke spremne za proizvodnju.

Nadgledanje naše aplikacije, prikupljanje mjernih podataka, razumijevanje prometa ili stanje naše baze podataka postaju trivijalni s ovom ovisnošću.

Glavna prednost ove knjižnice je u tome što možemo dobiti alate produkcijske kvalitete, a da te značajke zapravo ne moramo implementirati sami.

Pogon se uglavnom koristi za izložiti operativne informacije o pokrenutoj aplikaciji - zdravlje, mjerni podaci, informacije, dump, env itd. Koristi HTTP krajnje točke ili JMX grah kako bi nam omogućio interakciju s njima.

Jednom kada je ova ovisnost o putu predavanja, dostupno nam je nekoliko krajnjih točaka. Kao i kod većine Spring modula, lako ga možemo konfigurirati ili proširiti na mnogo načina.

2.1. Početak rada

Da bismo omogućili Spring Boot Actuator, samo moramo dodati pokretački pogon opruge ovisnost o našem upravitelju paketa.

U Mavenu:

 org.springframework.boot opruga-pokretač-pokretač-pokretač 

Imajte na umu da ovo ostaje na snazi ​​bez obzira na verziju pokretanja, jer su verzije navedene u Provjeri proljetnog pokretanja (BOM).

3. Proljetni pogon 2.x aktuator

U 2.xu Actuator zadržava svoju temeljnu namjeru, ali pojednostavljuje svoj model, proširuje svoje mogućnosti i uključuje bolje zadane postavke.

Prvo, ova verzija postaje tehnološki agnostična. Također pojednostavljuje svoj sigurnosni model spajanjem s aplikacijskim.

Među raznim promjenama važno je imati na umu da se neke od njih lome. To uključuje HTTP zahtjeve i odgovore kao i Java API-je.

I na kraju, najnovija verzija sada podržava CRUD model za razliku od starog modela za čitanje / pisanje.

3.1. Tehnološka podrška

Sa svojom drugom glavnom verzijom, Actuator je sada tehnološki agnostičan, dok je u 1.x bio vezan za MVC, dakle za API servlet.

U 2.x, Actuator definira svoj model kao priključni i proširivi, a da se za to ne oslanja na MVC.

Stoga smo s ovim novim modelom u mogućnosti iskoristiti prednosti MVC-a i WebFluxa kao temeljne web tehnologije.

Štoviše, nadolazeće tehnologije mogle bi se dodati primjenom pravih prilagodnika.

Napokon, JMX ostaje podržan za izlaganje krajnjih točaka bez ikakvog dodatnog koda.

3.2. Važne promjene

Za razliku od prethodnih verzija, Actuator dolazi s onemogućenom većinom krajnjih točaka.

Dakle, jedine dvije dostupne prema zadanim postavkama su /zdravlje i / info.

Ako ih želimo omogućiti, mogli bismo postaviti management.endpoints.web.exposure.include = *. Alternativno, možemo navesti krajnje točke koje bi trebale biti omogućene.

Actuator sada dijeli sigurnosnu konfiguraciju s uobičajenim sigurnosnim pravilima aplikacije, tako da je sigurnosni model dramatično pojednostavljen.

Stoga, da bismo podesili sigurnosna pravila Actuatora, mogli bismo samo dodati unos za / aktuator / **:

@Bean public SecurityWebFilterChain securityWebFilterChain (ServerHttpSecurity http) {return http.authorizeExchange () .pathMatchers ("/ aktuator / **"). AllowAll () .anyExchange (). Authenticated () .and (). Build (); }

Dodatne detalje možemo pronaći na potpuno novim službenim dokumentima Actuatora.

Također, prema zadanim postavkama, sve krajnje točke aktuatora sada su postavljene pod / aktuator staza.

Kao i u prethodnoj verziji, ovu stazu možemo prilagoditi pomoću novog svojstva upravljanje.endpoints.web.base-path.

3.3. Unaprijed definirane krajnje točke

Pogledajmo neke dostupne krajnje točke, od kojih je većina već bila dostupna u 1.x.

Također, neke su krajnje točke dodane, neke uklonjene, a neke su restrukturirane:

  • / auditevents navodi događaje povezane s revizijom sigurnosti, poput prijave / odjave korisnika. Također, među ostalim poljima možemo filtrirati prema principu ili tipu.
  • / grah vraća sve dostupne mahune u našem BeanFactory. Za razliku od / auditevents, ne podržava filtriranje.
  • /Uvjeti, prethodno znan kao /autokonfiguracija, gradi izvještaj o uvjetima oko autokonfiguracije.
  • / configprops omogućuje nam dohvatiti sve @ConfigurationProperties grah.
  • / env vraća trenutna svojstva okoline. Uz to možemo dohvatiti pojedina svojstva.
  • / prelet pruža detalje o našim migracijama baze podataka Flyway.
  • /zdravlje sažima zdravstveni status naše prijave.
  • / heapdump gradi i vraća deponij hrpe iz JVM-a koji koristi naša aplikacija.
  • / info vraća opće podatke. To mogu biti prilagođeni podaci, podaci o gradnji ili detalji o najnovijem urezivanju.
  • / liquibase ponaša se kao / prelet ali za Liquibase.
  • / logfile vraća uobičajene zapisnike aplikacija.
  • / drvosječe omogućuje nam postavljanje upita i izmjenu razine evidentiranja naše aplikacije.
  • /metrika detalji metrike naše aplikacije. To može uključivati ​​generičke mjerne podatke kao i prilagođene.
  • /Prometej vraća metrike poput prethodne, ali formatirane za rad s Prometheus poslužiteljem.
  • / raspored zadataka pruža detalje o svakom planiranom zadatku u našoj aplikaciji.
  • / sjednice navodi HTTP sesije s obzirom na to da koristimo Spring Session.
  • /ugasiti vrši graciozno isključivanje aplikacije.
  • / odvod niti izbacuje informacije o niti osnovnog JVM-a.

3.4. Hipermedija za krajnje točke aktuatora

Spring Boot dodaje krajnju točku otkrivanja koja vraća veze na sve dostupne krajnje točke aktuatora. To će olakšati otkrivanje krajnjih točaka aktuatora i njihovih odgovarajućih URL-ova.

Prema zadanim postavkama, ovoj je završnoj točki otkrića moguće pristupiti putem / aktuator krajnja točka.

Stoga, ako pošaljemo a DOBITI zahtjev na ovaj URL, vratit će se veze aktuatora za različite krajnje točke:

{"_links": {"self": {"href": "// localhost: 8080 / actuator", "templated": false}, "features-arg0": {"href": "// localhost: 8080 / aktuator / features / {arg0} "," templated ": true}," features ": {" href ":" // localhost: 8080 / actuator / features "," templated ": false}," grah ": {" href ":" // localhost: 8080 / aktuator / beans "," templated ": false}," caches-cache ": {" href ":" // localhost: 8080 / actuator / caches / {cache} "," predložak ": true}, // skraćen}

Kao što je gore prikazano, / aktuator krajnja točka izvještava o svim raspoloživim krajnjim točkama aktuatora pod _veze polje.

Štoviše, ako konfiguriramo prilagođeni osnovni put upravljanja, tada bismo ga trebali koristiti kao URL otkrića.

Na primjer, ako postavimo upravljanje.endpoints.web.base-path do / mgmt, tada bismo trebali poslati zahtjev na / mgmt krajnju točku da biste vidjeli popis veza.

Sasvim zanimljivo, kada je postavljen osnovni put upravljanja /, krajnja točka otkrivanja je onemogućena kako bi se spriječila mogućnost sukoba s drugim preslikavanjima.

3.5. Pokazatelji zdravlja

Baš kao i u prethodnoj verziji, i mi lako možemo dodati prilagođene pokazatelje. Suprotno od ostalih API-ja, apstrakcije za stvaranje prilagođenih zdravstvenih krajnjih točaka ostaju nepromijenjene. Međutim, novo sučelje, ReactiveHealthIndicator, dodan je za provođenje reaktivnih zdravstvenih provjera.

Pogledajmo jednostavnu prilagođenu provjeru reaktivnog zdravlja:

@Component javna klasa DownstreamServiceHealthIndicator implementira ReactiveHealthIndicator {@Override public Mono health () {return checkDownstreamServiceHealth (). OnErrorResume (ex -> Mono.just (new Health.Builder (). Down (ex) .build ())); } private Mono checkDownstreamServiceHealth () {// mogli bismo koristiti WebClient za provjeru stanja reaktivnog povratka Mono.just (new Health.Builder (). up (). build ()); }}

Zgodna je značajka zdravstvenih pokazatelja to što ih možemo agregirati kao dio hijerarhije.

Dakle, slijedeći prethodni primjer, mogli bismo sve nizvodne usluge grupirati pod nizvodno-usluge kategorija. Ova bi kategorija bila zdrava sve dok je svako ugniježđeno servis bio dostupan.

Pogledajte naš članak o zdravstvenim pokazateljima za detaljniji uvid.

3.6. Zdravstvene grupe

Od Spring Boota 2.2, možemo organizirati zdravstvene pokazatelje u skupine i primijeniti istu konfiguraciju na sve članove grupe.

Na primjer, možemo stvoriti zdravstvenu skupinu s imenom prilagođen dodavanjem ovog na naš primjena.svojstva:

management.endpoint.health.group.custom.include = diskSpace, ping

Ovim putem, prilagođen grupa sadrži prostor na disku i ping pokazatelji zdravlja.

Sada ako pozovemo / aktuator / zdravlje krajnja točka, rekao bi nam o novoj zdravstvenoj skupini u JSON odgovoru:

{"status": "UP", "groups": ["custom"]}

Kod zdravstvenih skupina možemo vidjeti agregirane rezultate nekoliko zdravstvenih pokazatelja.

U ovom slučaju, ako pošaljemo zahtjev na / aktuator / zdravlje / običaj, zatim:

{"status": "UP"}

Možemo konfigurirati grupu da prikazuje više detalja putem primjena.svojstva:

management.endpoint.health.group.custom.show-components = uvijek management.endpoint.health.group.custom.show-details = uvijek

Sada, ako isti zahtjev pošaljemo na / aktuator / zdravlje / običaj, vidjet ćemo više detalja:

{"status": "UP", "components": {"diskSpace": {"status": "UP", "details": {"total": 499963170816, "free": 91300069376, "prag": 10485760} }, "ping": {"status": "UP"}}}

Također je moguće prikazati ove detalje samo ovlaštenim korisnicima:

management.endpoint.health.group.custom.show-components = kada_autorizirano management.endpoint.health.group.custom.show-details = kada_autorizirano

Možemo imati i prilagođeno mapiranje statusa.

Na primjer, umjesto odgovora HTTP 200 OK, može vratiti statusni kôd 207:

upravljanje.endpoint.health.group.custom.status.http-mapping.up = 207

Ovdje poručujemo Spring Boot-u da vrati 207 HTTP statusni kod ako prilagođen status grupe je GORE.

3.7. Metrika u proljetnom pokretanju 2

U Spring Boot 2.0, interni mjerni podaci zamijenjeni su podrškom za Micrometer, pa možemo očekivati ​​lomljive promjene. Ako je naša aplikacija koristila metričke usluge poput GaugeService ili CounterService, više neće biti dostupni.

Umjesto toga, očekuje se izravna interakcija s Micrometrom. U Spring Boot 2.0 dobit ćemo grah tipa MeterRegistry automatski konfiguriran za nas.

Nadalje, Micrometer je sada dio ovisnosti aktuatora, pa bismo trebali krenuti sve dok je ovisnost aktuatora u stazi klase.

Štoviše, dobit ćemo potpuno novi odgovor od /metrika krajnja točka:

{"imena": ["jvm.gc.pause", "jvm.buffer.memory.used", "jvm.memory.used", "jvm.buffer.count", // ...]}

Kao što vidimo, nema stvarnih mjernih podataka kao što smo dobili u 1.x.

Da bismo dobili stvarnu vrijednost određenog mjernog podatka, sada možemo prijeći na željeni mjerni podatak, npr. /actuator/metrics/jvm.gc.pause, i dobiti detaljan odgovor:

{"name": "jvm.gc.pause", "values": [{"statistic": "Count", "value": 3.0}, {"statistic": "TotalTime", "value": 7.9E7} , {"statistic": "Max", "value": 7.9E7}], "availableTags": [{"tag": "uzrok", "values": ["Prag metapodataka GC", "Neuspjeh dodjele"]} , {"tag": "action", "values": ["kraj mola GC", "kraj glavnog GC"]}]}

Sada su mjerni podaci puno temeljitiji, uključujući ne samo različite vrijednosti, već i neke povezane metapodatke.

3.8. Prilagođavanje / info Krajnja točka

The / info krajnja točka ostaje nepromijenjena. Kao i prije, možemo dodati git detalje koristeći odgovarajuću ovisnost o Mavenu ili Gradleu:

 pl.project13.maven git-commit-id-plugin 

Također, mogli bismo uključiti i podatke o gradnji, uključujući ime, grupu i verziju pomoću dodatka Maven ili Gradle:

 org.springframework.boot spring-boot-maven-plugin build-info 

3.9. Stvaranje prilagođene krajnje točke

Kao što smo prethodno istaknuli, možemo stvoriti prilagođene krajnje točke. Međutim, Spring Boot 2 redizajnirao je način da se to postigne kako bi podržao novu tehnološko-agnostičku paradigmu.

Stvorimo krajnju točku aktuatora za ispitivanje, omogućavanje i onemogućavanje zastavica značajki u našoj aplikaciji:

@Component @Endpoint (id = "features") javna klasa FeaturesEndpoint {private map features = new ConcurrentHashMap (); @ReadOperation javne značajke karte () {return značajke; } @ReadOperation javna značajka značajke (@Selector naziv niza) {return features.get (ime); } @WriteOperation javna praznina configureFeature (@Selector naziv niza, značajka značajke) {features.put (ime, značajka); } @DeleteOperation public void deleteFeature (@Selector String name) {features.remove (name); } javna statička klasa Feature {private Boolean enabled; // [...] geteri i postavljači}}

Da bismo dobili krajnju točku, potreban nam je grah. U našem primjeru koristimo @Komponenta za ovo. Također, ovaj grah moramo ukrasiti @Endpoint.

Put naše krajnje točke određuje iskaznica parametar od @Endpoint. U našem će slučaju preusmjeriti zahtjeve na / aktuator / značajke.

Jednom kad smo spremni, možemo početi definirati operacije pomoću:

  • @ReadOperation: Preslikavat će se na HTTP DOBITI.
  • @WriteOperation: Preslikavat će se na HTTP OBJAVI.
  • @DeleteOperation: Preslikavat će se na HTTP IZBRISATI.

Kada pokrenemo aplikaciju s prethodnom krajnjom točkom u našoj aplikaciji, Spring Boot će je registrirati.

Brzi način da to provjerite je provjera dnevnika:

[...]. WebFluxEndpointHandlerMapping: Mapirano "{[/ aktuator / značajke / {ime}], metode = [GET], proizvodi = [application / vnd.spring-boot.actuator.v2 + json || application / json] } "[...]. WebFluxEndpointHandlerMapping: Mapirano" application / json] "[...]. WebFluxEndpointHandlerMapping: Mapirano" {[/ actuator / features / {name}], methods = [POST], troši = [application / vnd.spring-boot.actuator.v2 + json || application / json]} "[...]. WebFluxEndpointHandlerMapping: Mapirano" {[/ actuator / features / {name}], methods = [DELETE]} "[. ..]

U prethodnim zapisnicima možemo vidjeti kako WebFlux izlaže našu novu krajnju točku. Ako prijeđemo na MVC, on će jednostavno delegirati tu tehnologiju bez potrebe za promjenom bilo kojeg koda.

Također, moramo imati na umu nekoliko važnih razmatranja s ovim novim pristupom:

  • Nema ovisnosti s MVC-om.
  • Svi metapodaci prisutni kao metode prije (osjetljivo, omogućeno ...) više ne postoji. Međutim, možemo omogućiti ili onemogućiti krajnju točku pomoću @Endpoint (id = “značajke”, enableByDefault = false).
  • Za razliku od 1.x, više nema potrebe za proširivanjem određenog sučelja.
  • Za razliku od starog modela čitanja / pisanja, sada ga možemo definirati IZBRISATI operacije pomoću @DeleteOperation.

3.10. Proširenje postojećih krajnjih točaka

Zamislimo da želimo biti sigurni da proizvodna instanca naše aplikacije nikada nije SNIMAK verzija.

Odlučili smo to učiniti promjenom HTTP statusnog koda krajnje točke aktuatora koja vraća te podatke, tj. / info. Ako je naša aplikacija slučajno bila SNIMAK, dobili bismo drugačije HTTP statusni kod.

Lako možemo proširiti ponašanje unaprijed definirane krajnje točke pomoću @EndpointExtension bilješke, ili njegove konkretnije specijalizacije @EndpointWebExtension ili @EndpointJmxExtension:

@Component @EndpointWebExtension (endpoint = InfoEndpoint.class) javna klasa InfoWebEndpointExtension {privatni delegat InfoEndpoint; // standardni konstruktor @ReadOperation public WebEndpointResponse info () {Map info = this.delegate.info (); Cjelobrojni status = getStatus (info); vratiti novi WebEndpointResponse (informacije, status); } private Integer getStatus (podaci o mapi) {// return 5xx ako je ovo snimka return 200; }}

3.11. Omogući sve krajnje točke

Da bismo pristupili završnim točkama aktuatora pomoću HTTP-a, moramo ih omogućiti i izložiti.

Prema zadanim postavkama sve krajnje točke, ali /ugasiti su omogućeni. Samo /zdravlje i / info krajnje točke su prema zadanim postavkama izložene.

Moramo dodati sljedeću konfiguraciju da bismo izložili sve krajnje točke:

management.endpoints.web.exposure.include = *

Da biste izričito omogućili određenu krajnju točku (npr., /ugasiti), koristimo:

upravljanje.endpoint.shutdown.enabled = true

Da biste izložili sve omogućene krajnje točke, osim jedne (npr., / drvosječe), koristimo:

management.endpoints.web.exposure.include = * management.endpoints.web.exposure.exclude = drvosječe

4. Pokretač opružnog prtljažnika 1.x.

U 1.x, Actuator slijedi model čitanja / pisanja, što znači da možemo ili čitati iz njega ili pisati na njega.

Na primjer, možemo dohvatiti mjerne podatke ili stanje naše aplikacije. Ili bismo mogli elegantno ukinuti našu aplikaciju ili promijeniti konfiguraciju evidentiranja.

Da bi mogao raditi, Actuator zahtijeva da Spring MVC izloži svoje krajnje točke putem HTTP-a. Nije podržana nijedna druga tehnologija.

4.1. Krajnje točke

U 1.x, Actuator donosi vlastiti sigurnosni model. Koristi konstrukcije Spring Security, ali ih treba konfigurirati neovisno od ostatka aplikacije.

Također, većina krajnjih točaka osjetljiva je - što znači da nisu u potpunosti javne ili će većina podataka biti izostavljena - dok ih nekolicina nije, npr. / info.

Evo nekoliko najčešćih krajnjih točaka koje Boot pruža odmah u kutiji:

  • /zdravlje prikazuje zdravstvene podatke o aplikaciji (jednostavan status kada se pristupi preko neautentirane veze ili punih detalja o poruci kada se provjeri autentičnost); prema zadanim postavkama nije osjetljiv.
  • / info prikazuje proizvoljne informacije o prijavi; prema zadanim postavkama nije osjetljiv.
  • /metrika prikazuje metričke podatke za trenutnu aplikaciju; prema zadanim je postavkama osjetljiv.
  • /trag prikazuje podatke o praćenju (prema zadanim postavkama posljednjih nekoliko HTTP zahtjeva).

Potpuni popis postojećih krajnjih točaka možemo pronaći na službenim dokumentima.

4.2. Konfiguriranje postojećih krajnjih točaka

Možemo prilagoditi svaku krajnju točku svojstvima koristeći format krajnje točke. [naziv krajnje točke]. [svojstvo za prilagodbu].

Dostupna su tri svojstva:

  • iskaznica: kojim će se ovoj krajnjoj točki pristupiti putem HTTP-a
  • omogućeno: ako je istina, tada joj se može pristupiti; inače ne
  • osjetljiv: ako je tačno, tada vam treba ovlaštenje za prikazivanje presudnih podataka putem HTTP-a

Na primjer, dodavanjem sljedećih svojstava prilagodit ćete /grah krajnja točka:

endpoints.beans.id = springbeans endpoints.beans.sensitive = false endpoints.beans.enabled = true

4.3. /zdravlje Krajnja točka

The /zdravlje krajnja točka koristi se za provjeru ispravnosti ili stanja pokrenute aplikacije.

Obično se provodi nadgledanjem softvera da bi nas upozorio ako pokrenuta instanca padne ili postane nezdrava iz drugih razloga, npr. Problema s povezivanjem s našim DB-om, nedostatak prostora na disku itd.

Prema zadanim postavkama neovlašteni korisnici mogu vidjeti podatke o statusu samo kada pristupaju putem HTTP-a:

{"status": "UP"} 

Ove zdravstvene informacije prikupljaju se od svih graha koji provode HealthIndicator sučelje konfigurirano u kontekstu naše aplikacije.

Neke podatke vratio HealthIndicator je osjetljive prirode, ali možemo ga konfigurirati krajnje točke.health.sensitive = false za izlaganje detaljnijih podataka poput prostora na disku, povezivanja posrednika za razmjenu poruka, prilagođenih provjera i još mnogo toga.

Imajte na umu da ovo radi samo za verzije Spring Boot ispod 1.5.0. Za verzije 1.5.0 i novije, također bismo trebali onemogućiti sigurnost postavljanjem management.security.enabled = false za neovlašteni pristup.

Mogli bismo i mi implementirati vlastiti prilagođeni pokazatelj zdravlja, koji može prikupiti bilo koju vrstu prilagođenih zdravstvenih podataka specifičnih za aplikaciju i automatski ih izložiti putem /zdravlje krajnja točka:

@Component ("myHealthCheck") javna klasa HealthCheck implementira HealthIndicator {@Override public Health health () {int errorCode = check (); // izvršiti određenu provjeru zdravstvenog stanja if (errorCode! = 0) {return Health.down () .withDetail ("Šifra pogreške", errorCode) .build (); } povratak Health.up (). build (); } public int check () {// Naša logika za provjeru povratka stanja 0; }} 

Evo kako bi izlaz izgledao:

{"status": "DOWN", "myHealthCheck": {"status": "DOWN", "Code of Error": 1}, "diskSpace": {"status": "UP", "free": 209047318528, " prag ": 10485760}}

4.4. / info Krajnja točka

Također možemo prilagoditi podatke koje prikazuje / info krajnja točka:

info.app.name = Primjer proljetne aplikacije info.app.description = Ovo je moja prva proljetna aplikacija za pokretanje info.app.version = 1.0.0

I izlaz uzorka:

{"app": {"version": "1.0.0", "description": "Ovo je moja prva proljetna aplikacija za pokretanje", "name": "Spring Sample Application"}}

4.5. /metrika Krajnja točka

Krajnja točka metrike objavljuje informacije o OS-u i JVM-u, kao i metriku na razini aplikacije. Jednom omogućeni, dobivamo informacije poput memorije, hrpe, procesora, niti, učitanih klasa, rasterećenih klasa i spremišta niti, zajedno s nekim HTTP mjernim podacima.

Evo kako izgleda izlaz ove krajnje točke:

{"mem": 193024, "mem.free": 87693, "procesori": 4, "instance.uptime": 305027, "uptime": 307077, "systemload.average": 0,11, "heap.committed": 193024 , "heap.init": 124928, "heap.used": 105330, "heap": 1764352, "thread.peak": 22, "thread.daemon": 19, "thread": 22, "classes": 5819 , "classes.loaded": 5819, "classes.unloaded": 0, "gc.ps_scavenge.count": 7, "gc.ps_scavenge.time": 54, "gc.ps_marksweep.count": 1, "gc. ps_marksweep.time ": 44," httpsessions.max ": -1," httpsessions.active ": 0," counter.status.200.root ": 1," gauge.response.root ": 37.0} 

Da bismo prikupili prilagođene mjerne podatke, imamo podršku za mjerila (snimke podataka s jednom vrijednošću) i brojače, tj. Povećavanje / smanjivanje mjernih podataka.

Primijenimo vlastite prilagođene mjerne podatke u /metrika krajnja točka.

Prilagodit ćemo tijek prijave kako bismo zabilježili uspješan i neuspjeli pokušaj prijave:

@Service javna klasa LoginServiceImpl {privatni konačni CounterService counterService; javna LoginServiceImpl (CounterService counterService) {this.counterService = counterService; } javna logička prijava (niz userName, char [] lozinka) {logička uspješnost; if (userName.equals ("admin") && "secret" .toCharArray (). jednako (lozinka)) {counterService.increment ("counter.login.success"); uspjeh = istina; } else {counterService.increment ("counter.login.failure"); uspjeh = lažno; } povratak uspjeha; }}

Evo kako bi izlaz mogao izgledati:

{... "counter.login.success": 105, "counter.login.failure": 12, ...} 

Imajte na umu da su pokušaji prijave i drugi događaji povezani sa sigurnošću dostupni u Actuatoru kao događaji revizije.

4.6. Stvaranje nove krajnje točke

Uz korištenje postojećih krajnjih točaka koje pruža Spring Boot, možemo stvoriti i potpuno novu.

Prvo, moramo imati novu krajnju točku koja će implementirati Krajnja točka sučelje:

@Component javna klasa CustomEndpoint implementira Endpoint {@Override public String getId () {return "customEndpoint"; } @Override public boolean isEnabled () {return true; } @Override public boolean isSensitive () {return true; } @Override public List invoke () {// Prilagođena logika za izgradnju izlaznih poruka Popisa = new ArrayList (); messages.add ("Ovo je poruka 1"); messages.add ("Ovo je poruka 2"); vratiti poruke; }}

Da bi pristupio toj novoj krajnjoj točki, njezin iskaznica koristi se za njegovo mapiranje. Drugim riječima, mogli bismo to vježbati udarajući / customEndpoint.

Izlaz:

["Ovo je poruka 1", "Ovo je poruka 2"]

4.7. Daljnja prilagodba

Iz sigurnosnih razloga mogli bismo odabrati izložiti krajnje točke aktuatora preko nestandardnog priključka - upravljanje.port svojstvo se lako može koristiti za konfiguriranje toga.

Također, kao što smo već spomenuli, u 1.x. Actuator konfigurira vlastiti sigurnosni model zasnovan na Spring Security, ali neovisan od ostatka aplikacije.

Stoga možemo promijeniti upravljanje.adresa svojstvo da ograniči odakle se krajnjim točkama može pristupiti putem mreže:

#port koji se koristi za izlaganje upravljanja aktuatorom.port = 8081 #CIDR dopušteno pogoditi upravljanje aktuatorom.address = 127.0.0.1 # Treba li omogućiti ili potpuno onemogućiti zaštitu management.security.enabled = false

Osim toga, sve ugrađene krajnje točke osim / info su prema zadanim postavkama osjetljivi.

Ako aplikacija koristi Spring Security, te krajnje točke možemo osigurati definiranjem zadanih sigurnosnih svojstava (korisničko ime, lozinka i uloga) u primjena.svojstva datoteka:

security.user.name = admin security.user.password = tajno upravljanje.security.role = SUPERUSER

5. Zaključak

U ovom smo članku razgovarali o pokretaču proljetnog pokretanja. Počeli smo definiranjem što Actuator znači i što za nas čini.

Dalje, usredotočili smo se na Actuator za trenutnu verziju Spring Boot 2.x, raspravljajući o tome kako ga koristiti, doraditi i proširiti. Također smo razgovarali o važnim sigurnosnim promjenama koje možemo pronaći u ovoj novoj iteraciji. Razgovarali smo o nekim popularnim krajnjim točkama i o tome kako su se i oni promijenili.

Zatim smo razgovarali o Actuatoru u ranijoj verziji Spring Boot 1.

Na kraju smo pokazali kako prilagoditi i proširiti aktuator.

Kao i uvijek, kôd korišten u ovom članku možete pronaći na GitHub-u i za Spring Boot 2.x i Spring Boot 1.x.