Bevezetés a Micronaut keretrendszerbe

1. Mi a Micronaut

A Micronaut egy JVM-alapú keretrendszer könnyű, moduláris alkalmazások építéséhez. Az OCI fejlesztette ki, ugyanaz a cég, amely létrehozta a Grails-t, A Micronaut a legújabb keretrendszer, amelynek célja a mikroszolgáltatások gyors és egyszerű létrehozása.

Míg a Micronaut tartalmaz néhány olyan funkciót, amely hasonló a meglévő keretrendszerekhez, mint például a Spring, van néhány új funkciója is, amelyek megkülönböztetik. A Java, Groovy és Kotlin támogatásával pedig számos lehetőséget kínál az alkalmazások létrehozására.

2. Főbb jellemzők

A Micronaut egyik legizgalmasabb tulajdonsága a fordítási időfüggőségi injekciós mechanizmus. A legtöbb keretrendszer reflexiót és proxyt használ a függőség-injektálás futás közbeni végrehajtására. A Micronaut azonban a fordítás idején építi fel a függőségi injekció adatait. Ennek eredményeként gyorsabb az alkalmazás indítása és kisebb a memóriaterület.

Egy másik jellemzője a reaktív programozás első osztályú támogatása, mind az ügyfelek, mind a szerverek számára. A konkrét reaktív megvalósítás választása a fejlesztőre marad, mivel mind az RxJava, mind a Project Reactor támogatott.

A Micronaut számos olyan funkcióval is rendelkezik, amelyek kiváló keretet nyújtanak a felhőalapú alkalmazások fejlesztéséhez. Támogat több szolgáltatásfeltáró eszközt, mint például az Eureka és a Consul, és különféle elosztott nyomkövető rendszerekkel is együttműködik, mint például a Zipkin és a Jaeger.

Támogatást nyújt az AWS lambda funkciók létrehozásához is, megkönnyítve a szerver nélküli alkalmazások létrehozását.

3. Az első lépések

Az indulás legegyszerűbb módja az SDKMAN használata:

> sdk install micronaut 1.0.0.RC2

Ez telepíti az összes bináris fájlt, amelyre szükségünk lesz a Micronaut alkalmazások felépítéséhez, teszteléséhez és telepítéséhez. Ezenkívül a Micronaut CLI eszközt is biztosítja, amelynek segítségével könnyedén elindíthatunk új projekteket.

A bináris tárgyak a Sonatype és a GitHub webhelyeken is elérhetők.

A következő szakaszokban megnézzük a keretrendszer néhány jellemzőjét.

4. Függőségi injekció

Mint korábban említettük, a Micronaut fordítási időben kezeli a függőségi injekciókat, amelyek eltérnek a legtöbb IoC-tárolótól.

Azonban még mindig teljes mértékben támogatja a JSR-330 kommentárokat tehát a babokkal való munka hasonló az IoC más keretrendszereihez.

A bab beírására a kódunkba használjuk @ Injekció:

@ Inject private EmployeeService szolgáltatás;

A @ Injekció az annotáció ugyanúgy működik @Autowired és használható mezőkön, módszereken, konstruktorokon és paramétereken.

Alapértelmezés szerint az összes babot prototípusként választják ki. Gyorsan létrehozhatunk egyszemű babot @Szingli. Ha több osztály használja ugyanazt a bab felületet, @Elsődleges feloldására használhatók:

@Primary @Singleton nyilvános osztályú BlueCar hajtja végre az autót {}

A @Igényel az annotáció használható, ha a bab opcionális, vagy csak bizonyos feltételek teljesülése esetén hajtható végre.

Ebben a tekintetben hasonlóan viselkedik, mint a tavaszi bakancs @Feltételes kommentárok:

@Singleton @Requires (bab = DataSource.class) @Requires (tulajdonság = "enabled") @Requires (missingBeans = EmployeeService) @Requires (sdk = Sdk.JAVA, value = "1.8") public class JdbcEmployeeService megvalósítja az EmployeeService {}

5. HTTP szerver felépítése

Most nézzük meg egy egyszerű HTTP szerver alkalmazás létrehozását. Először az SDKMAN-t használjuk egy projekt létrehozásához:

> mn create-app hello-world-server -build maven

Ez létrehoz egy új Java projektet a Maven használatával egy megnevezett könyvtárban hello-world-server. Ebben a könyvtárban megtaláljuk a fő alkalmazás forráskódunkat, a Maven POM fájlt és a projekt egyéb támogatási fájljait.

Az alapértelmezett alkalmazás, amely nagyon egyszerű:

public class ServerApplication {public static void main (String [] args) {Micronaut.run (ServerApplication.class); }}

5.1. A HTTP blokkolása

Önmagában ez az alkalmazás nem sokat fog tenni. Adjunk hozzá egy vezérlőt, amelynek két végpontja van. Mindkettő üdvözletet küld, de az egyik a KAP HTTP ige, és a másik használni fogja POST:

@Controller ("/ greet") nyilvános osztály GreetController {@Inject private GreetingService greetingService; @Get ("/ {name}") public String greet (String name) {return greetingService.getGreeting () + név; } @Post (value = "/ {name}", fogyaszt = MediaType.TEXT_PLAIN) public String setGreeting (@Body String név) {return greetingService.getGreeting () + név; }}

5.2. Reaktív IO

Alapértelmezés szerint a Micronaut ezeket a végpontokat a hagyományos blokkoló I / O használatával valósítja meg. Azonban, gyorsan kivitelezhetjük a nem blokkoló végpontokat, ha pusztán megváltoztatjuk a visszatérés típusát bármely reaktív, nem blokkoló típusra.

Például az RxJava-val használhatjuk Megfigyelhető. Hasonlóképpen a Reactor használatakor visszatérhetünk Monó vagy Fényáram adattípusok:

@Get ("/ {name}") nyilvános mono üdvözlet (karakterlánc neve) {return Mono.just (greetingService.getGreeting () + név); }

A blokkoló és a nem blokkoló végpontok esetében is a Netty az alapul szolgáló kiszolgáló, amelyet a HTTP-kérések kezelésére használnak.

Általában a kéréseket az indításkor létrehozott fő I / O szálkészleten kezelik, így blokkolva vannak.

Amikor azonban egy nem blokkoló adattípust adnak vissza a vezérlő végpontjáról, a Micronaut a Netty eseményhurok szálat használja, így az egész kérés nem blokkolható.

6. HTTP kliens építése

Most építsünk egy klienst az imént létrehozott végpontok felhasználására. A Micronaut a HTTP kliensek létrehozásának két módját kínálja:

  • Deklaratív HTTP kliens
  • Programozott HTTP kliens

6.1 Deklaratív HTTP kliens

A létrehozás első és leggyorsabb módja a deklaratív megközelítés használata:

@Client ("/ greet") nyilvános felület GreetingClient {@Get ("/ {name}") String köszönés (String neve); }

Figyelje meg, hogyan nem vezetünk be kódot a szolgáltatásunk hívásához. Ehelyett a Micronaut az általunk megadott metódus aláírásból és kommentárokból megérti, hogyan hívja meg a szolgáltatást.

Az ügyfél teszteléséhez létrehozhatunk egy JUnit tesztet, amely a beágyazott kiszolgáló API-t használja a szerver beágyazott példányának futtatásához:

public class GreetingClientTest {privát EmbeddedServer szerver; privát GreetingClient kliens; @A nyilvános void beállítása előtt () {server = ApplicationContext.run (EmbeddedServer.class); kliens = server.getApplicationContext (). getBean (GreetingClient.class); } @A nyilvános érvénytelenítés után () {server.stop (); } @Test public void testGreeting () {assertEquals (client.greet ("Mike"), "Hello Mike"); }}

6.2. Programozott HTTP kliens

Lehetőségünk van hagyományosabb kliens írására is, ha nagyobb ellenőrzésre van szükségünk a viselkedése és megvalósítása felett:

@Singleton nyilvános osztály ConcreteGreetingClient {private RxHttpClient httpClient; public ConcreteGreetingClient (@Client ("/") RxHttpClient httpClient) {this.httpClient = httpClient; } public String greet (String name) {HttpRequest req = HttpRequest.GET ("/ greet /" + név); return httpClient.retrieve (req) .blockingFirst (); } public Single greetAsync (karakterlánc neve) {HttpRequest req = HttpRequest.GET ("/ async / greet /" + név); return httpClient.retrieve (req) .first ("Hiba történt"); }}

Az alapértelmezett HTTP kliens az RxJava programot használja, így könnyedén dolgozhat blokkoló vagy nem blokkoló hívásokkal.

7. Micronaut CLI

A Micronaut CLI eszközt már fentebb láttuk működés közben, amikor a minta projektünk elkészítéséhez használtuk.

Esetünkben önálló alkalmazást hoztunk létre, de számos más képességgel is rendelkezik.

7.1. Szövetségi projektek

A Micronautban a szövetség csak önálló alkalmazások csoportja, amelyek ugyanazon könyvtár alatt élnek. A szövetségek használatával könnyen kezelhetjük őket együtt, és biztosíthatjuk, hogy ugyanazok az alapértelmezett beállítások és beállítások kapják meg őket.

Amikor a CLI eszközt használjuk az összevonás előállításához, az ugyanazokat az argumentumokat veszi fel, mint a create-app parancs. Létrehoz egy legfelső szintű projektstruktúrát, és minden önálló alkalmazást onnan hoz létre az alkönyvtárában.

7.2. Jellemzők

Önálló alkalmazás vagy egyesítés létrehozásakor eldönthetjük, melyik funkciókra van szükségünk az alkalmazásunk számára. Ez elősegíti, hogy a minimális függőségkészlet szerepeljen a projektben.

A funkciókat a -jellemzők argumentum és vesszővel elválasztott listát szolgáltat a szolgáltatásnevekről.

A következő parancs futtatásával megtalálhatjuk az elérhető szolgáltatások listáját:

> mn profile-info service biztosított szolgáltatások: -------------------- * annotation-api - Java annotation API-t ad hozzá * config-consul - Támogatást ad az elosztott konfigurációhoz a Consul segítségével * discovery-consul - Támogatást ad a szolgáltatáskereséshez a Consul-nál * discovery-eureka - Támogatást ad a szolgáltatáskereséshez az Eureka segítségével * groovy - Groovy alkalmazást hoz létre

7.3. Meglévő projektek

Használhatjuk a CLI eszközt a meglévő projektek módosítására is. Lehetővé teszi számunkra a babok, az ügyfelek, a kontrollerek és egyebek létrehozását. Amikor lefuttatjuk a mn parancsot egy meglévő projekt belsejéből, új parancssorok állnak rendelkezésre:

> mn segítség | Parancs neve Parancs leírása ---------------------------------------------- - create-bean Létrehoz egy szimpla bab-create-klienst Létrehoz egy kliens felületet create-controller Létrehoz egy vezérlőt és a hozzá tartozó teszt létrehozási munkát

8. Következtetés

A Micronaut rövid bemutatásában láthattuk, hogy mennyire egyszerű felépíteni mind a blokkoló, mind a nem blokkoló HTTP szervereket és klienseket. Emellett feltártuk a CLI néhány jellemzőjét.

De ez csak egy kis ízelítő az általa kínált funkciókból. Teljes támogatást nyújt a szerver nélküli funkciók, a szolgáltatás felfedezése, az elosztott nyomkövetés, a figyelés és a mutatók, az elosztott konfiguráció és még sok más.

És bár számos jellemzője olyan meglévő keretrendszerből származik, mint a Grails és a Spring, rengeteg egyedi funkcióval is rendelkezik, amelyek segítenek kiemelkedni önmagában.

Mint mindig, a fenti mintakódot is megtalálhatjuk a GitHub repóban.