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.