Izgradnja mikrousluga s Eclipse MicroProfileom

1. Pregled

U ovom ćemo se članku usredotočiti na izgradnju mikrousluge temeljenu na Eclipse MicroProfileu.

Pogledat ćemo kako napisati RESTful web aplikaciju pomoću JAX-RS, CDI i JSON-P API-ja.

2. Arhitektura mikroservisa

Jednostavno rečeno, mikro usluge su stil softverske arhitekture koji tvori cjeloviti sustav kao zbirku nekoliko neovisnih usluga.

Svaki se fokusira na jedan funkcionalni opseg i komunicira s ostalima jezično-agnostičkim protokolom, kao što je REST.

3. Eclipse MicroProfile

Eclipse MicroProfile inicijativa je čiji je cilj optimizirati Enterprise Java za arhitekturu Microservices. Temelji se na podskupu API-ja Jakarta EE WebProfile, tako da možemo graditi MicroProfile aplikacije kao što gradimo one Jakarta EE.

Cilj MicroProfilea je definirati standardne API-je za izgradnju mikroservisa i isporučiti prijenosne aplikacije kroz više vremena izvršavanja MicroProfilea.

4. Ovisnosti Mavena

Sve ovisnosti potrebne za izgradnju aplikacije Eclipse MicroProfile pružaju ove BOM (Bill of Materials) ovisnosti:

 org.eclipse.microprofile microprofile 1.2 pom pod uvjetom 

Opseg je postavljen kao pod uvjetom jer MicroProfile vrijeme izvođenja već uključuje API i implementaciju.

5. Model reprezentacije

Počnimo s izradom brze klase resursa:

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

Kao što vidimo, o tome nema napomena Knjiga razred.

6. Korištenje CDI-a

Jednostavno rečeno, CDI je API koji pruža ubrizgavanje ovisnosti i upravljanje životnim ciklusom. Pojednostavljuje upotrebu graha Enterprise u web aplikacijama.

Stvorimo sada CDI upravljani grah kao trgovinu za predstavljanje knjiga:

@ApplicationScoped javna klasa BookManager {private ConcurrentMap inMemoryStore = new ConcurrentHashMap (); public String add (Book book) {// ...} public Book get (String id) {// ...} public List getAll () {// ...}} 

Ovu klasu bilježimo s @ApplicationScoped jer nam treba samo jedna instanca čije stanje dijele svi klijenti. Za to smo koristili a Istodobna karta kao tipično spremište podataka u memoriji. Zatim smo dodali metode za CRUD operacijama.

Sada je naš grah spreman za CDI i može se ubrizgati u grah BookEndpoint pomoću the @Ubrizgati bilješka.

7. JAX-RS API

Da bismo stvorili REST aplikaciju s JAX-RS, moramo stvoriti Primjena razred označen sa @ApplicationPath i resurs označen s @Staza.

7.1. JAX RS aplikacija

JAX-RS aplikacija identificira osnovni URI pod kojim izlažemo resurs u web aplikaciji.

Stvorimo sljedeću JAX-RS aplikaciju:

@ApplicationPath ("/ library") javna klasa LibraryApplication proširuje aplikaciju {}

U ovom su primjeru sve klase resursa JAX-RS u web aplikaciji povezane s LibraryApplication čineći ih pod istim knjižnica putanja, to je vrijednost Bilješka ApplicationPath.

Ova označena klasa govori JAX RS runtimeu da bi trebala automatski pronaći resurse i izložiti ih.

7.2. Krajnja točka JAX RS

An Krajnja točka razred, također nazvan Resurs klase, trebao bi definirati jedan resurs, iako su mnogi isti tipovi tehnički mogući.

Svaka je klasa Java označena s @Staza, ili s barem jednom označenom metodom @Path ili @HttpMethod je Krajnja točka.

Sada ćemo stvoriti JAX-RS krajnju točku koja izlaže taj prikaz:

@Path ("knjige") @RequestScoped javna klasa BookEndpoint {@Inject private BookManager bookManager; @GET @Path ("{id}") @Produces (MediaType.APPLICATION_JSON) javni odgovor getBook (@PathParam ("id") String id) {return Response.ok (bookManager.get (id)). Build (); } @GET @Produces (MediaType.APPLICATION_JSON) javni odgovor getAllBooks () {return Response.ok (bookManager.getAll ()). Build (); } @POST @Consumes (MediaType.APPLICATION_JSON) javni odgovor na odgovor (knjiga knjiga) {String bookId = bookManager.add (knjiga); vratiti Response.created (UriBuilder.fromResource (this.getClass ()). path (bookId) .build ()) .build (); }} 

U ovom trenutku možemo pristupiti BookEndpoint Resurs pod / knjižnica / knjige put u web aplikaciji.

7.3. Vrsta medija JAX RS JSON

JAX RS podržava mnoge vrste medija za komunikaciju s REST klijentima, ali Eclipse MicroProfile ograničava upotrebu JSON-a jer određuje upotrebu JSOP-P API-ja. Kao takvi, svoje metode moramo označiti s @ Potrošnja (MediaType.APPLICATION_JSON) i @Izrađuje (MediaType.APPLICATION_JSON).

The @ Potrošnja napomena ograničava prihvaćene formate - u ovom je primjeru prihvaćen samo format podataka JSON. Zaglavlje HTTP zahtjeva Vrsta sadržaja trebalo bi aplikacija / json.

Ista ideja stoji i iza @Proizvodi bilješka. JAX RS Runtime trebao bi odrediti odgovor na JSON format. HTTP zaglavlje zahtjeva Prihvatiti trebalo bi aplikacija / json.

8. JSON-P

JAX RS Runtime podržava JSON-P izravno iz kutije kako bismo ga mogli koristiti JsonObject kao ulazni parametar metode ili povratni tip.

Ali u stvarnom svijetu često radimo na POJO tečajevima. Dakle, trebamo način za mapiranje između JsonObject i POJO. Evo kamo ide igrati pružatelj JAX RS entiteta.

Za marširanje JSON ulaznog toka na Knjiga POJO, to poziva metodu resursa s parametrom tipa Knjiga, moramo stvoriti razred BookMessageBodyReader:

@Provider @Consumes (MediaType.APPLICATION_JSON) javna klasa BookMessageBodyReader implementira MessageBodyReader {@Override public boolean isReadable (Class type, Type genericType, Annotation [] annotations, MediaType mediaType) {return type.equals (Book.class); } @Override public Book readFrom (Vrsta klase, Tip generičkiTip, Napomena [], napomene MediaType, MultivaluedMap httpHeaders, InputStream entityStream) baca IOException, WebApplicationException {return BookMapper.map (entityStream); }} 

Isti postupak radimo i na uklanjanju a Knjiga u JSON izlazni tok, koji poziva metodu resursa čiji je povratni tip Knjiga, stvaranjem a BookMessageBodyWriter:

@Provider @Produces (MediaType.APPLICATION_JSON) javna klasa BookMessageBodyWriter implementira MessageBodyWriter {@Override public boolean isWriteable (Class type, Type genericType, Annotation [] annotations, MediaType mediaType) {return type.equals (Book.class); } // ... @Override public void writeTo (Book book, Class class, type genericType, Annotation [] annotations, MediaType mediaType, MultivaluedMap httpHeaders, OutputStream entityStream) baca IOException, WebApplicationException {JsonWriter jsonWriter = JsonWriter = JsonWriter = JsonWriteer = JsonWriter = JsonWriter = JonWriter = JonWriter = JS JsonObject jsonObject = BookMapper.map (knjiga); jsonWriter.writeObject (jsonObject); jsonWriter.close (); }} 

Kao BookMessageBodyReader i BookMessageBodyWriter su označeni sa @Provider, automatski ih registrira JAX RS runtime.

9. Izrada i pokretanje aplikacije

Aplikacija MicroProfile je prijenosna i trebala bi se izvoditi u bilo kojem sukladnom MicroProfile vremenu izvođenja. Objasnit ćemo vam kako izraditi i pokrenuti našu aplikaciju u programu Open Liberty, ali možemo koristiti bilo koji usklađeni Eclipse MicroProfile.

Vrijeme izvođenja Open Liberty konfiguriramo putem datoteke za konfiguriranje poslužitelj.xml:

  jaxrs-2.0 cdi-1.2 jsonp-1.0 

Dodajmo dodatak liberty-maven-plugin na naš pom.xml:

  net.wasdev.wlp.maven.plugins liberty-maven-plugin 2.1.2 io.openliberty openliberty-runtime 17.0.0.4 zip $ {basedir} /src/main/liberty/config/server.xml $ {package.file} $ {package.type} false project / $ {project.artifactId} - $ {project.version} .war 9080 9443 install-server pripremni paket install-server create-server install-feature paket-server-with-apps paket install- paket-poslužitelj aplikacija 

Ovaj se dodatak može konfigurirati i sadrži niz svojstava:

  knjižnica $ {project.build.directory} / $ {app.name} -service.jar koja se može pokrenuti 

Gore navedeni cilj exec stvara izvršnu jar datoteku, tako da će naša aplikacija biti neovisna mikro usluga koja se može instalirati i pokretati u izolaciji. Također ga možemo rasporediti kao Dockerovu sliku.

Da biste stvorili izvršnu jar, pokrenite sljedeću naredbu:

mvn paket 

A da bismo pokrenuli našu mikro uslugu, koristimo ovu naredbu:

java -jar cilj / knjižnica-usluga.jar

Ovo će pokrenuti Open Liberty vrijeme izvođenja i implementirati našu uslugu. Našoj krajnjoj točki i pristupu svim knjigama možemo pristupiti na ovom URL-u:

uvojak // localhost: 9080 / knjižnica / knjige

Rezultat je JSON:

[{"id": "0001-201802", "isbn": "1", "name": "Izgradnja mikroservisa s MicroProfileom Eclipse", "autor": "baeldung", "stranice": 420}] 

Da bismo dobili jednu knjigu, tražimo ovaj URL:

uvojak // localhost: 9080 / library / books / 0001-201802

A rezultat je JSON:

{"id": "0001-201802", "isbn": "1", "name": "Izgradnja mikroservisa s MicroProfileom Eclipse", "author": "baeldung", "pages": 420}

Sada ćemo dodati novu knjigu interakcijom s API-jem:

curl -H "Content-Type: application / json" -X POST -d '{"isbn": "22", "name": "Gradle u akciji", "author": "baeldung", "pages": 420 } '// localhost: 9080 / library / books 

Kao što vidimo, status odgovora je 201, što znači da je knjiga uspješno stvorena, a Mjesto je URI putem kojeg mu možemo pristupiti:

<HTTP / 1.1 201 stvoreno <Mjesto: // localhost: 9080 / library / books / 0009-201802

10. Zaključak

Ovaj je članak demonstrirao kako izraditi jednostavnu mikro uslugu temeljenu na Eclipse MicroProfileu, raspravljajući o JAX RS, JSON-P i CDI.

Kôd je dostupan na Github-u; ovo je projekt zasnovan na Mavenu, pa bi ga trebalo jednostavno uvesti i pokrenuti kakav jest.


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