Tere kõigile! Siin ta on – meie viimane postitus Quarkuse seerias! (Üksikasjalikke arutelusid näete meie veebiseminaril . Näitame, kuidas alustada „nullist“ või migreerida valmis lahendusi)

V Postituses vaatleme vastavaid tööriistu, millega saab kvantitatiivselt hinnata Java rakenduste moderniseerimisega saadud täiustusi.
Alates versioonist 0.17.0 toetab Advanced Message Queuing Protocol'i (), mis on avatud standard ärisõnumite vahetamiseks rakenduste või organisatsioonide vahel.
on teenus, mis põhineb avatud projektil ja rakendab sõnumite vahetamise mehhanismi . Lisainfot selle kohta leiate . Täna näitame, kuidas ühendada AMQ Online ja Quarkus, et üles ehitada kaasaegne sõnumite vahetussüsteem OpenShiftis, kasutades kahte uut tehnoloogiat, mis on seotud sõnumite töötlemisega.
Eeldatakse, et olete juba käivitanud AMQ Online'i OpenShift platvormil (kui ei, vaadake ).
Alguses loome Quarkus rakenduse, mis esindab lihtsat tellimuste töötlemise süsteemi, kasutades reaktiivset sõnumivahetust. See rakendus hõlmab tellimuste generaatorit, mis saadab tellimusi sõnumijärjekorda kindla ajavahemiku järel, ja samuti tellimuste töötlejat, mis töötleb sõnumeid järjekorrast ning loob kinnitused, mida saab veebibrauseris vaadata.
Pärast rakenduse loomist näitame, kuidas integreerida sellesse sõnumivahetussüsteemi seadistust ja kasutame AMQ Online'i, et käivitada vajalikud ressursid selle süsteemis.
Quarkus rakendus
Meie Quarkus rakendus töötab OpenShiftis ja on modifitseeritud versioon programmist . Täieliku kliendiosa näite leiab .
Tellimuste generaator
Generaator saadab iga 5 sekundi järel lihtsalt monotoolselt kasvavaid tellimuse identifikaatoreid aadressile «orders».
@ApplicationScoped
public class OrderGenerator {
private int orderId = 1;
@Outgoing("orders")
public Flowable generate() {
return Flowable.interval(5, TimeUnit.SECONDS)
.map(tick -> orderId++);
}
}
Tellimuste töötleja
Tellimuste töötleja on veelgi lihtsam, see tagastab lihtsalt kinnituse tuvastaja aadressile "confirmations".
@ApplicationScoped
public class OrderProcessor {
@Incoming("orders")
@Outgoing("confirmations")
public Integer process(Integer order) {
// Kinnitusidentifikaator on tellimuse identifikaatori kahekordne väärtus <img draggable="false" class="emoji" alt=":-)" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f642.svg">
return order * 2;
}
}
Kinnitamise ressursid
Kinnitamise ressurss on HTTP lõpp-punkt, mis loetleb meie rakenduse töö tulemusena genereeritud kinnitusi.
@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;
}
}
Seadistamine
AMQ Online'i ühendamiseks vajab meie rakendus mõned konfiguratsioonid, sealhulgas Quarkuse liidese konfiguratsioon, AMQP lõpp-punkti andmed ja kliendi sisselogimise andmed. Parim on hoida kõik konfiguratsioonid ühes kohas, kuid me jagame need sihilikult, et näidata võimalikke Quarkuse rakenduse seadistamise variante.
Liidesed
Liidese konfiguratsiooni saab esitada kompileerimise käigus rakenduse omaduste faili kaudu:
mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp
Lihtsustamiseks kasutame sõnumijärjekorda ainult aadressile «orders». Aadress «confirmations» meie rakenduses kasutab aga mälu järjekorda.
AMQP lõpp-punkt
Kompileerimise etapis ei ole AMQP lõpp-punkti hosti nime ja porta number teada, seega tuleb need sisestada. Lõpp-punkti saab määratleda configmap'is, mille loob AMQ Online, seega määrame need meie rakenduse manifestis keskkonnamuutujate kaudu:
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
Krediteerimine
Teenusekonto märk võib meie rakenduse autentimiseks OpenShiftis kasutada. Selleks tuleb esmalt luua kohandatud ConfigSource, mis loeb autentimismärgi pod'i failisüsteemist:
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);
}
}
Rakenduse koostamine ja paigaldamine
Kuna rakendus tuleb kompileerida töötatavaks failiks, on vajalik GraalVM virtuaalmasin. Lisainfot keskkonna seadistamise kohta leiate vastavatest juhenditest .
Seejärel järgige seal antud juhiseid, et alla laadida lähtekood, koostada ja juurutada meie rakendust:
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
Pärast neid käske rakendus juurutatakse, kuid see ei käivitu enne, kuni oleme AMQ Online'is seadistatud vajalikud sõnumivahetuse ressursid.
Sõnumivahetussüsteemi seadistamine
Nüüd jääb meil seadistada sõnumivahetussüsteemis ressursid, mida meie rakendus vajab. Selleks tuleb luua: 1) aadressiruumi, et initsialiseerida sõnumivahetussüsteemi lõpp-punkt; 2) aadress, et seadistada rakenduses kasutatavad aadressid; 3) sõnumivahetussüsteemi kasutaja, et määrata kliendi mandaat.
Aadressiruumi
AMQ Online'i AddressSpace objekt on aadresside rühm, mis jagavad ühiselt ühenduspunktide lõppepunkte ning autentimise ja autoriseerimise poliitikaid. Aadressiruumi loomisel saab määrata, kuidas sõnumite vahetuse süsteemi lõppepunkte antakse:
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
Aadressid
Aadresse kasutatakse sõnumite saatmiseks ja vastuvõtmiseks. Igal aadressil on tüüp, mis määrab selle semantika, ja plaan, mis määrab reserveeritavate ressursside arvu. Aadressi saab määratleda näiteks järgmiselt:
apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
name: quarkus-example.orders
spec:
address: orders
type: queue
plan: brokered-queue
Sõnumite vahetuse süsteemi kasutaja
Et sõnumite saatmine ja vastuvõtmine teie aadresside kaudu oleks võimalik ainult usaldusväärsetele rakendustele, peab sõnumite vahetuse süsteemis olema loodud kasutaja. Klastri põhjal töötavatele rakendustele saab kliente autentida OpenShift'i teenusekonto abil. Kasutajat "serviceaccount" saab määratleda näiteks järgmiselt:
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"]
Rakenduse seadistamise õigused
Et AMQ Online saaks luua configmap'i, mida kasutasime AMQP lõpp-punkti andmete rakendamiseks, on vajalik määrata roll ja rolli sidumine (Role ja 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
Kuidas rakendada konfiguratsioone
Süsteemi sõnumivahetuse konfiguratsiooni saab rakendada järgmiselt:
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
Rakenduse kontrollimine
Et veenduda, et rakendus on käivitunud, kontrollime esmalt, kas vastavad aadressid on loodud ja aktiivsed:
until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Not yet ready"; sleep 5; done
Seejärel kontrollime rakenduse marsruudi URL-i (ava lihtsalt see aadress brauseris):
echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"
Brauseris peaks olema nähtav, et pileteid uuendatakse regulaarselt, kui sõnumeid saadetakse ja vastu võetakse AMQ Online.
Teeme kokkuvõtteid
Nii et oleme kirjutanud Quarkuse rakenduse, mis kasutab AMQP-d sõnumite vahetamiseks, seadnud selle rakenduse tööle Red Hat OpenShift platvormil ning rakendanud selle konfiguratsiooni AMQ Online-i põhjal. Seejärel loome manifestid, mis on vajalikud sõnumivahetussüsteemi käivitamiseks meie rakenduse jaoks.
Sellega lõpetame Quarkuse sarja, kuid ees on palju uut ja huvitavat, jääge meiega!
Allikas: habr.com
