Pozdrav svima! Eto ga – naš završni post iz serije o Quarkusu! (Usput, pogledajte naš webinari . Prikazat ćemo kako započeti «od nule» ili prenijeti gotova rješenja)

U postu pregledali smo odgovarajuće alate kroz koje se mogu kvantitativno procijeniti poboljšanja koja su ostvarena modernizacijom Java aplikacija.
Počevši od verzije 0.17.0, podržava korištenje Advanced Message Queuing Protocol (), koji je otvoreni standard za prijenos poslovnih poruka između aplikacija ili organizacija.
– to je usluga izgrađena na temelju otvorenog projekta i provodi mehanizam razmjene poruka temeljen na platformi . Više o tome kako je to uređeno, pogledajte . Danas ćemo pokazati kako spojiti AMQ Online i Quarkus kako bismo izgradili moderni sustav razmjene poruka temeljen na OpenShiftu koristeći dvije nove tehnologije povezane s obradom poruka.
Pretpostavlja se da ste već implementirali AMQ Online na platformi OpenShift (ako niste, pogledajte ).
Na početku ćemo stvoriti Quarkus aplikaciju koja će predstavljati jednostavni sustav obrade narudžbi koristeći reaktivnu razmjenu poruka. Ova aplikacija će uključivati generatore narudžbi koji će slati narudžbe u red poruka prema fiksnom intervalu, kao i obradu narudžbi koja će obraditi poruke iz reda i formirati potvrde dostupne za pregled u pregledniku.
Nakon kreiranja aplikacije pokazat ćemo kako implementirati konfiguraciju sustava razmjene poruka i uključiti AMQ Online kako bismo inicijalizirali potrebne resurse na ovom sustavu.
Quarkus aplikacija
Naša Quarkus aplikacija radi na OpenShiftu i predstavlja modificiranu verziju programa . Potpuni primjer klijentskog dijela možete pronaći .
Generator narudžbi
Generator svakih 5 sekundi jednostavno monotono šalje rastuće identifikatore narudžbi na adresu «orders».
@ApplicationScoped
public class OrderGenerator {
private int orderId = 1;
@Outgoing("orders")
public Flowable generate() {
return Flowable.interval(5, TimeUnit.SECONDS)
.map(tick -> orderId++);
}
}
Obraditelj narudžbi
Obrada narudžbi je još jednostavnija, samo vraća identifikator potvrde na adresu „confirmations“.
@ApplicationScoped
public class OrderProcessor {
@Incoming("orders")
@Outgoing("confirmations")
public Integer process(Integer order) {
// Identifikator potvrde je dvostruko veći od identifikatora narudžbe <img draggable="false" class="emoji" alt=":-)" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f642.svg">
return order * 2;
}
}
Resursi potvrde
Resurs potvrde je HTTP krajnja tačka za popis potvrda generiranih radom naše aplikacije.
@Path("/confirmations")
public class ConfirmationResource {
@Inject
@Stream("confirmations") Publisher orders;
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "hello";
}
@GET
@Path("/stream")
@Produces(MediaType.SERVER_SENT_EVENTS)
public Publisher stream() {
return orders;
}
}
Podešavanje
Za povezivanje s AMQ Online, našoj aplikaciji bit će potrebni neki konfiguracijski podaci, a to su: konfiguracija Quarkus konektora, informacije o AMQP krajnjoj tački i korisnički kredencijali. Najbolje je, naravno, držati sve konfiguracijske podatke na jednom mestu, ali ćemo ih namerno razdvojiti kako bismo prikazali moguće opcije za podešavanje aplikacije Quarkus.
Konektori
Konfiguracija konektora može se pružiti u fazi kompilacije pomoću datoteke svojstava aplikacije:
mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp
Kako bismo olakšali, koristićemo red poruka samo za adresu „orders“. A adresa „confirmations“ u našoj aplikaciji koristiće red u memoriji.
AMQP krajnja tačka
Tokom kompilacije ime domaćina i broj porta za AMQP krajnju tačku nisu poznati, pa ih je potrebno uvesti. Krajnju tačku možemo odrediti u configmap-u koji kreira AMQ Online, pa ćemo ih definisati putem promenljivih okruženja u manifestu aplikacije:
spec:
template:
spec:
containers:
- env:
- name: AMQP_HOST
valueFrom:
configMapKeyRef:
name: quarkus-config
key: service.host
- name: AMQP_PORT
valueFrom:
configMapKeyRef:
name: quarkus-config
key: service.port.amqp
Kredencijali
Token za servisni račun može se koristiti za autentifikaciju naše aplikacije u OpenShift-u. Da bismo to učinili, prvo treba da kreiramo prilagođeni ConfigSource koji će čitati token za autentifikaciju iz datotečnog sistema pod-a:
public class MessagingCredentialsConfigSource implements ConfigSource {
private static final Set propertyNames;
static {
propertyNames = new HashSet();
propertyNames.add("amqp-username");
propertyNames.add("amqp-password");
}
@Override
public Set getPropertyNames() {
return propertyNames;
}
@Override
public Map getProperties() {
try {
Map properties = new HashMap();
properties.put("amqp-username", "@@serviceaccount@@");
properties.put("amqp-password", readTokenFromFile());
return properties;
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
@Override
public String getValue(String key) {
if ("amqp-username".equals(key)) {
return "@@serviceaccount@@";
}
if ("amqp-password".equals(key)) {
try {
return readTokenFromFile();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
return null;
}
@Override
public String getName() {
return "messaging-credentials-config";
}
private static String readTokenFromFile() throws IOException {
return new String(Files.readAllBytes(Paths.get("/var/run/secrets/kubernetes.io/serviceaccount/token")), StandardCharsets.UTF_8);
}
}
Izgradnja i implementacija aplikacije
Budući da aplikaciju treba konvertirati u izvršnu datoteku, biće potreban virtualni stroj GraalVM. Više informacija o tome kako postaviti ovo okruženje možete pronaći u .
Nakon toga, slijedeći upute tamo, potrebno je preuzeti izvorni kod, izvršiti izgradnju i implementirati našu aplikaciju:
git clone https://github.com/EnMasseProject/enmasse-example-clients
cd enmasse-example-clients/quarkus-example-client
oc new-project myapp
mvn -Pnative -Dfabric8.mode=openshift -Dfabric8.build.strategy=docker package fabric8:build fabric8:resource fabric8:apply
Nakon ovih komandi aplikacija će biti implementirana, ali se neće pokrenuti dok ne postavimo potrebne resurse za razmjenu poruka u AMQ Online.
Postavljanje sustava razmjene poruka
Sada je potrebno definirati resurse unutar sustava razmjene poruka koji su potrebni našoj aplikaciji. Za to treba stvoriti: 1) adresni prostor za inicijalizaciju krajnje točke sustava razmjene poruka; 2) adresu za postavljanje adresa koje koristimo u aplikaciji; 3) korisnika sustava razmjene poruka kako bismo definirali klijentske vjerodajnice.
Adresni prostor
Objekt AddressSpace u AMQ Online predstavlja skup adresa koje zajednički koriste krajnje točke povezivanja, kao i politike autentifikacije i autorizacije. Prilikom stvaranja adresnog prostora, možete definirati na koji način će krajnje točke sustava razmjene poruka biti dostupne:
apiVersion: enmasse.io/v1beta1
kind: AddressSpace
metadata:
name: quarkus-example
spec:
type: brokered
plan: brokered-single-broker
endpoints:
- name: messaging
service: messaging
exports:
- name: quarkus-config
kind: configmap
Adresa
Adrese se koriste za slanje i primanje poruka. Svaka adresa ima tip koji određuje njenu semantiku, kao i plan koji postavlja količinu rezerviranih resursa. Adresa se može definisati ovako:
apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
name: quarkus-example.orders
spec:
address: orders
type: queue
plan: brokered-queue
Korisnik sistema za razmenu poruka
Da bi samo pouzdane aplikacije mogle slati i primati poruke na vaše adrese, potrebno je kreirati korisnika u sistemu za razmenu poruka. Za aplikacije koje rade u klasteru, klijente se može autentifikovati pomoću naloga usluge OpenShift. Korisnika 'serviceaccount' može se definisati ovako:
apiVersion: user.enmasse.io/v1beta1
kind: MessagingUser
metadata:
name: quarkus-example.app
spec:
username: system:serviceaccount:myapp:default
authentication:
type: serviceaccount
authorization:
- operations: ["send", "recv"]
addresses: ["orders"]
Dozvole za podešavanje aplikacije
Da bi AMQ Online mogao kreirati configmap koji smo koristili za implementaciju informacija o AMQP tački, treba definisati ulogu i vezu uloge (Role i RoleBinding):
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: quarkus-config
spec:
rules:
- apiGroups: [ "" ]
resources: [ "configmaps" ]
verbs: [ "create" ]
- apiGroups: [ "" ]
resources: [ "configmaps" ]
resourceNames: [ "quarkus-config" ]
verbs: [ "get", "update", "patch" ]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: quarkus-config
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: quarkus-config
subjects:
- kind: ServiceAccount
name: address-space-controller
namespace: amq-online-infra
Kako primeniti konfiguracije
Konfiguraciju sistema za razmenu poruka možete primeniti ovako:
cd enmasse-example-clients/quarkus-example-client
oc project myapp
oc apply -f src/main/resources/k8s/addressspace
oc apply -f src/main/resources/k8s/address
Verifikacija aplikacije
Da bismo proverili da li je aplikacija pokrenuta, prvo ćemo proveriti da li su odgovarajuće adrese kreirane i aktivne:
until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Još nije spremno"; sleep 5; done
Zatim ćemo proveriti URL aplikacijske rute (samo ćemo otvoriti ovu adresu u pretraživaču):
echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"
U pretraživaču bi trebalo da vidite da se tiketi povremeno ažuriraju kako se poruke šalju i primaju u AMQ Online.
Zaključujemo
Dakle, napisali smo Quarkus aplikaciju koja koristi AMQP za razmjenu poruka, postavili smo tu aplikaciju za rad na platformi Red Hat OpenShift, te implementirali njenu konfiguraciju na temelju konfiguracije AMQ Online. Zatim smo stvorili manifeste potrebne za inicijalizaciju sustava za razmjenu poruka za našu aplikaciju.
Time završavamo seriju o Quarkusu, ali nas očekuje mnogo novih i zanimljivih sadržaja, ostanite s nama!
Izvor: habr.com
