Opbygning af mikrotjenester med Eclipse MicroProfile

1. Oversigt

I denne artikel fokuserer vi på at opbygge en mikroservice baseret på Eclipse MicroProfile.

Vi ser på, hvordan man skriver en RESTful webapplikation ved hjælp af JAX-RS, CDI og JSON-P API'er.

2. En mikroservicearkitektur

Kort sagt, mikrotjenester er en softwarearkitekturstil, der danner et komplet system som en samling af flere uafhængige tjenester.

Hver enkelt fokuserer på en funktionel omkreds og kommunikerer til de andre med en sprogagnostisk protokol, såsom REST.

3. Eclipse MicroProfile

Eclipse MicroProfile er et initiativ, der har til formål at optimere Enterprise Java til Microservices-arkitekturen. Det er baseret på en delmængde af Jakarta EE WebProfile API'er, så vi kan opbygge MicroProfile-applikationer, som vi bygger Jakarta EE.

Målet med MicroProfile er at definere standard API'er til opbygning af mikrotjenester og levere bærbare applikationer på tværs af flere MicroProfile-driftstider.

4. Maven-afhængigheder

Alle afhængigheder, der kræves for at opbygge en Eclipse MicroProfile-applikation, leveres af denne afhængighed af stykliste (Bill of Materials):

 org.eclipse.microprofile microprofile 1.2 pom forudsat 

Omfanget er angivet som stillet til rådighed fordi MicroProfile-runtime allerede inkluderer API og implementering.

5. Repræsentationsmodel

Lad os starte med at oprette en hurtig ressource klasse:

public class Book {privat streng-id; privat strengnavn; privat strengforfatter; private heltalssider; // ...}

Som vi kan se, er der ingen kommentar om dette Bestil klasse.

6. Brug af CDI

Kort sagt, CDI er en API, der giver afhængighedsindsprøjtning og livscyklusadministration. Det forenkler brugen af ​​Enterprise bønner i webapplikationer.

Lad os nu oprette en CDI-styret bønne som en butik til bogrepræsentationen:

@ApplicationScoped offentlig klasse BookManager {privat ConcurrentMap inMemoryStore = ny ConcurrentHashMap (); public String add (Book book) {// ...} public Book get (String id) {// ...} public List getAll () {// ...}} 

Vi kommenterer denne klasse med @ApplicationScoped fordi vi kun har brug for en forekomst, hvis tilstand deles af alle klienter. Til det brugte vi en ConcurrentMap som en typesikker datalager i hukommelsen. Derefter tilføjede vi metoder til CRUD operationer.

Nu er vores bønne en CDI klar og kan injiceres i bønnen BookEndpoint ved hjælp af det @Indsprøjte kommentar.

7. JAX-RS API

For at oprette en REST-applikation med JAX-RS skal vi oprette en Ansøgning klasse kommenteret med @ApplicationPath og en ressource, der er kommenteret med @Sti.

7.1. JAX RS-applikation

JAX-RS-applikationen identificerer den basale URI, under hvilken vi eksponerer ressourcen i en webapplikation.

Lad os oprette følgende JAX-RS-applikation:

@ApplicationPath ("/ library") offentlig klasse LibraryApplication udvider applikationen {}

I dette eksempel er alle JAX-RS-ressourceklasser i webapplikationen knyttet til LibraryApplication gør dem under det samme bibliotek sti, det er værdien af ApplicationPath-kommentar.

Denne kommenterede klasse fortæller JAX RS-runtime, at den skal finde ressourcer automatisk og udsætte dem.

7.2. JAX RS slutpunkt

En Slutpunkt klasse, også kaldet Ressource klasse, skal definere en ressource, selvom mange af de samme typer er teknisk mulige.

Hver Java-klasse kommenteret med @Stieller med mindst en metode, der er kommenteret med @Path eller @HttpMethod er et slutpunkt.

Nu opretter vi et JAX-RS-slutpunkt, der afslører denne repræsentation:

@Path ("bøger") @RequestScoped offentlig klasse BookEndpoint {@Inject private BookManager bookManager; @GET @Path ("{id}") @Produces (MediaType.APPLICATION_JSON) offentlig Svar getBook (@PathParam ("id") Streng-id) {return Response.ok (bookManager.get (id)). Build (); } @GET @Produces (MediaType.APPLICATION_JSON) public Response getAllBooks () {return Response.ok (bookManager.getAll ()). Build (); } @POST @Consumes (MediaType.APPLICATION_JSON) public Response add (Book book) {String bookId = bookManager.add (book); returnere Response.created (UriBuilder.fromResource (this.getClass ()) .path (bookId) .build ()) .build (); }} 

På dette tidspunkt har vi adgang til BookEndpoint Ressource under / bibliotek / bøger sti i webapplikationen.

7.3. JAX RS JSON Medietype

JAX RS understøtter mange medietyper til kommunikation med REST-klienter, men Eclipse MicroProfile begrænser brugen af ​​JSON da det specificerer brugen af ​​JSOP-P API. Som sådan er vi nødt til at kommentere vores metoder med @Forbrug (MediaType.APPLICATION_JSON) og @Producerer (MediaType.APPLICATION_JSON).

Det @Forbruger annotering begrænser de accepterede formater - i dette eksempel accepteres kun JSON-dataformat. HTTP-anmodningens overskrift Indholdstype burde være ansøgning / json.

Den samme idé ligger bag @Produces kommentar. JAX RS Runtime skal føre svar på JSON-format. Anmodningens HTTP-overskrift Acceptere burde være ansøgning / json.

8. JSON-P

JAX RS Runtime understøtter JSON-P ud af kassen, så vi kan bruge JsonObject som en metodeindgangsparameter eller returtype.

Men i den virkelige verden arbejder vi ofte med POJO-klasser. Så vi har brug for en måde at gøre kortlægningen imellem JsonObject og POJO. Her spiller JAX RS-enhedsproducenten for at spille.

Til marskalering af JSON-indgangsstrøm til Bestil POJO, det påkalder en ressourcemetode med en parameter af typen Bestil, vi er nødt til at oprette en klasse BookMessageBodyReader:

@Provider @Consumes (MediaType.APPLICATION_JSON) public class BookMessageBodyReader implementerer MessageBodyReader {@Override public boolean isReadable (Class type, Type genericType, Annotation [] annotations, MediaType mediaType) {return type.equals (Book.class); } @ Override public Book readFrom (Class type, Type genericType, Annotation [] annotations, MediaType mediaType, MultivaluedMap httpHeaders, InputStream entityStream) kaster IOException, WebApplicationException {return BookMapper.map (entityStream); }} 

Vi gør den samme proces for at unmarshal a Bestil til JSON-outputstrøm, der påkalder en ressourcemetode, hvis returtype er Bestil, ved at oprette en BookMessageBodyWriter:

@Provider @Produces (MediaType.APPLICATION_JSON) offentlig klasse BookMessageBodyWriter implementerer 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 type, Type genericType, Annotation [] annotations, MediaType mediaType, MultivaluedMap httpHeaders, OutputStream entityStream) throw IOException, WebApplicationException {JsonWriter jsonWriter = Json.createWriter; JsonObject jsonObject = BookMapper.map (bog); jsonWriter.writeObject (jsonObject); jsonWriter.close (); }} 

Som BookMessageBodyReader og BookMessageBodyWriter er kommenteret med @Udbyder, de registreres automatisk af JAX RS-runtime.

9. Opbygning og drift af applikationen

En MicroProfile-applikation er bærbar og skal køre i enhver kompatibel MicroProfile-runtime. Vi forklarer, hvordan vi bygger og kører vores applikation i Open Liberty, men vi kan bruge enhver kompatibel Eclipse MicroProfile.

Vi konfigurerer Open Liberty runtime gennem en konfigurationsfil server.xml:

  jaxrs-2.0 cdi-1.2 jsonp-1.0 

Lad os tilføje pluginet liberty-maven-plugin til vores 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} $ {packaging.type} falsk projekt / $ {project.artifactId} - $ {project.version} .war 9080 9443 install-server forberedelsespakke install-server opret-server installations-funktion pakke-server-med-apps pakkeinstallation- apps pakke-server 

Dette plugin kan konfigureres med et sæt egenskaber:

  biblioteket $ {project.build.directory} / $ {app.name} -service.jar kan køres 

Ovenstående exec-mål producerer en eksekverbar jar-fil, så vores applikation vil være en uafhængig mikroservice, der kan implementeres og køres isoleret. Vi kan også implementere det som Docker-billede.

For at oprette en eksekverbar krukke skal du køre følgende kommando:

mvn-pakke 

Og for at køre vores mikroservice bruger vi denne kommando:

java -jar target / library-service.jar

Dette starter Open Liberty runtime og implementerer vores service. Vi kan få adgang til vores slutpunkt og få alle bøger på denne URL:

krølle // localhost: 9080 / bibliotek / bøger

Resultatet er en JSON:

[{"id": "0001-201802", "isbn": "1", "name": "Bygning af mikroservice med Eclipse MicroProfile", "author": "baeldung", "pages": 420}] 

For at få en enkelt bog anmoder vi om denne URL:

krølle // localhost: 9080 / bibliotek / bøger / 0001-201802

Og resultatet er JSON:

{"id": "0001-201802", "isbn": "1", "name": "Opbygning af mikroservice med Eclipse MicroProfile", "author": "baeldung", "pages": 420}

Nu tilføjer vi en ny bog ved at interagere med API:

krølle -H "Content-Type: application / json" -X POST -d '{"isbn": "22", "name": "Gradle in Action", "author": "baeldung", "pages": 420 } '// localhost: 9080 / bibliotek / bøger 

Som vi kan se, er status for svaret 201, hvilket indikerer, at bogen blev oprettet med succes, og Beliggenhed er den URI, hvormed vi kan få adgang til den:

<HTTP / 1.1 201 Oprettet <Sted: // localhost: 9080 / bibliotek / bøger / 0009-201802

10. Konklusion

Denne artikel demonstrerede, hvordan man bygger en simpel mikroservice baseret på Eclipse MicroProfile, der diskuterer JAX RS, JSON-P og CDI.

Koden er tilgængelig på Github; dette er et Maven-baseret projekt, så det skal være enkelt at importere og køre som det er.


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