Salut à tutti ! Eccu - u nostru post finale in a serie Quarkus! (A propositu, fighjate u nostru webinar . Vi mustraremu cumu cumincià da zero o trasferisce soluzioni pronte)

В In questu post, avemu vistu l'arnesi pertinenti chì ponu esse aduprati per quantificà e migliure ottenute da a mudernizazione di l'applicazioni Java.
Da a versione 0.17.0, supporta l'usu di u Protocolu Avanzatu di Coda di Messageria (), chì hè un standard apertu per u trasferimentu di missaghji cummerciale trà applicazioni o urganisazione.
hè un serviziu custruitu nantu à a basa di un prughjettu open source è implementà un mecanismu di messageria basatu in piattaforma . Per più dettagli nantu à cumu funziona, vede . Oghje vi mustraremu cumu cumminà AMQ Online è Quarkus per custruisce un sistema di messageria mudernu basatu in OpenShift utilizendu duie tecnulugia novi di messageria.
Si assume chì avete digià implementatu AMQ Online nantu à a piattaforma OpenShift (se no, allora vede ).
Per principià, avemu da creà una applicazione Quarkus chì serà un sistema simplice di trasfurmazioni di l'ordine cù messageria reattiva. Questa applicazione includerà un generatore d'ordine chì manda ordini à una fila di messagi à un intervallu fissu, è ancu un processore d'ordine chì processerà i missaghji da a fila è generà cunferma visibile in u navigatore.
Una volta chì avemu creatu l'applicazione, vi mustraremu cumu incrustà a cunfigurazione di u sistema di messageria in l'applicazione è aduprà AMQ Online per furnisce e risorse chì avemu bisognu in u sistema.
App Quarkus
A nostra applicazione Quarkus funziona in OpenShift è hè una versione mudificata di u prugramma . Un esempiu cumpletu di u latu di u cliente pò esse truvatu .
Generatore di ordini
U generatore simpricimenti manda monotonicamente ID di ordine crescente à l'indirizzu "ordini" ogni 5 seconde.
@ApplicationScoped
public class OrderGenerator {
private int orderId = 1;
@Outgoing("orders")
public Flowable<Integer> generate() {
return Flowable.interval(5, TimeUnit.SECONDS)
.map(tick -> orderId++);
}
}
Processor d'ordine
U gestore di l'ordine hè ancu più simplice, torna solu un ID di cunferma à l'indirizzu "confirmazioni".
@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;
}
}
Risorse di cunferma
A risorsa di cunferma hè un endpoint HTTP per elencu e cunfirmazioni generate da a nostra applicazione.
@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;
}
}
cutter
Per cunnette à AMQ Online, a nostra applicazione hà bisognu di qualchi dati di cunfigurazione, vale à dì: cunfigurazione di u connettore Quarkus, l'infurmazioni AMQP endpoint è e credenziali di u cliente. Hè, sicuru, megliu di mantene tutte e dati di cunfigurazione in un locu, ma separà deliberatamente per vede l'opzioni pussibuli per cunfigurà l'applicazione Quarkus.
Connettori
A cunfigurazione di u connettore pò esse furnita in tempu di compilazione utilizendu un schedariu di proprietà di l'applicazione:
mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp
Per mantene e cose simplici, useremu solu una fila di messagi per l'indirizzu "ordini". È l'indirizzu di "confirmazioni" in a nostra applicazione aduprà una fila in memoria.
endpoint AMQP
À u tempu di compilazione, u nome di l'ospitu è u numeru di portu per l'endpoint AMQP sò scunnisciuti, cusì deve esse injected. L'endpoint pò esse stabilitu in u configmap chì hè creatu da AMQ Online, cusì avemu da definisce per mezu di variabili di l'ambiente in u manifestu di l'applicazione:
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
Credenziali
U token di u contu di serviziu pò esse usatu per autentificà a nostra applicazione à OpenShift. Per fà questu, prima deve creà una ConfigSource persunalizata chì leghje u token di autentificazione da u sistema di fugliale di u 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);
}
}
Custruite è implementate l'applicazione
Siccomu l'applicazione deve esse cumpilata in un schedariu eseguibile, una macchina virtuale GraalVM hè necessaria. Per i dettagli nantu à cumu stabilisce un ambiente per questu, vede l'istruzzioni currispondenti in .
Dopu, seguendu l'istruzzioni datu quì, avete bisognu di scaricà a fonte, custruisce è implementà a nostra applicazione:
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
Dopu à sti cumandamenti, l'applicazione serà implementata, ma ùn principiarà micca finu à cunfigurà e risorse di messageria chì avemu bisognu in AMQ Online.
Configurazione di u sistema di messageria
Avà tuttu ciò chì resta hè di stabilisce e risorse chì a nostra applicazione hà bisognu in u sistema di messageria. Per fà questu, avete bisognu di creà: 1) un spaziu di indirizzu per inizializà u puntu finale di u sistema di messageria; 2) indirizzu per cunfigurà l'indirizzi chì usemu in l'applicazione; 3) L'utilizatore di messageria per stabilisce e credenziali di u cliente.
Spaziu di indirizzu
Un oggettu AddressSpace in AMQ Online hè un gruppu di indirizzi chì sparte punti finali di cunnessione è pulitiche di autentificazione è d'autorizazione. Quandu create un spaziu di indirizzu, pudete specificà cumu l'endpoint di messageria seranu esposti:
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
Addresses
L'indirizzi sò usati per mandà è riceve missaghji. Ogni indirizzu hà un tipu, chì determina a so semantica, è ancu un pianu, chì specifica u numeru di risorse per esse riservatu. L'indirizzu pò esse determinatu, per esempiu, cusì:
apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
name: quarkus-example.orders
spec:
address: orders
type: queue
plan: brokered-queue
L'utilizatore di messageria
Per assicurà chì solu l'applicazioni di fiducia ponu mandà è riceve missaghji à i vostri indirizzi, deve creà un utilizatore in u sistema di messageria. Per l'applicazioni in esecuzione nantu à un cluster, i clienti ponu esse autenticati cù un contu di serviziu OpenShift. L'utilizatore "serviceaccount" pò esse definitu, per esempiu, cusì:
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"]
Permissioni per i paràmetri di l'app
Per AMQ Online per creà a configmap chì avemu usatu per incrustà l'infurmazioni AMQP endpoint, u Role è RoleBinding deve esse stabilitu:
---
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
Cumu applicà e cunfigurazioni
Pudete applicà a cunfigurazione di u sistema di messageria cusì:
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
Verificazione di l'applicazione
Per assicurà chì l'applicazione hà iniziatu, prima di tuttu, verificate se l'indirizzi currispondenti sò stati creati è sò attivi:
until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Not yet ready"; sleep 5; done
Allora cuntrollemu l'URL di a strada di l'applicazione (aprite questu indirizzu in u navigatore):
echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"
U navigatore deve dimustrà chì i biglietti sò aghjurnati periodicamente cum'è i missaghji sò mandati è ricevuti da AMQ Online.
Riunione
Allora avemu scrittu una applicazione Quarkus chì usa AMQP per a messageria, cunfiguratu l'applicazione per eseguisce nantu à a piattaforma Red Hat OpenShift, è implementatu a so cunfigurazione basata nantu à a cunfigurazione AMQ Online. Dopu avemu creatu i manifesti necessarii per inizializà u sistema di messageria per a nostra dumanda.
Questu cuncludi a serie nantu à Quarkus, ma ci sò assai cose novi è interessanti avanti, stà à sente!
Source: www.habr.com
