Tere kĂ”igile! Siin ta on â meie viimane postitus Quarkuse sarjast! (Muide, vaadake meie veebiseminari . NĂ€itame, kuidas alustada «nullist» vĂ”i liigutada olemasolevaid lahendusi)

Uues postituses arutame sobivaid tööriistu, millega saab kvantitatiivselt hinnata moderniseerimisega seotud tÀiustusi Java rakendustes.
Alates versioonist 0.17.0 toetab Advanced Message Queuing Protocol (), mis on avatud standard ÀrisÔnumite edastamiseks rakenduste vÔi organisatsioonide vahel.
on teenus, mis pĂ”hineb avatud projektil ja ellu viib sĂ”numitevahetuse mehhanismi platvormil . Lisainfot selle tööpĂ”himĂ”tte kohta leiate . TĂ€na nĂ€itame, kuidas ĂŒhendada AMQ Online ja Quarkus, et luua kaasaegne sĂ”numitevahetussĂŒsteem OpenShiftis kahel uuel tehnoloogial, mis on seotud sĂ”numite töötlemisega.
Eeldatakse, et olete juba juurutanud AMQ Online platvormil OpenShift (kui ei, vaadake ).
Esmalt loome Quarkus rakenduse, mis esindab lihtsat tellimuste töötlemise sĂŒsteemi reaktiivse sĂ”numite vahetuse abil. See rakendus peab sisaldama tellimuste generaatorit, mis saadab tellimusi sĂ”numite jĂ€rjekordadesse kindla ajavahemiku tagant, ning tellimuste töötlejat, mis töötleb jĂ€rjekorrast sĂ”numeid ja genereerib kinnitusi, mida saab veebibrauseris vaadata.
PĂ€rast rakenduse loomist nĂ€itame, kuidas rakenduses sĂ”numite vahetamise sĂŒsteemi konfiguratsiooni integreerida ja kasutame AMQ Online'i, et kĂ€ivitada selle sĂŒsteemi vajalikud ressursid.
Quarkus rakendus
Meie Quarkus rakendus töötab OpenShiftis ja on muudetud versioon programmist . TÀieliku nÀite kliendipoole kohta leiate .
Tellimuste generaator
Generaator saadab iga 5 sekundi tagant lihtsalt sujuvalt kasvavad tellimuste identifikaatorid 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 identifikaatori aadressile âconfirmationsâ.
@ApplicationScoped
public class OrderProcessor {
@Incoming("orders")
@Outgoing("confirmations")
public Integer process(Integer order) {
// Kinnituse identifikaator on tellimuse identifikaatori kaks korda suurem <img draggable="false" class="emoji" alt=":-)" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f642.svg">
return order * 2;
}
}
Kinnituste ressursid
TÔendite ressurss on HTTP lÔpp-punkt, mida kasutatakse meie rakenduse poolt genereeritud tÔendite nimekirjaks.
@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'iga ĂŒhendamiseks vajab meie rakendus teatud konfiguratsioonikandeid, nimelt: Quarkus-ĂŒhendaja konfiguratsioon, AMQP lĂ”pp-punkti andmed ja kliendi sisselogimisandmed. Parim on hoida kĂ”ik konfiguratsioonikanded ĂŒhes kohas, kuid me jagame need spetsiaalselt, et nĂ€idata rakenduse Quarkus seadistamise vĂ”imalusi.
Ăhendajad
Ăhendaja konfiguratsiooni vĂ”ib anda kompileerimise etapis rakenduse omaduste faili kaudu:
mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp
Lihtsuse huvides kasutame sĂ”numite jĂ€rjekorda ainult aadressi âordersâ jaoks. Aadress âconfirmationsâ meie rakenduses kasutab mĂ€lus olevaid jĂ€rjekordi.
AMQP lÔpp-punkt
Kompileerimise etapis pole AMQP lÔpp-punkti jaoks hosti nime ja sadama numbrit teada, seega tuleb need manustada. LÔpp-punkti saab mÀÀrata configmap'is, mille AMQ Online loob, seega mÀÀrame need keskkonnamuutujate kaudu rakenduse manifestis:
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
Kasutajatunnused
Teenuse konto mĂ€rk vĂ”ib meie rakenduse autentimiseks OpenShiftis olla kasutusel. Selleks tuleb kĂ”igepealt 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 juurutamine
Kuna rakendus tuleb kompileerida kÀivitatavaks failiks, on vajalik GraalVM virtuaalne masin. Lisateavet selle seadistamise kohta leiate sobivatest juhistest .
SeejÀrel, jÀrgides seal toodud juhiseid, tuleb allalaadida lÀhtekood, teostada koostamine ja juurutada meie rakendus:
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 juurutatakse rakendus, kuid see ei kÀivitu enne, kui oleme AMQ Online'is seadistanud vajalikud sÔnumivahetuse ressursid.
SĂ”numivahetuse sĂŒsteemi seadistamine
JÀÀb alles mÀÀrata sĂ”numivahetuse sĂŒsteemis ressursid, mis meie rakendusele vajalikud. Selleks tuleb luua: 1) aadressiruumi, et algatada sĂ”numivahetuse sĂŒsteemi lĂ”pp-punkt; 2) aadress, et seadistada aadressid, mida rakenduses kasutame; 3) sĂ”numivahetuse sĂŒsteemi kasutaja, et mÀÀrata kliendi autentimisandmed.
Aadressiruumi
AMQ Online'i AddressSpace objekt on grupp aadressidest, mis jagavad ĂŒhiselt ĂŒhenduspunktide lĂ”pp-punkte ning autentimise ja autoriseerimise poliitikaid. Aadressiruumi loomisel saab mÀÀrata, kuidas sĂ”numivahetuse sĂŒsteemi lĂ”pp-punkte pakutakse:
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
Aadresseid kasutatakse sĂ”numite saatmiseks ja vastuvĂ”tmiseks. Igal aadressil on tĂŒĂŒp, mis mÀÀratleb selle tĂ€henduse, samuti 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 vahetussĂŒsteemi kasutaja
Kuna sĂ”numite saatmiseks ja vastuvĂ”tmiseks saaksid teie aadressidel kasutada ainult usaldusvÀÀrseid rakendusi, on vajalik luua sĂ”numite vahetussĂŒsteemis kasutaja. Klastri peal töötavate rakenduste puhul saab kliente autentida OpenShift'i teenusekonto kaudu. 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 seadistamiseks vajalikud Ôigused
Kuna AMQ Online peab looma configmap'i, mida kasutame AMQP lÔpp-punkti teabe sisestamiseks, 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Ônumite vahetuse 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 kinnitamine
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 (lihtsalt avame selle aadressi brauseris):
echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"
Brauseris peaks olema nÀhtav, et piletid uuenevad perioodiliselt, kui sÔnumid saadetakse ja AMQ Online'i kaudu vastuvÔetakse.
Teeme kokkuvÔtte
Nii, me kirjutasime Quarkus rakenduse, mis kasutab AMQP-d sĂ”numite vahetamiseks, seadistasime selle rakenduse Red Hat OpenShift platvormil töötamiseks ja rakendasime selle konfiguratsiooni AMQ Online pĂ”hjal. SeejĂ€rel lĂ”ime vajalikud manifestid meie rakenduse sĂ”numite vahetamise sĂŒsteemi kĂ€ivitamiseks.
Sellega lÔpetame Quarkuse seeria, kuid ees ootab palju uut ja huvitavat, jÀÀge meiega!
Allikas: habr.com
