Përshëndetje të gjithëve! Ky është postimi ynë i fundit nga seria për Quarkus! (Për më tepër, shikoni webinarin tonë . Do të tregojmë se si të filloni «nga zero» ose të trasferoni zgjidhjet e gatshme)

Në mëparshëm kemi shqyrtuar mjetet përkatëse, me ndihmën e të cilave mund të vlerësoni përmirësimet e arritura si rezultat i modernizimit të aplikacioneve Java.
Duke filluar nga versioni 0.17.0, mbështet përdorimin e Advanced Message Queuing Protocol (), i cili është një standard i hapur për transferimin 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 në bazë të platformës . Më shumë rreth strukturës së tij mund të shihni . Sot do të tregojmë se si të lidheni AMQ Online me Quarkus për të ndërtuar një sistem modern të shkëmbimit të mesazheve mbi OpenShift duke përdorur dy teknologji të reja të lidhura me procesimin e mesazheve.
Supozon se tashmë e keni vendosur AMQ Online në platformën OpenShift (nëse jo, shihni ).
Fillimisht, ne do të krijojmë aplikacione Quarkus, e cila do të përfaqësojë një sistem të thjeshtë të përpunimit të porosive duke përdorur shkëmbimi reaktiv të mesazheve. Kjo aplikacion do të përfshijë një gjenerator porosish që dërgon porosi në një radhë të mesazheve në një interval të fiksuar, si dhe një përpunues porosish që do të përpunojë mesazhet nga radhë dhe do të krijojë konfirmime të disponueshme për t'u parë në shfletues.
Pasi të krijojmë aplikacionin, ne do të tregojmë se si të integrojmë konfigurimin e sistemit të shkëmbimit të mesazheve dhe do të përfitojmë nga AMQ Online për të inicuar resurset që na nevojiten në këtë sistem.
Aplikacioni Quarkus
Aplikacioni ynë Quarkus funksionon mbi OpenShift dhe përbën një version të modifikuar të programit . Shembulli i plotë i anës klienti mund të gjendet .
Gjeneratori i porosive
Gjeneratori dërgon monotonisht identifikuesit e rritjes së porosive çdo 5 sekonda në adresën «orders».
@ApplicationScoped
public class OrderGenerator {
private int orderId = 1;
@Outgoing("orders")
public Flowable<Integer> generate() {
return Flowable.interval(5, TimeUnit.SECONDS)
.map(tick -> orderId++);
}
}
Përpunuesi i porosive
Përpunuesi i porosive është edhe më i thjeshtë, thjesht kthen një identifikues konfirmimi në adresën «confirmations».
@ApplicationScoped
public class OrderProcessor {
@Incoming("orders")
@Outgoing("confirmations")
public Integer process(Integer order) {
// Identifikuesi 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;
}
}
Configuration
Për t'u lidhur me AMQ Online, aplikacioni ynë do të ketë nevojë për disa të dhëna konfigurimi, konkretisht: konfigurimin e lidhësit Quarkus, informacionin mbi pikën fundore AMQP dhe kredencialet e klientit. Përshtatshëm, është më mirë të mbani të gjitha të dhënat e konfigurimit në një vend, por ne do t'i ndajmë 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 me anë të një skedari pronash të aplikacionit:
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ë rresht mesazhesh vetëm për adresën «orders». Ndërsa adresa «confirmations» në aplikacionin tonë do të përdorë një rresht në memorie.
Pika fundore AMQP
Në fazën e kompilimit emri i hostit dhe numri i portit për pikën fundore AMQP nuk janë të njohura, prandaj duhet të inkorporohen. Pika fundore mund të përcaktohet në configmap, e cila krijohet nga AMQ Online, prandaj ne do t'i përcaktojmë ato përmes variablave të mjedisit 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 identifikimit tĂ« llogarisĂ« sĂ« shĂ«rbimit mund tĂ« pĂ«rdoren pĂ«r autentikimin e aplikacionit tonĂ« nĂ« OpenShift. PĂ«r kĂ«tĂ«, sĂ« pari duhet tĂ« krijoni njĂ« ConfigSource tĂ« personalizuar qĂ« do tĂ« lexojĂ« çelĂ«sin e autentikimit nga sistemi i skedarĂ«ve tĂ« podâit:
publik klasa MessagingCredentialsConfigSource zbatohet 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);
}
}
Konstruksioni dhe shpërndarja e aplikacionit
Pasi që aplikacioni duhet kompilihet në një skedar ekzekutiv, do të nevojitet një makinë virtuale GraalVM. Më shumë informacione rreth mënyrës se si të konfiguroni mjedisin për këtë, shihni udhëzimet përkatëse në .
Pastaj, duke ndjekur udhëzimet e përcaktuara atje, duhet të shkarkoni kodin burimor, të bëni ndërtimin dhe të realizoni 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ë aktivizohet derisa të konfigurojmë burimet e nevojshme për shkëmbimin e mesazheve në AMQ Online.
Konfigurimi i sistemit të shkëmbimit të mesazheve
Tani mbetet të përcaktojmë në sistemin e shkëmbimit të mesazheve burimet që i nevojiten aplikacionit tonë. Për këtë, duhet të krijojmë: 1) një hapësirë adresash, për të inicializuar pikën përfundimtare të sistemit të shkëmbimit të mesazheve; 2) një adresë, për të konfiguruar adresat që përdorim në aplikacion; 3) një përdorues të sistemit të shkëmbimit të mesazheve, për të vendosur akreditimet e klientit.
Hapësira e adresave
Objekti AddressSpace në AMQ Online është një grup adresash që ndajnë pikët e lidhjes, si dhe politikat e autentifikimit dhe autorizimit. Kur krijoni një hapësirë adresash, mund të përcaktoni se 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
Adresa
AdresatĂ«t pĂ«rdoren pĂ«r tĂ« dĂ«rguar dhe marr mesajet. Ădo adresĂ« ka njĂ« lloj, i cili pĂ«rcakton semantiken e saj, si dhe njĂ« plan, i cili pĂ«rcakton sasinĂ« e burimeve tĂ« rezervuara. NjĂ« adresĂ« mund tĂ« pĂ«rkufizohet, 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 besueshme mund të dërgojnë dhe marrin mesazhe në adresat tuaja, nevojitet të krijoni një përdorues në sistemin e shkëmbimit të mesazheve. Për aplikacionet që punojnë në klaster, klientët mund të autentifikohen përmes një llogarie shërbimi OpenShift. Përdoruesi "serviceaccount" mund të përkufizohet, 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"]
Lejet për konfigurimin e aplikacionit
Për të lejuar AMQ Online të krijojë configmap-in që ne përdorëm për të inkorporuar informacionin e pikës së përfundimit AMQP, nevojitet të caktosh një rol dhe një 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
Konfigurimin e sistemit të shkëmbimit të mesazheve mund ta aplikoni 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ë nisur, së pari do të kontrollojmë 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 rrugës së aplikacionit (thjesht hapim këtë adresë në shfletues):
echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"
Në shfletues duhet të shihet se biletat përditësohen periodikisht ndërsa mesazhet dërgohen dhe pranohen nga AMQ Online.
Të shohim përfundimet
Pra ndaj, ne shkruam një aplikacion Quarkus që përdor AMQP për shkëmbimin e mesazheve, e konfiguruam këtë aplikacion për të punuar në platformën Red Hat OpenShift, dhe gjithashtu implementuam konfigurimin e tij bazuar në konfigurimin AMQ Online. Pas kësaj, ne krijuam manifestet e nevojshme për të inicializuar sistemin e shkëmbimit të mesazheve për aplikacionin tonë.
Me këtë përfundojmë serinë tonë mbi Quarkus, por ka shumë gjëra të reja dhe interesante përpara, qëndroni me ne!
Burimi: habr.com
