Mikroservisi s Oracle Helidon

1. Pregled

Helidon je novi javanski mikroservisni okvir koji je nedavno otvorio Oracle. Interno se koristio u Oracle projektima pod imenom J4C (Java za oblak).

U ovom ćemo uputstvu pokriti glavne koncepte okvira, a zatim ćemo krenuti u izgradnju i pokretanje mikroservisa temeljenog na Helidonu.

2. Model programiranja

Trenutno, okvir podržava dva programska modela za pisanje mikro usluga: Helidon SE i Helidon MP.

Iako je Helidon SE dizajniran da bude mikrookvir koji podržava model reaktivnog programiranja, s druge strane, Helidon MP je Eclipse MicroProfile runtime koji omogućava zajednici EE u Jakarti pokretanje mikro usluga na prijenosni način.

U oba slučaja, mikroservis Helidon je aplikacija Java SE koja pokreće limeni HTTP poslužitelj od glavne metode.

3. Helidon SE

U ovom ćemo odjeljku detaljnije otkriti glavne komponente Helidon SE: WebServer, Config i Security.

3.1. Postavljanje web poslužitelja

Za početak s WebServer API, trebamo dodati potrebnu Mavenovu ovisnost na pom.xml datoteka:

 io.helidon.webserver helidon-webserver 0.10.4 

Da biste imali jednostavnu web aplikaciju, možemo koristiti jednu od sljedećih metoda graditelja: WebServer.create (serverConfig, usmjeravanje) ili samo WebServer.create (usmjeravanje). Posljednji uzima zadanu konfiguraciju poslužitelja koja omogućuje poslužitelju da radi na slučajnom priključku.

Evo jednostavne web aplikacije koja se izvodi na unaprijed definiranom priključku. Također smo registrirali jednostavnog rukovatelja koji će odgovoriti pozdravnom porukom na bilo koji HTTP zahtjev s '/pozdraviti' put i DOBITI Metoda:

public static void main (String ... args) baca izuzetak {ServerConfiguration serverConfig = ServerConfiguration.builder () .port (9001) .build (); Usmjeravanje usmjeravanje = Routing.builder () .get ("/ greet", (zahtjev, odgovor) -> response.send ("Hello World!")). Build (); WebServer.create (serverConfig, usmjeravanje) .start (). ThenAccept (ws -> System.out.println ("Poslužitelj pokrenut na: // localhost:" + ws.port ())); }

Posljednji redak je pokretanje poslužitelja i čekanje na posluživanje HTTP zahtjeva. Ali ako pokrenemo ovaj uzorak koda u glavnoj metodi, dobit ćemo pogrešku:

Iznimka u niti "main" java.lang.IllegalStateException: Nije pronađena implementacija za SPI: io.helidon.webserver.spi.WebServerFactory

The WebServer je zapravo SPI, a mi moramo osigurati runtime implementaciju. Trenutno, Helidon pruža NettyWebServer provedba koja se temelji na Netty Core.

Evo ovisnosti Mavena za ovu implementaciju:

 io.helidon.webserver helidon-webserver-netty 0.10.4 runtime 

Sada možemo pokrenuti glavnu aplikaciju i provjeriti funkcionira li pozivanjem konfigurirane krajnje točke:

// localhost: 9001 / pozdrav

U ovom smo primjeru konfigurirali i port i put koristeći obrazac graditelja.

Helidon SE također omogućuje upotrebu konfiguracijskog uzorka gdje konfiguracijske podatke pruža Config API. To je tema sljedećeg odjeljka.

3.2. The Config API

The Config API nudi alate za čitanje podataka o konfiguraciji iz izvora konfiguracije.

Helidon SE nudi implementacije za mnoge izvore konfiguracije. Zadana implementacija pruža helidon-config gdje je izvor konfiguracije primjena.svojstva datoteka smještena ispod puta predavanja:

 io.helidon.config helidon-config 0.10.4 

Da bismo pročitali konfiguracijske podatke, samo trebamo upotrijebiti zadani graditelj koji prema zadanim postavkama uzima konfiguracijske podatke svojstva.svojstva:

Config config = Config.builder (). Build ();

Stvorimo primjena.svojstva datoteka pod src / glavni / resurs imenik sa sljedećim sadržajem:

server.port = 9080 web.debug = true web.page-size = 15 user.home = C: / Users / app

Za čitanje vrijednosti možemo koristiti Config.get () metoda nakon čega slijedi prikladno lijevanje na odgovarajuće tipove Java:

int port = config.get ("server.port"). asInt (); int pageSize = config.get ("web.page-size"). asInt (); boolean otklanjanje pogrešaka = config.get ("web.debug"). asBoolean (); Niz userHome = config.get ("user.home"). AsString ();

U stvari, zadani graditelj učitava prvu pronađenu datoteku ovim redoslijedom prioriteta: application.yaml, application.conf, application.json i application.properties. Posljednja tri formata trebaju dodatnu povezanu konfiguracijsku ovisnost. Na primjer, da bismo koristili YAML format, trebamo dodati povezanu YAML konfiguracijsku ovisnost:

 io.helidon.config helidon-config-yaml 0.10.4 

A zatim dodamo znak primjena.iml:

poslužitelj: port: 9080 web: otklanjanje pogrešaka: prava veličina stranice: 15 korisnik: dom: C: / Korisnici / aplikacija

Slično tome, da bismo koristili CONF, koji je JSON pojednostavljeni format, ili JSON formati, moramo dodati ovisnost helidon-config-hocon.

Imajte na umu da konfiguracijske podatke u tim datotekama mogu nadjačati varijable okruženja i svojstva Java sustava.

Također možemo kontrolirati ponašanje zadanog graditelja onemogućavanjem varijable okruženja i svojstava sustava ili eksplicitnim navođenjem izvora konfiguracije:

ConfigSource configSource = ConfigSources.classpath ("application.yaml"). Build (); Config config = Config.builder () .disableSystemPropertiesSource () .disableEnvironmentVariablesSource () .sources (configSource) .build ();

Osim čitanja podataka o konfiguraciji s putova predavanja, možemo koristiti i dvije konfiguracije vanjskih izvora, odnosno git i etcd konfiguracije. Za to su nam potrebne ovisnosti helidon-config-git i helidon-git-etcd.

Napokon, ako svi ovi konfiguracijski izvori ne zadovoljavaju naše potrebe, Helidon nam omogućuje da pružimo implementaciju za naš konfiguracijski izvor. Na primjer, možemo pružiti implementaciju koja može čitati podatke o konfiguraciji iz baze podataka.

3.3. The Usmjeravanje API

The Usmjeravanje API pruža mehanizam kojim povezujemo HTTP zahtjeve s Java metodama. To možemo postići korištenjem metode zahtjeva i puta kao podudarnih kriterija ili ZahtjevPrediciraj objekt za korištenje više kriterija.

Dakle, da bismo konfigurirali rutu, možemo samo koristiti HTTP metodu kao kriterij:

Usmjeravanje usmjeravanja = Routing.builder () .get ((zahtjev, odgovor) -> {});

Ili možemo kombinirati HTTP metodu s putem zahtjeva:

Usmjeravanje usmjeravanje = Routing.builder () .get ("/ put", (zahtjev, odgovor) -> {});

Također možemo koristiti ZahtjevPrediciraj za veću kontrolu. Na primjer, možemo provjeriti postoji li zaglavlje ili vrsta sadržaja:

Usmjeravanje usmjeravanja = Routing.builder () .post ("/ save", RequestPredicate.whenRequest () .containsHeader ("header1") .containsCookie ("cookie1") .accepts (MediaType.APPLICATION_JSON) .containsQueryParameter ("param1"). hasContentType ("application / json"). thenApply ((zahtjev, odgovor) -> {}). Inače ((zahtjev, odgovor) -> {})) .build ();

Do sada smo pružali rukovatelje u funkcionalnom stilu. Također možemo koristiti Servis klasa koja omogućuje rukovateljima pisanjem na sofisticiraniji način.

Pa, hajde da prvo napravimo model za objekt s kojim radimo, Knjiga razred:

javna klasa Book {private String id; privatni naziv niza; privatni autor niza; privatne Integer stranice; // ...}

Možemo stvoriti REST usluge za Knjiga klase primjenom Service.update () metoda. To omogućuje konfiguriranje potputa istog resursa:

javna klasa BookResource implementira uslugu {private BookManager bookManager = new BookManager (); @Preuzmi javno void ažuriranje (pravila Routing.Rules) {rules .get ("/", this :: books) .get ("/ {id}", this :: bookById); } private void bookById (ServerRequest serverRequest, ServerResponse serverResponse) {ID niza = serverRequest.path (). param ("id"); Knjiga knjiga = bookManager.get (id); JsonObject jsonObject = od (knjiga); serverResponse.send (jsonObject); } privatne praznine (ServerRequest serverRequest, ServerResponse serverResponse) {Popis knjiga = bookManager.getAll (); JsonArray jsonArray = od (knjige); serverResponse.send (jsonArray); } // ...}

Također smo konfigurirali vrstu medija kao JSON, pa nam je u tu svrhu potrebna ovisnost helidon-webserver-json:

 io.helidon.webserver helidon-webserver-json 0.10.4 

Konačno, koristimo Registar() metoda Usmjeravanje graditelj za povezivanje korijenske staze na resurs. U ovom slučaju, Staze konfigurirane uslugom imaju prefiks korijenske staze:

Usmjeravanje usmjeravanja = Routing.builder () .register (JsonSupport.get ()) .register ("/ knjige", novi BookResource ()) .build ();

Sada možemo pokrenuti poslužitelj i provjeriti krajnje točke:

// localhost: 9080 / books // localhost: 9080 / books / 0001-201810

3.4. Sigurnost

U ovom odjeljku, osigurat ćemo svoje resurse pomoću sigurnosnog modula.

Počnimo s deklariranjem svih potrebnih ovisnosti:

 io.helidon.security helidon-security 0.10.4 io.helidon.security helidon-security-provider-http-auth 0.10.4 io.helidon.security helidon-security-integracija-web poslužitelj 0.10.4 

Ovisnosti helidon-security, helidon-security-provider-http-auth i helidon-security-integracija-web poslužitelj dostupne su iz Maven Central.

Sigurnosni modul nudi mnogim pružateljima usluga za provjeru autentičnosti i autorizaciju. U ovom ćemo primjeru upotrijebiti pružatelja HTTP osnovne provjere autentičnosti jer je prilično jednostavan, ali postupak je za ostale davatelje usluga gotovo isti.

Prvo što treba učiniti je stvoriti Sigurnost primjer. To možemo učiniti bilo programski radi jednostavnosti:

Map users = // ... UserStore store = user -> Optional.ofNullable (users.get (user)); HttpBasicAuthProvider httpBasicAuthProvider = HttpBasicAuthProvider.builder () .realm ("myRealm") .subjectType (SubjectType.USER) .userStore (store) .build (); Sigurnost sigurnosti = Security.builder () .addAuthenticationProvider (httpBasicAuthProvider) .build ();

Ili se možemo poslužiti konfiguracijskim pristupom.

U ovom ćemo slučaju proglasiti svu sigurnosnu konfiguraciju u primjena.iml datoteku koju učitavamo kroz Config API:

#Config 4 Sigurnost ==> Mapirano na Sigurnost objekta sigurnosti: pružatelji usluga: - http-basic-auth: carstvo: "helidon" tip-načela: KORISNIK # Može biti KORISNIK ili USLUGA, zadani je KORISNIK korisnici: - prijava: "korisnik" lozinka: "korisničke" uloge: ["ROLE_USER"] - prijava: "admin" lozinka: "admin" uloge: ["ROLE_USER", "ROLE_ADMIN"] #Config 4 Integracija sigurnosnog web poslužitelja ==> Mapirano na web-objekt web- server: securityDefaults: authenticate: true paths: - path: "/ user" metode: ["get"] uloge-dozvoljene: ["ROLE_USER", "ROLE_ADMIN"] - path: "/ admin" metode: ["get"] dopuštene uloge: ["ROLE_ADMIN"]

A da bismo ga učitali, trebamo samo stvoriti Config objekt, a zatim pozivamo Security.fromConfig () metoda:

Config config = Config.create (); Sigurnost sigurnosti = Security.fromConfig (config);

Jednom kad imamo Sigurnost Primjerice, prvo ga moramo registrirati u WebServer koristiti WebSecurity.from () metoda:

Usmjeravanje usmjeravanja = Routing.builder () .register (WebSecurity.from (security) .securityDefaults (WebSecurity.authenticate ())) .build ();

Također možemo stvoriti i WebSecurity instancu izravno koristeći konfiguracijski pristup kojim učitavamo i sigurnost i konfiguraciju web poslužitelja:

Usmjeravanje usmjeravanje = Routing.builder () .register (WebSecurity.from (config)) .build ();

Sada možemo dodati neke rukovatelje za /korisnik i / admin staze, pokrenite poslužitelj i pokušajte im pristupiti:

Usmjeravanje usmjeravanje = Routing.builder () .register (WebSecurity.from (config)) .get ("/ user", (zahtjev, odgovor) -> response.send ("Hello, I'm Helidon SE")) .get ("/ admin", (zahtjev, odgovor) -> response.send ("Pozdrav, ja sam Helidon SE")) .build ();

4. Helidon MP

Helidon MP je implementacija Eclipse MicroProfile a također pruža runtime za pokretanje mikroservisa temeljenih na MicroProfileu.

Kako već imamo članak o Eclipse MicroProfileu, provjerit ćemo taj izvorni kôd i izmijeniti ga da radi na Helidon MP.

Nakon provjere koda uklonit ćemo sve ovisnosti i dodatke i dodati ovisnosti Helidon MP u POM datoteku:

 io.helidon.microprofile.bundles helidon-microprofile-1.2 0.10.4 org.glassfish.jersey.media jersey-media-json-binding 2.26 

Ovisnosti helidon-microprofile-1.2 i jersey-media-json-binding dostupne su u tvrtki Maven Central.

Sljedeći, mi ćemo dodati grah.xml datoteka pod src / main / resource / META-INF imenik sa ovim sadržajem:

U LibraryApplication razred, nadjačati getClasses () metoda tako da poslužitelj neće tražiti resurse:

@Preuzmi javni set getClasses () {return CollectionsHelper.setOf (BookEndpoint.class); }

Na kraju, izradite glavnu metodu i dodajte ovaj isječak koda:

javna statička void glavna (String ... args) {Server poslužitelj = Server.builder () .addApplication (LibraryApplication.class) .port (9080) .build (); server.start (); }

I to je to. Sada ćemo se moći pozvati na sve izvore knjiga.

5. Zaključak

U ovom smo članku istražili glavne komponente Helidona, također pokazujući kako postaviti Helidon SE i MP. Kako je Helidon MP samo vrijeme izvođenja Eclipse MicroProfile, pomoću njega možemo pokrenuti bilo koju postojeću mikro uslugu zasnovanu na MicroProfileu.

Kao i uvijek, kod svih gore navedenih primjera može se naći na GitHubu.


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