Mikroslužby s Oracle Helidon

1. Prehľad

Helidon je nový rámec mikroslužieb Java, ktorý nedávno otvoril Oracle. Interne sa používal v projektoch Oracle pod názvom J4C (Java for Cloud).

V tomto výučbe sa budeme venovať hlavným konceptom rámca a potom sa presunieme k vytvoreniu a spusteniu mikroslužby založenej na Helidone.

2. Programovací model

V súčasnosti framework podporuje dva programovacie modely pre zápis mikroslužieb: Helidon SE a Helidon MP.

Zatiaľ čo Helidon SE je navrhnutý ako mikrorámik, ktorý podporuje model reaktívneho programovania, Helidon MP je na druhej strane runtime Eclipse MicroProfile, ktoré umožňuje komunite Jakarta EE prevádzkovať mikroslužby prenosným spôsobom.

V obidvoch prípadoch je mikroslužbou Helidon aplikácia Java SE, ktorá spúšťa plechový server HTTP z hlavnej metódy.

3. Helidon SE

V tejto časti podrobnejšie odhalíme hlavné komponenty Helidon SE: WebServer, Config a Security.

3.1. Nastavenie servera WebServer

Ak chcete začať s WebServer API, musíme pridať požadovanú Maven závislosť do pom.xml spis:

 io.helidon.webserver helidon-webserver 0.10.4 

Ak chcete mať jednoduchú webovú aplikáciu, môžeme použiť jednu z nasledujúcich metód staviteľa: WebServer.create (serverConfig, smerovanie) alebo len tak WebServer.create (smerovanie). Posledná z nich má predvolenú konfiguráciu servera, ktorá umožňuje jeho spustenie na náhodnom porte.

Tu je jednoduchá webová aplikácia, ktorá beží na preddefinovanom porte. Zaregistrovali sme tiež jednoduchý obslužný program, ktorý bude na každú požiadavku HTTP odpovedať uvítacou správou pomocou „/pozdraviť ' cesta a ZÍSKAJTE Metóda:

public static void main (String ... args) hodí výnimku {ServerConfiguration serverConfig = ServerConfiguration.builder () .port (9001) .build (); Routing routing = Routing.builder () .get ("/ greet", (request, response) -> response.send ("Hello World!")). Build (); WebServer.create (serverConfig, smerovanie) .start () .thAcAccept (ws -> System.out.println ("Server bol spustený na: // localhost:" + ws.port ())); }

Posledným riadkom je spustenie servera a čakanie na obsluhu požiadaviek HTTP. Ale ak spustíme tento vzorový kód v hlavnej metóde, dostaneme chybu:

Výnimka vo vlákne „main“ java.lang.IllegalStateException: Pre SPI sa nenašla žiadna implementácia: io.helidon.webserver.spi.WebServerFactory

The Webový server je v skutočnosti SPI a musíme zabezpečiť runtime implementáciu. V súčasnosti Helidon poskytuje NettyWebServer implementácia ktorý je založený na Netty Core.

Tu je závislosť Maven pre túto implementáciu:

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

Teraz môžeme spustiť hlavnú aplikáciu a skontrolovať, či funguje, vyvolaním nakonfigurovaného koncového bodu:

// localhost: 9001 / pozdraviť

V tomto príklade sme nakonfigurovali port aj cestu pomocou vzoru tvorcu.

Helidon SE tiež umožňuje použitie konfiguračného vzoru, kde konfiguračné údaje poskytuje Konfig API. Toto je téma nasledujúcej časti.

3.2. The Konfig API

The Konfig API poskytuje nástroje na čítanie konfiguračných údajov zo zdroja konfigurácie.

Helidon SE poskytuje implementácie pre mnoho zdrojov konfigurácie. Predvolenú implementáciu poskytuje server helidon-config kde je zdrojom konfigurácie application.properties súbor umiestnený pod cestou triedy:

 io.helidon.config helidon-config 0.10.4 

Na načítanie konfiguračných údajov stačí použiť predvolený nástroj na tvorbu, ktorý predvolene preberá konfiguračné údaje application.properties:

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

Vytvorme application.properties súbor pod src / main / resource adresár s nasledujúcim obsahom:

server.port = 9080 web.debug = skutočný web.page-size = 15 user.home = C: / Users / app

Na čítanie hodnôt môžeme použiť Config.get () metóda a potom nasleduje pohodlné obsadenie do zodpovedajúcich typov Java:

int port = config.get ("server.port"). asInt (); int pageSize = config.get ("web.page-size"). asInt (); boolean debug = config.get ("web.debug"). asBoolean (); Reťazec userHome = config.get ("user.home"). AsString ();

V skutočnosti predvolený stavač načíta prvý nájdený súbor v tomto poradí priority: application.yaml, application.conf, application.json a application.properties. Posledné tri formáty si vyžadujú osobitnú závislosť od konfigurácie. Napríklad na použitie formátu YAML musíme pridať súvisiacu závislosť konfigurácie YAML:

 io.helidon.config helidon-config-yaml 0,10,4 

A potom pridáme znak aplikácia.yml:

server: port: 9080 web: ladenie: skutočná veľkosť stránky: 15 používateľ: domov: C: / používatelia / aplikácia

Podobne, aby sme mohli používať CONF, čo je zjednodušený formát JSON, alebo formáty JSON, musíme pridať závislosť helidon-config-hocon.

Upozorňujeme, že konfiguračné údaje v týchto súboroch môžu byť prepísané premennými prostredia a vlastnosťami systému Java.

Môžeme tiež ovládať predvolené správanie staviteľa vypnutím premennej prostredia a vlastností systému alebo explicitným uvedením zdroja konfigurácie:

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

Okrem načítania konfiguračných údajov z cesty triedy môžeme použiť aj dve konfigurácie externých zdrojov, to znamená konfigurácie git a etcd. Na to potrebujeme závislosti helidon-config-git a helidon-git-etcd.

Nakoniec, ak všetky tieto zdroje konfigurácie nespĺňajú našu potrebu, Helidon nám umožňuje zabezpečiť implementáciu nášho zdroja konfigurácie. Môžeme napríklad poskytnúť implementáciu, ktorá dokáže načítať konfiguračné údaje z databázy.

3.3. The Smerovanie API

The Smerovanie API poskytuje mechanizmus, pomocou ktorého viažeme požiadavky HTTP na metódy Java. Môžeme to dosiahnuť použitím metódy požiadavky a cesty ako kritérií zhody alebo RequestPredicate objekt pre použitie viacerých kritérií.

Na konfiguráciu trasy teda môžeme ako kritérium použiť metódu HTTP:

Routing routing = Routing.builder () .get ((požiadavka, odpoveď) -> {});

Alebo môžeme kombinovať metódu HTTP s cestou požiadavky:

Routing routing = Routing.builder () .get ("/ cesta", (požiadavka, odpoveď) -> {});

Môžeme tiež použiť RequestPredicate pre väčšiu kontrolu. Môžeme napríklad skontrolovať existujúcu hlavičku alebo typ obsahu:

Routing routing = Routing.builder () .post ("/ save", RequestPredicate.whenRequest () .containsHeader ("header1") .containsCookie ("cookie1") .accepts (MediaType.APPLICATION_JSON) .contsQueryParameter ("param1"). hasContentType ("application / json") .thenApply ((request, response) -> {}) .otherwise ((request, response) -> {})) .build ();

Doteraz sme poskytovali manipulátory vo funkčnom štýle. Môžeme tiež použiť Služby trieda, ktorá umožňuje manipulátory s písaním zložitejším spôsobom.

Poďme si teda najskôr vytvoriť model pre objekt, s ktorým pracujeme, Kniha trieda:

verejná trieda Book {private String id; súkromné ​​meno reťazca; súkromný autor reťazcov; súkromné ​​celé čísla; // ...}

Môžeme vytvoriť REST služby pre Kniha triedy implementáciou Service.update () metóda. To umožňuje konfigurovať podcesty toho istého prostriedku:

verejná trieda BookResource implementuje službu {private BookManager bookManager = nový BookManager (); @Override public void update (pravidlá Routing.Rules) {rules .get ("/", this :: books) .get ("/ {id}", this :: bookById); } private void bookById (ServerRequest serverRequest, ServerResponse serverResponse) {String id = serverRequest.path (). param ("id"); Book book = bookManager.get (id); JsonObject jsonObject = z (knihy); serverResponse.send (jsonObject); } súkromné ​​neplatné knihy (ServerRequest serverRequest, ServerResponse serverResponse) {Zoznam kníh = bookManager.getAll (); JsonArray jsonArray = z (kníh); serverResponse.send (jsonArray); } // ...}

Tiež sme nakonfigurovali typ média ako JSON, takže na tento účel potrebujeme závislosť helidon-webserver-json:

 io.helidon.webserver helidon-webserver-json 0.10.4 

Nakoniec používame Registrovať() metóda Smerovanie nástroj na tvorbu väzieb s koreňovou cestou k prostriedku. V tomto prípade, Cesty nakonfigurované službou, sú predponou koreňovej cesty:

Routing routing = Routing.builder () .register (JsonSupport.get ()) .register ("/ books", new BookResource ()) .build ();

Teraz môžeme spustiť server a skontrolovať koncové body:

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

3.4. Bezpečnosť

V tejto časti, zabezpečíme naše zdroje pomocou modulu Zabezpečenie.

Začnime vyhlásením všetkých potrebných závislostí:

 io.helidon.security helidon-security 0.10.4 io.helidon.security helidon-security-provider-http-auth 0.10.4 io.helidon.security helidon-security-integration-webserver 0.10.4 

Závislosti helidon-security, helidon-security-provider-http-auth a helidon-security-integration-webserver sú dostupné z Maven Central.

Bezpečnostný modul ponúka veľa poskytovateľov autentifikácie a autorizácie. V tomto príklade použijeme poskytovateľa základnej autentifikácie HTTP pretože je to dosť jednoduché, ale postup pre ostatných poskytovateľov je takmer rovnaký.

Prvá vec, ktorú musíte urobiť, je vytvoriť a Bezpečnosť inštancia. Pre jednoduchosť to môžeme urobiť buď programovo:

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

Alebo môžeme použiť konfiguračný prístup.

V takom prípade deklarujeme celú konfiguráciu zabezpečenia v aplikácia.yml súbor, ktorý načítame cez Konfig API:

#Config 4 Zabezpečenie ==> Mapované na zabezpečený objekt Zabezpečenie: poskytovatelia: - http-basic-auth: realm: "helidon" hlavný typ: USER # Môže byť USER alebo SERVICE, predvolené nastavenie je USER users: - login: "user" heslo: "užívateľ" role: ["ROLE_USER"] - prihlásenie: "admin" heslo: "admin" role: ["ROLE_USER", "ROLE_ADMIN"] #Config 4 Zabezpečenie integrácie webového servera ==> Mapované na WebSecurity Object web- server: securityDefaults: autentifikácia: skutočné cesty: - cesta: "/ user" metódy: ["získať"] povolené role: ["ROLE_USER", "ROLE_ADMIN"] - cesta: "/ admin" metódy: ["získať"] povolené role: ["ROLE_ADMIN"]

A aby sme ho načítali, musíme len vytvoriť a Konfig objekt a potom vyvoláme Security.fromConfig () metóda:

Config config = Config.create (); Zabezpečenie zabezpečenie = Security.fromConfig (config);

Akonáhle máme Bezpečnosť inštanciu najskôr musíme zaregistrovať v Webový server pomocou WebSecurity.from () metóda:

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

Môžeme tiež vytvoriť a WebSecurity inštancia priamo pomocou prístupu config, pomocou ktorého načítame konfiguráciu zabezpečenia aj webového servera:

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

Teraz môžeme pridať niekoľko ovládačov pre / užívateľ a / admin cesty, spustite server a pokúste sa k nim získať prístup:

Routing routing = Routing.builder () .register (WebSecurity.from (config)) .get ("/ user", (request, response) -> response.send ("Hello, I'm Helidon SE")) .get ("/ admin", (žiadosť, odpoveď) -> response.send ("Dobrý deň, som Helidon SE")) .build ();

4. Helidon MP

Helidon MP je implementácia Eclipse MicroProfile a tiež poskytuje runtime pre spustenie mikroslužieb založených na MicroProfile.

Pretože už máme článok o Eclipse MicroProfile, skontrolujeme tento zdrojový kód a upravíme ho tak, aby bežal na Helidon MP.

Po odhlásení kódu odstránime všetky závislosti a doplnky a do súboru POM pridáme závislosti Helidon MP:

 io.helidon.microprofile.bundles helidon-microprofile-1.2 0.10.4 org.glassfish.jersey.media dres-media-json-väzba 2,26 

Závislosti helidon-mikroprofil-1.2 a Jersey-media-json-binding sú k dispozícii od Maven Central.

Ďalšie, pridáme beans.xml súbor pod src / main / resource / META-INF adresár s týmto obsahom:

V LibraryApplication triedy, prepísať getClasses () metóda tak, aby server nehľadal zdroje:

Verejná sada @ Override getClasses () {return CollectionsHelper.setOf (BookEndpoint.class); }

Nakoniec vytvorte hlavnú metódu a pridajte tento útržok kódu:

public static void main (String ... args) {Server server = Server.builder () .addApplication (LibraryApplication.class) .port (9080) .build (); server.start (); }

A to je všetko. Teraz budeme môcť vyvolať všetky zdroje kníh.

5. Záver

V tomto článku sme preskúmali hlavné komponenty Helidonu a tiež ukázali, ako nastaviť Helidon SE a MP. Pretože Helidon MP je iba runtime Eclipse MicroProfile, môžeme pomocou neho spustiť akúkoľvek existujúcu mikroslužbu založenú na MicroProfile.

Ako vždy, kód všetkých vyššie uvedených príkladov nájdete na GitHub.


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