Përshëndetje të gjithëve! Ja ku është – postimi ynë përfundimtar nga seria mbi Quarkus! (P.S. shikoni webinarin tonë . Do të tregojmë se si të filloni «nga zero» ose të transferoni zgjidhje të gatshme)

Në në këtë postim ne shqyrtuam mjetet përkatëse që lejojnë vlerësimin e përmirësimeve që janë arritur si rezultat i modernizimit të aplikacioneve Java.
Duke filluar nga versioni 0.17.0, mbështet përdorimin e Protokollit Të Avancuar Të Njoftimeve (), i cili është një standard i hapur për transmetimin e mesazheve të biznesit midis aplikacioneve ose organizatave.
është një shërbim i ndërtuar mbi projektin e hapur dhe realizon mekanizmin e shkëmbimit të mesazheve mbi platformën . Më shumë për mënyrën se si është ndërtuar, shihni . Sot do të tregojmë si të kombinoni AMQ Online dhe Quarkus për të ndërtuar një sistem modern të shkëmbimit të mesazheve mbi OpenShift duke përdorur dy teknologji të reja lidhur me përpunimin e mesazheve.
Supozohen se keni vepruar AMQ Online në platformën OpenShift (nëse jo, shihni ).
Fillimisht, ne do të krijojmë një aplikacion Quarkus, i cili do të përfaqësojë një sistem të thjeshtë për përpunimin e porosisë duke përdorur shkëmbim reaktiv të mesazheve. Ky aplikacion do të përfshijë një gjenerator porosish që dërgon porosi në një radhë mesazhesh me një interval të caktuar, si dhe një përpunues porosish që do të trajtojë mesazhet nga radhë dhe do të formojë konfirmime të cilat mund të shfaqen në shfletues.
Pas krijimit të aplikacionit, ne do të tregojmë se si të integrojmë në të konfigurimin e sistemit të shkëmbimit të mesazheve dhe do të angazhojmë AMQ Online, për të inicuar burimet e nevojshme në këtë sistem.
Aplikacioni Quarkus
Aplikacioni ynë Quarkus ekzekutohet në OpenShift dhe është një version i modifikuar i programit . Një shembull i plotë i pjesës klient mund të gjendet .
Gjeneratori i porosive
Gjeneratori çdo 5 sekonda thjesht dërgon monotonikisht identifikatorë në rritje të porosive në adresën "orders".
@ApplicationScoped
public class OrderGenerator {
private int orderId = 1;
@Outgoing("orders")
public Flowable generate() {
return Flowable.interval(5, TimeUnit.SECONDS)
.map(tick -> orderId++);
}
}
Përpunuesi i porosive
Menaxhimi i porosive është bërë edhe më i thjeshtë; ai kthehet vetëm identifikuesin e konfirmimit në adresën "confirmations".
@ApplicationScoped
public class OrderProcessor {
@Incoming("orders")
@Outgoing("confirmations")
public Integer process(Integer order) {
// Identifikimi i konfirmimit është dyfishimi i identifikuesit të porosisë <img draggable="false" class="emoji" alt=":-)" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f642.svg">
return order * 2;
}
}
Burimet e konfirmimit
Burimi i konfirmimit është një pikë fundore HTTP për listimin e konfirmimeve të formuara si rezultat i punës së aplikacionit tonë.
@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;
}
}
Konfigurimi
Për t'u lidhur me AMQ Online, aplikacioni ynë do të ketë nevojë për disa të dhëna konfigurimi, përkatësisht: konfigurimin e lidhësit Quarkus, informacione për pikën fundore AMQP dhe kredencialet e klientit. Më mirë është të mbani të gjitha të dhënat e konfigurimit në një vend, por ne do t'i ndajmë ato qëllimisht për të treguar mundësitë e konfigurimit të aplikacionit Quarkus.
Lidhësit
Konfigurimi i lidhësit mund të ofrohet në fazën e kompilimit përmes një skedari pronar aplikacioni:
mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp
Për të mos e komplikuar, do të përdorim një radhë mesazhesh vetëm për adresën "orders". Ndërsa adresa "confirmations" në aplikacionin tonë do të përdorë një radhë në memorie.
Pika e fundit AMQP
Në fazën e kompilimit, emri i hostit dhe numri i portës për Pikën e fundit AMQP nuk dihen, prandaj duhet të inkorporohen. Pika e fundit mund të caktohet në configmap, e cila krijohet nga AMQ Online, prandaj ne do t'i përcaktojmë ato përmes variablave të ambientit në manifestin e aplikacionit:
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
Kredencialet
Të dhënat e llogarisë së shërbimit mund të përdoren për autentifikimin e aplikacionit tonë në OpenShift. Për këtë, duhet së pari të krijohet një ConfigSource personal, i cili do të lexojë tokenin e autentifikimit nga sistemi i skedarëve të pod-it:
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);
}
}
Ndërtimi dhe vendosja e aplikacionit
Duke qenë se aplikacioni duhet të kompozohet në një skedar ekzekutiv, do të nevojitet një makinë virtuale GraalVM. Më shumë detaje se si të konfigurohet ky mjedis, shihni udhëzimet përkatëse në .
Pastaj, duke ndjekur udhëzimet e dhëna atje, nevojitet të shkarkoni kodin burimor, të kryeni ndërtimin dhe të bëni shpërndarjen e aplikacionit tonë:
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
Pas këtyre komandave, aplikacioni do të shpërndahet, por nuk do të nisë derisa të konfigurojmë burimet e nevojshme për ndërlidhje në AMQ Online.
Konfigurimi i sistemit të ndërlidhjes
Tani mbetet të caktojmë në sistemin e ndërlidhjes burimet që i nevojiten aplikacionit tonë. Për këtë, duhet të krijojmë: 1) një hapësirë adresash, për të inicializuar pikën fundore të sistemit të ndërlidhjes; 2) një adresë, për të konfiguruar adresat që përdorim në aplikacion; 3) një përdorues të sistemit të ndërlidhjes, për të caktuar akrediatet e klientit.
Hapësira e adresave
Objekti AddressSpace në AMQ Online është një grup adresesh që ndajnë përbashkët pikëkoneksione, si dhe politika të autentikimit dhe autorizimit. Gjatë krijimit të një hapësire adresash, mund të specifikoni si do të ofrohen pikët e sistemit të shkëmbimit të mesazheve:
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
Adresat
Adresat përdoren për të dërguar dhe pranuar mesazhe. Çdo adresë ka një lloj që përcakton semantikën e saj, si dhe një plan që përcakton numrin e burimeve që rezervohen. Një adresë mund të përcaktohet, për shembull, kështu:
apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
name: quarkus-example.orders
spec:
address: orders
type: queue
plan: brokered-queue
Përdoruesi i sistemit të shkëmbimit të mesazheve
Për të siguruar që vetëm aplikacionet e besuara mund të dërgojnë dhe pranojnë mesazhe në adresat tuaja, në sistemin e shkëmbimit të mesazheve duhet të krijoni një përdorues. Për aplikacionet që funksionojnë në kuadër, klientët mund të autentikohen duke përdorur një llogari shërbimi OpenShift. Përdoruesin 'serviceaccount' mund ta përcaktoni, për shembull, kështu:
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"]
Lejot për konfigurimin e aplikacionit
Për të mundësuar që AMQ Online të krijojë configmap që kemi përdorur për të dërguar informacione mbi pikën përfundimtare AMQP, duhet të vendosim një rol dhe lidhje roli (Role dhe 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
Si të aplikoni konfigurimet
Konfigurimi i sistemit të mesazheve mund të aplikohet kështu:
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
Verifikimi i aplikacionit
Për të siguruar që aplikacioni është ngritur, e para që do të kontrollojmë është nëse adresat përkatëse janë krijuar dhe aktive:
until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Nuk është ende gati"; sleep 5; done
Pastaj do të kontrollojmë URL-në e aplikacionit (thjesht do ta hapim këtë adresë në shfletues):
echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"
Në shfletues duhet të jetë e dukshme se biletat përditësohen periodikisht ndërsa mesazhet dërgohen dhe pranohen nga AMQ Online.
Përmbledhje
Kështu, krijuam një aplikacion Quarkus që përdor AMQP për shkëmbimin e mesazheve, e konfiguram këtë aplikacion për të punuar në platformën Red Hat OpenShift, dhe gjithashtu implementuam konfigurimin e tij bazuar në konfigurimin e AMQ Online. Më pas krijuam manifestet e nevojshme për të inicializuar sistemin e shkëmbimit të mesazheve për aplikacionin tonë.
Këtu e mbyllim serinë mbi Quarkus, por kemi shumë gjëra interesante përpara, qëndroni me ne!
Burimi: habr.com
