Ahojte všetci! Tu je náš posledný príspevok v sérii o Quarkus! (Mimochodom, pozrite si náš webinár . Predvedieme, ako začať „od nuly“ alebo preniesť existujúce riešenia)

V v príspevku sme preskúmali príslušné nástroje, pomocou ktorých môžeme kvantitatívne hodnotiť zlepšenia, ktoré sme dosiahli modernizáciou Java aplikácií.
Od verzie 0.17.0, podporuje využívanie Advanced Message Queuing Protocol (), ktorý je otvoreným štandardom pre prenos obchodných správ medzi aplikáciami alebo organizáciami.
je služba vybudovaná na základe otvoreného projektu a implementuje mechanizmus výmeny správ na báze platformy . Viac o tom, ako to funguje, si prečítajte . Dnes ukážeme, ako skombinovať AMQ Online a Quarkus, aby sme vybudovali moderný systém výmeny správ na báze OpenShift s použitím dvoch nových technológií súvisiacich so spracovaním správ.
Predpokladá sa, že ste už nasadili AMQ Online na platforme OpenShift (ak nie, pozrite si ).
Na začiatok vytvoríme aplikáciu Quarkus, ktorá predstavuje jednoduchý systém spracovania objednávok s použitím reaktívnej výmeny správ. Táto aplikácia bude obsahovať generátor objednávok, ktorý pravidelne odosiela objednávky do fronty správ, a spracovateľ objednávok, ktorý spracováva správy z fronty a vytvára potvrdenia dostupné na prezeranie v prehliadači.
Po vytvorení aplikácie ukážeme, ako integrovať konfiguráciu systému výmeny správ a aktivujeme AMQ Online, aby sme na tejto platforme inicializovali potrebné zdroje.
Aplikácia Quarkus
Naša aplikácia Quarkus beží na OpenShift a je modifikovanou verziou programu . Kompletný príklad klientskej časti nájdete .
Generátor objednávok
Generátor každých 5 sekúnd jednoducho monotonicky odosiela rastúce identifikátory objednávok na adresu „orders“.
@ApplicationScoped
public class OrderGenerator {
private int orderId = 1;
@Outgoing("orders")
public Flowable generate() {
return Flowable.interval(5, TimeUnit.SECONDS)
.map(tick -> orderId++);
}
}
Spracovateľ objednávok
Spracovateľ objednávok je ešte jednoduchší, jednoducho vracia identifikátor potvrdenia na adresu „confirmations“.
@ApplicationScoped
public class OrderProcessor {
@Incoming("orders")
@Outgoing("confirmations")
public Integer process(Integer order) {
// Identifikačný kód potvrdenia je rovný dvojnásobku identifikačného kódu objednávky <img draggable="false" class="emoji" alt=":-)" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f642.svg">
return order * 2;
}
}
Súvisiace zdroje potvrdení
Ressursa potvrdenia je HTTP koncový bod pre zoznam potvrdení vytvorených našou aplikáciou.
@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;
}
}
Nastavenie
Na pripojenie k AMQ Online bude našej aplikácii potrebné niekoľko konfiguračných údajov, konkrétne: konfigurácia Quarkus konektora, informácie o AMQP koncovom bode a klientské prihlasovacie údaje. Najlepšie je samozrejme mať všetky konfiguračné údaje na jednom mieste, ale zvyčajne ich rozdelíme, aby sme ukázali možné varianty nastavenia aplikácie Quarkus.
Konektory
Konfiguráciu konektora je možné poskytnúť počas kompilácie prostredníctvom aplikačného konfiguračného súboru:
mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp
Aby sme to zjednodušili, budeme používať frontu správ iba pre adresu „orders“. Adresa „confirmations“ v našej aplikácii bude používať frontu v pamäti.
AMQP koncový bod
Počas kompilácie nie sú názov hostiteľa a číslo portu pre AMQP koncový bod známe, preto ich treba injektovať. Koncový bod je možné nastaviť v configmap, ktorý vytvorí AMQ Online, preto ich definujeme prostredníctvom prostredia v manifeste aplikácie:
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
Prihlasovacie údaje
Token účtu služby môže byť použitý na autentifikáciu našej aplikácie v OpenShift. Najprv je nutné vytvoriť vlastný ConfigSource, ktorý bude čítať token autentifikácie zo súborového systému podu:
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);
}
}
Zostavenie a nasadenie aplikácie
Keďže aplikáciu je potrebné skompilovať do spustiteľného súboru, bude vyžadovaná virtuálna mašina GraalVM. Viac informácií o tom, ako nastaviť prostredie, nájdete v príslušných pokynoch v .
Následne, podľa pokynov tam uvedených, je potrebné stiahnuť zdrojový kód, vykonať zostavenie a nasadiť našu aplikáciu:
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
Po týchto príkazoch bude aplikácia nasadená, ale nespustí sa, kým nenastavíme potrebné zdroje správy správ v AMQ Online.
Nastavenie systému správy správ
Teraz je potrebné v systéme správy správ nastaviť zdroje, ktoré naša aplikácia potrebuje. Na to je potrebné vytvoriť: 1) priestor adries, aby sa inicializoval koncový bod systému správy správ; 2) adresu, aby sa nastavili adresy, ktoré používame v aplikácii; 3) používateľa systému správy správ, aby sa určili prihlasovacie údaje klienta.
Priestor adries
Objekt AddressSpace v AMQ Online je skupina adries, ktoré spoločne využívajú koncové body pripojenia, ako aj politiky autentifikácie a autorizácie. Pri vytváraní priestoru adries je možné zadať, ako budú koncové body systému správy správ poskytované:
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
Adresy
Adresy sa používané na odosielanie a prijímanie správ. Každý adres má typ, ktorý určuje jeho sémantiku, ako aj plán, ktorý určuje množstvo rezervovaných zdrojov. Adresu môžeme definovať napríklad takto:
apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
name: quarkus-example.orders
spec:
address: orders
type: queue
plan: brokered-queue
Používateľ systému výmeny správ
Aby mohli iba dôveryhodné aplikácie odosielať a prijímať správy na vaše adresy, je potrebné v systéme výmeny správ vytvoriť používateľa. Pre aplikácie bežiace na klastrov môže byť autentizácia klientov vykonaná pomocou účtu služby OpenShift. Používateľa „serviceaccount“ môžeme definovať napríklad takto:
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"]
Oprávnenia na nastavenie aplikácie
Aby AMQ Online mohol vytvoriť configmap, ktorý sme použili na zavedenie informácií o koncovej AMQP, je potrebné zadať rolu a viazanie roly (Role a 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
Ako aplikovať konfigurácie
Konfiguráciu systému výmeny správ môžeme aplikovať takto:
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
Overenie aplikácie
Aby sme sa uistili, že aplikácia sa spustila, najskôr skontrolujeme, či sú príslušné adresy vytvorené a aktívne:
until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Ešte nie je pripravené"; sleep 5; done
Potom skontrolujeme URL trasy aplikácie (jednoducho otvoríme túto adresu v prehliadači):
echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"
V prehliadači by malo byť vidieť, že tikety sa periodicky aktualizujú, keď správy odosielajú a prijímajú AMQ Online.
Zhrnieme to
Napísali sme aplikáciu Quarkus, ktorá využíva AMQP na výmenu správ, nastavili sme túto aplikáciu pre platformu Red Hat OpenShift a implementovali jej konfiguráciu na základe konfigurácie AMQ Online. Následne sme vytvorili manifesty potrebné na inicializáciu systému výmeny správ pre našu aplikáciu.
Týmto končíme sériu o Quarkus, avšak pred nami je ešte veľa nového a zaujímavého, zostaňte s nami!
Zdroj: habr.com
