Pershendetje te gjitheve! Këtu është - postimi ynë i fundit në serinë Quarkus! (Meqë ra fjala, shikoni webinarin tonë
В
Që nga versioni 0.17.0,
Supozohet se ju keni vendosur tashmë AMQ Online në platformën OpenShift (nëse jo, atëherë shihni
Për të filluar, ne do të krijojmë një aplikacion Quarkus që do të jetë një sistem i thjeshtë përpunimi i porosive duke përdorur mesazhe reaktive. Ky aplikacion do të përfshijë një gjenerues porosish që dërgon porosi në një radhë mesazhesh në një interval fiks, si dhe një përpunues porosie që do të përpunojë mesazhet nga radha dhe do të gjenerojë konfirmime të dukshme në shfletues.
Pasi të kemi krijuar aplikacionin, do t'ju tregojmë se si të futni konfigurimin e sistemit të mesazheve në aplikacion dhe të përdorni AMQ Online për të siguruar burimet që na nevojiten në sistem.
Aplikacioni Quarkus
Aplikacioni ynë Quarkus funksionon në OpenShift dhe është një version i modifikuar i programit
Gjeneratori i porosive
Gjeneratori thjesht dërgon në mënyrë monotonike ID-të e porosive në rritje në adresën "porosi" çdo 5 sekonda.
@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
Trajtuesi i porosisë është edhe më i thjeshtë, ai thjesht kthen një ID konfirmimi në adresën e "konfirmimeve".
@ApplicationScoped
public class OrderProcessor {
@Incoming("orders")
@Outgoing("confirmations")
public Integer process(Integer order) {
// Идентификатор подтверждения равен удвоенному идентификатору заказа <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ë përfundimtare HTTP për renditjen e konfirmimeve të krijuara nga aplikacioni ynë.
@Path("/confirmations")
public class ConfirmationResource {
@Inject
@Stream("confirmations") Publisher<Integer> orders;
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "hello";
}
@GET
@Path("/stream")
@Produces(MediaType.SERVER_SENT_EVENTS)
public Publisher<Integer> stream() {
return orders;
}
}
rregullim
Për t'u lidhur me AMQ Online, aplikacionit tonë do t'i duhen disa të dhëna konfigurimi, përkatësisht: konfigurimi i lidhësit Quarkus, informacioni i pikës fundore AMQP dhe kredencialet e klientit. Sigurisht, është më mirë që të gjitha të dhënat e konfigurimit të ruhen në një vend, por ne do t'i ndajmë qëllimisht për të treguar opsionet e mundshme për konfigurimin e aplikacionit Quarkus.
Lidhës
Konfigurimi i lidhësit mund të sigurohet në kohën e përpilimit duke përdorur një skedar të vetive të aplikacionit:
mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp
Për t'i mbajtur gjërat të thjeshta, ne do të përdorim vetëm një radhë mesazhesh për adresën "porositë". Dhe adresa e "konfirmimeve" në aplikacionin tonë do të përdorë një radhë në memorie.
Pika përfundimtare AMQP
Në kohën e përpilimit, emri i hostit dhe numri i portit për pikën përfundimtare AMQP janë të panjohura, kështu që ato duhet të injektohen. Pika përfundimtare mund të vendoset në hartën e konfigurimit që është krijuar nga AMQ Online, kështu që 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
Shenja e llogarisë së shërbimit mund të përdoret për të vërtetuar aplikacionin tonë në OpenShift. Për ta bërë këtë, së pari duhet të krijoni një burim të personalizuar Configurce që do të lexojë shenjën e vërtetimit nga sistemi i skedarëve të pod:
public class MessagingCredentialsConfigSource implements ConfigSource {
private static final Set<String> propertyNames;
static {
propertyNames = new HashSet<>();
propertyNames.add("amqp-username");
propertyNames.add("amqp-password");
}
@Override
public Set<String> getPropertyNames() {
return propertyNames;
}
@Override
public Map<String, String> getProperties() {
try {
Map<String, String> 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ërtoni dhe vendosni aplikacionin
Meqenëse aplikacioni duhet të kompilohet në një skedar të ekzekutueshëm, kërkohet një makinë virtuale GraalVM. Për detaje se si të konfiguroni një mjedis për këtë, shihni udhëzimet përkatëse në
Më pas, duke ndjekur udhëzimet e dhëna atje, duhet të shkarkoni burimin, të ndërtoni dhe vendosni aplikacionin 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ë vendoset, por nuk do të fillojë derisa të konfigurojmë burimet e mesazheve që na duhen në AMQ Online.
Vendosja e sistemit të mesazheve
Tani mbetet vetëm të vendosim burimet që i duhen aplikacionit tonë në sistemin e mesazheve. Për ta bërë këtë, ju duhet të krijoni: 1) një hapësirë adresash për të inicializuar pikën përfundimtare të sistemit të mesazheve; 2) adresa për të konfiguruar adresat që përdorim në aplikacion; 3) Dërgimi i mesazheve nga përdoruesi për të vendosur kredencialet e klientit.
Hapësira e adresës
Një objekt AddressSpace në AMQ Online është një grup adresash që ndajnë pikat fundore të lidhjes dhe politikat e vërtetimit dhe autorizimit. Kur krijoni një hapësirë adresash, mund të specifikoni se si do të ekspozohen pikat fundore 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 përdoren për të dërguar dhe marrë mesazhe. Çdo adresë ka një lloj, i cili përcakton semantikën e saj, si dhe një plan, i cili specifikon numrin e burimeve që do të rezervohen. Adresa mund të përcaktohet, për shembull, si kjo:
apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
name: quarkus-example.orders
spec:
address: orders
type: queue
plan: brokered-queue
Përdorues i mesazheve
Për të siguruar që vetëm aplikacionet e besuara mund të dërgojnë dhe marrin mesazhe në adresat tuaja, duhet të krijoni një përdorues në sistemin e mesazheve. Për aplikacionet që funksionojnë në një grup, klientët mund të vërtetohen duke përdorur një llogari shërbimi OpenShift. "Llogaria e shërbimit" e përdoruesit mund të përcaktohet, për shembull, si kjo:
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 cilësimet e aplikacionit
Në mënyrë që AMQ Online të krijojë hartën e konfigurimit që kemi përdorur për të futur informacionin e pikës fundore AMQP, duhet të vendosim Rolin 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
Ju mund të aplikoni konfigurimin e sistemit të mesazheve si kjo:
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'u siguruar që aplikacioni ka filluar, para së gjithash, le të kontrollojmë nëse adresat përkatëse janë krijuar dhe janë aktive:
until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Not yet ready"; sleep 5; done
Pastaj le të kontrollojmë URL-në e rrugës së aplikacionit (thjesht hapni këtë adresë në shfletues):
echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"
Shfletuesi duhet të tregojë se biletat përditësohen periodikisht ndërsa mesazhet dërgohen dhe merren nga AMQ Online.
Përmbledhja
Pra, ne shkruam një aplikacion Quarkus që përdor AMQP për mesazhe, konfiguruam aplikacionin që të funksionojë në platformën Red Hat OpenShift dhe implementuam konfigurimin e tij bazuar në konfigurimin AMQ Online. Më pas krijuam manifestet e nevojshme për të inicializuar sistemin e mesazheve për aplikacionin tonë.
Kjo përfundon serialin për Quarkus, por ka shumë gjëra të reja dhe interesante përpara, qëndroni të sintonizuar!
Burimi: www.habr.com