Uvod u Micronaut Framework

1. Što je Micronaut

Micronaut je JVM-ov okvir za izgradnju laganih, modularnih aplikacija. Razvio OCI, ista tvrtka koja je stvorila Grails, Micronaut je najnoviji okvir osmišljen kako bi stvaranje mikrousluga učinio brzim i jednostavnim.

Iako Micronaut sadrži neke značajke koje su slične postojećim okvirima poput Springa, ima i neke nove značajke koje ga izdvajaju. A uz podršku za Javu, Groovy i Kotlin, nudi razne načine za stvaranje aplikacija.

2. Glavne značajke

Jedna od najuzbudljivijih značajki Micronauta je njegov mehanizam ubrizgavanja ovisnosti o vremenu. Većina okvira koristi refleksiju i proxyje za izvođenje injekcije ovisnosti tijekom izvođenja. Micronaut, međutim, svoje podatke o ubrizgavanju ovisnosti gradi u vrijeme sastavljanja. Rezultat je brže pokretanje aplikacije i manji otisci memorije.

Još jedna značajka je njegova prvoklasna podrška za reaktivno programiranje, kako za klijente, tako i za poslužitelje. Izbor određene reaktivne implementacije prepušten je programeru jer su podržani i RxJava i Project Reactor.

Micronaut također ima nekoliko značajki koje ga čine izvrsnim okvirom za razvoj nativnih aplikacija u oblaku. Podržava više alata za otkrivanje usluga kao što su Eureka i Consul, a također radi s različitim distribuiranim sustavima za praćenje poput Zipkina i Jaegera.

Također pruža podršku za stvaranje AWS lambda funkcija, što olakšava stvaranje aplikacija bez poslužitelja.

3. Početak rada

Najlakši način za početak je korištenje SDKMAN-a:

> sdk instaliraj micronaut 1.0.0.RC2

Ovim se instaliraju sve binarne datoteke koje su nam potrebne za izgradnju, testiranje i postavljanje Micronaut aplikacija. Također pruža i Micronaut CLI alat, koji nam omogućuje lako pokretanje novih projekata.

Binarni artefakti također su dostupni na Sonatype i GitHub.

U sljedećim odjeljcima razmotrit ćemo neke značajke okvira.

4. Injekcija ovisnosti

Kao što je ranije spomenuto, Micronaut obrađuje ubrizgavanje ovisnosti u vrijeme sastavljanja, što se razlikuje od većine IoC spremnika.

Međutim, još uvijek je u potpunosti podržava bilješke JSR-330 pa je rad s grahom sličan ostalim IoC okvirima.

Koristimo za automatsko spajanje graha u naš kôd @Ubrizgati:

@ Ubrizgavanje privatne usluge EmployeeService;

The @Ubrizgati napomena djeluje baš kao @Autowired i može se koristiti na poljima, metodama, konstruktorima i parametrima.

Prema zadanim postavkama, svi grah se primjenjuje kao prototip. Brzo možemo stvoriti jednobojni grah pomoću @Singleton. Ako više klasa implementira isto bean sučelje, @ Primarno može se koristiti za njihovo rješavanje:

@Primary @Singleton javna klasa BlueCar implementira automobil {}

The @ Zahtijeva napomena se može koristiti kada grah nije obvezan ili za automatsko ožičenje samo kada su zadovoljeni određeni uvjeti.

S tim u vezi, ponaša se slično kao Spring Boot @Uvjetno napomene:

@Singleton @Requires (grah = DataSource.class) @Requires (svojstvo = "omogućeno") @Requires (missingBeans = EmployeeService) @Requires (sdk = Sdk.JAVA, value = "1.8") javna klasa JdbcEfficieeService implementira EmployeeService {}

5. Izgradnja HTTP poslužitelja

Sada pogledajmo stvaranje jednostavne aplikacije HTTP poslužitelja. Za početak ćemo koristiti SDKMAN za izradu projekta:

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

To će stvoriti novi Java projekt koristeći Maven u direktoriju s imenom hello-world-server. Unutar ovog direktorija pronaći ćemo glavni izvorni kod aplikacije, Maven POM datoteku i druge datoteke podrške za projekt.

Zadana aplikacija koja je vrlo jednostavna:

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

5.1. Blokiranje HTTP-a

Ova aplikacija sama po sebi neće učiniti puno. Dodajmo kontroler koji ima dvije krajnje točke. Oboje će uzvratiti pozdrav, ali jedan će upotrijebiti znak DOBITI HTTP glagol, a drugi će koristiti POŠTA:

@Controller ("/ greet") javna klasa GreetController {@Inject private GreetingService pozdravService; @Get ("/ {name}") javni pozdrav niza (naziv niza) {return pozdravService.getGreeting () + ime; } @Post (value = "/ {name}", konzumira = MediaType.TEXT_PLAIN) javni String setGreeting (@Body String name) {return HelloService.getGreeting () + name; }}

5.2. Reaktivni IO

Prema zadanim postavkama, Micronaut će implementirati te krajnje točke koristeći tradicionalni blokirajući ulaz / izlaz. Međutim, možemo brzo implementirati neblokirajuće krajnje točke jednostavnom promjenom tipa povratka u bilo koji reaktivni neblokirajući tip.

Na primjer, s RxJavom možemo koristiti Uočljiv. Isto tako, kada koristimo Reactor, možemo se vratiti Mono ili Fluks tipovi podataka:

@Get ("/ {name}") javni Mono pozdrav (naziv niza) {return Mono.just (pozdravService.getGreeting () + ime); }

Za blokirajuće i neblokirajuće krajnje točke, Netty je osnovni poslužitelj koji se koristi za obradu HTTP zahtjeva.

Zahtjevi se obično obrađuju u glavnom spremištu I / O niti koji se kreira pri pokretanju, što ih čini blokiranim.

Međutim, kada se vrsta podataka koji ne blokira vraća s krajnje točke kontrolera, Micronaut koristi nit petlje događaja Netty, čineći cijeli zahtjev neblokirajućim.

6. Izgradnja HTTP klijenta

Izgradimo sada klijenta koji će potrošiti krajnje točke koje smo upravo stvorili. Micronaut pruža dva načina stvaranja HTTP klijenata:

  • Deklarativni HTTP klijent
  • Programski HTTP klijent

6.1 Deklarativni HTTP klijent

Prvi i najbrži način stvaranja je korištenje deklarativnog pristupa:

@Client ("/ greet") javno sučelje GreetingClient {@Get ("/ {name}") Pozdrav niza (naziv niza); }

Primijetite kako ne implementiramo nijedan kod za pozivanje naše službe. Umjesto toga, Micronaut razumije kako nazvati uslugu iz potpisa metode i bilješki koje smo pružili.

Da bismo testirali ovog klijenta, možemo stvoriti JUnit test koji koristi ugrađeni API poslužitelja za pokretanje ugrađene instance našeg poslužitelja:

javna klasa GreetingClientTest {privatni poslužitelj EmbeddedServer; privatni klijent GreetingClient; @ Prije javne void postavke () {server = ApplicationContext.run (EmbeddedServer.class); client = server.getApplicationContext (). getBean (GreetingClient.class); } @ Nakon javnog čišćenja praznina () {server.stop (); } @Test public void testGreeting () {assertEquals (client.greet ("Mike"), "Hello Mike"); }}

6.2. Programski HTTP klijent

Također imamo mogućnost pisanja tradicionalnijeg klijenta ako nam je potrebna veća kontrola nad njegovim ponašanjem i provedbom:

@Singleton javna klasa ConcreteGreetingClient {private RxHttpClient httpClient; javni ConcreteGreetingClient (@Client ("/") RxHttpClient httpClient) {this.httpClient = httpClient; } javni String pozdrav (naziv niza) {HttpRequest req = HttpRequest.GET ("/ greet /" + name); vratiti httpClient.retrieve (req) .blockingFirst (); } javni pojedinačni greetAsync (naziv niza) {HttpRequest req = HttpRequest.GET ("/ async / greet /" + name); return httpClient.retrieve (req) .first ("Došlo je do pogreške"); }}

Zadani HTTP klijent koristi RxJavu, tako da može lako raditi s blokiranjem ili neblokiranjem poziva.

7. Micronaut CLI

Već smo vidjeli Micronaut CLI alat u akciji gore kada smo ga koristili za izradu našeg uzorka projekta.

U našem smo slučaju stvorili samostalnu aplikaciju, ali ona ima i nekoliko drugih mogućnosti.

7.1. Projekti Federacije

U Micronautu je federacija samo skupina samostalnih aplikacija koje žive u istom direktoriju. Korištenjem federacija možemo lako upravljati njima zajedno i osigurati da dobiju iste zadane postavke i postavke.

Kada koristimo CLI alat za generiranje federacije, uzima sve iste argumente kao i create-app naredba. Stvorit će strukturu projekata najviše razine, a svaka samostalna aplikacija odatle će se stvoriti u svom poddirektorijumu.

7.2. Značajke

Prilikom izrade samostalne aplikacije ili federacije možemo odlučiti koje značajke treba naša aplikacija. To pomaže osigurati da minimalni skup ovisnosti bude uključen u projekt.

Značajke određujemo pomoću -usobnost argument i pružanje popisa imena obilježja odvojenih zarezom.

Popis dostupnih značajki možemo pronaći pokretanjem sljedeće naredbe:

> mn profil-info usluga Osigurane značajke: -------------------- * annotation-api - Dodaje Java anotacijski API * config-consul - Dodaje podršku za distribuiranu konfiguraciju s Consul * discovery-consul - Dodaje podršku za Service Discovery s Consul * discovery-eureka - Dodaje podršku za Service Discovery s Eureka * groovy - Stvara Groovy aplikaciju [...] Dostupno više značajki

7.3. Postojeći projekti

Također možemo koristiti CLI alat za izmjenu postojećih projekata. Omogućavajući nam da stvorimo grah, klijente, kontrolere i još mnogo toga. Kad pokrenemo mn naredba iz postojećeg projekta, imat ćemo na raspolaganju novi skup naredbi:

> mn pomoć | Naziv naredbe Opis naredbe ---------------------------------------------- - create-bean Stvara singleton bean create-client Stvara klijentsko sučelje create-controller Stvara kontroler i pridruženi test create-job Stvara posao planiranom metodom

8. Zaključak

U ovom kratkom uvodu u Micronaut, vidjeli smo kako je lako izgraditi i blokirajuće i neblokirajuće HTTP poslužitelje i klijente. Također, istražili smo neke značajke CLI-a.

Ali ovo je samo mali okus karakteristika koje nudi. Tu je i puna podrška za funkcije bez poslužitelja, otkrivanje usluga, distribuirano praćenje, nadzor i metrike, distribuirana konfiguracija i još mnogo toga.

I dok su mnoge njegove značajke izvedene iz postojećih okvira poput Grila i Proljeća, on također ima mnoštvo jedinstvenih značajki koje mu pomažu da se samostalno istakne.

Kao i uvijek, gore navedeni uzorak koda možemo pronaći u našem GitHub repo-u.