Üdvözlet mindenkinek! Itt a végső bejegyzésünk a Quarkusról szóló sorozatban! (Egyébként nézd meg a webináriumunkat . Megmutatjuk, hogyan lehet „nulláról“ indítani vagy kész megoldásokat átvinni.)

A bejegyzésünkben a megfelelő eszközöket használtuk, amelyek segítségével mennyiségileg értékelhetjük a modernizációs folyamat során elért javulásokat a Java alkalmazásokban.
A 0.17.0 verziótól kezdve támogatja az Advanced Message Queuing Protocol (), amely egy nyílt üzleti üzenettovábbító szabvány az alkalmazások vagy szervezetek között.
egy olyan szolgáltatás, amely egy nyílt projekt, alapján épült, és megvalósítja az üzenetküldő mechanizmust a platformon. További részletek a működéséről itt találhatók: . Ma megmutatjuk, hogyan lehet az AMQ Online-t és a Quarkust összekapcsolni, hogy egy modern üzenetküldő rendszert építsünk az OpenShift segítségével, két új, üzenetkezeléssel kapcsolatos technológia felhasználásával.
Feltételezzük, hogy már telepítetted az AMQ Online-t az OpenShift platformra (ha nem, akkor nézd meg a ).
). Először létrehozunk egy Quarkus alkalmazást, amely egy egyszerű rendeléskezelő rendszert fog bemutatni reaktív üzenetküldéssel. Ez az alkalmazás magában foglalja a rendelésgenerátort, amely meghatározott időközönként küldi el a rendeléseket az üzenetsorba, valamint a rendelésfeldolgozót, amely a sorba érkező üzeneteket feldolgozza és a böngészőben megtekinthető visszaigazolásokat képez.
Az alkalmazás létrehozása után megmutatjuk, hogyan lehet integrálni az üzenetküldő rendszer konfigurációját, és igénybe vesszük az AMQ Online-t, hogy inicializáljuk a szükséges erőforrásokat.
Quarkus alkalmazásunk
A Quarkus alkalmazásunk az OpenShift-en fut, és a program módosított verziója. A kliens rész teljes példáját itt találod: .
Rendelésgenerátor
A generátor minden 5 másodpercben monoton módon küldi el a növekvő rendelésazonosítókat az „orders” címre.
@ApplicationScoped
public class OrderGenerator {
private int orderId = 1;
@Outgoing("orders")
public Flowable generate() {
return Flowable.interval(5, TimeUnit.SECONDS)
.map(tick -> orderId++);
}
}
Rendelésfeldolgozó
A rendelésfeldolgozó még egyszerűbb, csak visszaadja a visszaigazolás azonosítóját a „confirmations” címre.
@ApplicationScoped
public class OrderProcessor {
@Incoming("orders")
@Outgoing("confirmations")
public Integer process(Integer order) {
// A megerősítés azonosítója a rendelés azonosítójának kétszerese. <img draggable="false" class="emoji" alt=":-)" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f642.svg">
return order * 2;
}
}
Megerősítési erőforrások
Megerősítési erőforrás - ez egy HTTP végpont, amely az alkalmazásunk működése során létrehozott megerősítések listázására szolgál.
@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;
}
}
Beállítás
Az AMQ Online-hoz való csatlakozáshoz az alkalmazásunknak néhány konfigurációs adatra van szüksége, nevezetesen: a Quarkus-csatlakozó konfigurációjára, az AMQP végpont adataira és a kliens hitelesítő adataira. Jobb, ha az összes konfigurációs adat egy helyen van, de szándékosan elválasztjuk őket, hogy bemutassuk az alkalmazás Quarkus beállításának lehetséges módjait.
Csatlakozók
A csatlakozó konfigurációját a fordítási időszakban, az alkalmazás properties fájljával lehet megadni:
mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp
Annak érdekében, hogy ne bonyolítsuk túl a dolgokat, csak az 'orders' címre fogunk üzenetsort használni. A 'confirmations' cím kezelésére pedig a memóriában lévő sorokat fogjuk használni.
AMQP végpont
A fordítási időszakban az AMQP végpont házigazzal és port számmal kapcsolatos információk még ismeretlenek, ezért ezeket be kell illeszteni. A végpontot a configmap-ban lehet megadni, amelyet az AMQ Online hoz létre, ezért ezek meghatározását a környezeti változókon keresztül fogjuk végezni az alkalmazás manifesztjében:
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
Bejelentkezési adatok
A szolgáltatási fiók token használható az alkalmazásunk hitelesítésére az OpenShift-ben. Ehhez először létre kell hozni egy egyedi ConfigSource-t, amely a pod fájlrendszeréből olvassa a hitelesítési tokent:
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);
}
}
Alkalmazás összeállítása és telepítése
Mivel az alkalmazást végrehajtható fájllá kell fordítani, szükség lesz a GraalVM virtuális gépre. További információkért, hogy miként állíthatja be a környezetet, lásd a megfelelő útmutatót a .
Ezután a használható utasítások követésével le kell tölteni a forrást, el kell végezni az összeállítást és telepíteni kell az alkalmazásunkat:
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
A parancsok után az alkalmazás telepítve lesz, de nem fog elindulni, amíg nem állítjuk be az AMQ Online szükséges üzenetküldő erőforrásait.
Üzenetküldő rendszer beállítása
Most már be kell állítanunk az üzenetküldő rendszerben azokat az erőforrásokat, amelyekre az alkalmazásunknak szüksége van. Ehhez létre kell hozni: 1) egy címzési teret az üzenetküldő rendszer végpontjának inicializálásához; 2) egy címet az alkalmazásunkban használt címek beállításához; 3) egy üzenetküldő rendszer felhasználót a kliens hitelesítő adatainak megadásához.
Címzési tér
Az AddressSpace objektum az AMQ Online rendszerben csoportja a címeknek, amelyek közösen használják a kapcsolódási végpontokat, valamint a hitelesítési és jogosultsági politikákat. Címzési tér létrehozásakor megadható, hogy a kapcsolódási végpontok hogyan lesznek biztosítva:
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
Cím
A címek a üzenetek küldésére és fogadására használatosak. Minden címnek van típusa, amely meghatározza a szemantikáját, és van egy terve, amely szabályozza a fenntartott erőforrások számát. A címet például így lehet definiálni:
apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
name: quarkus-example.orders
spec:
address: orders
type: queue
plan: brokered-queue
Üzenetküldő rendszer felhasználója
Ahhoz, hogy a címekre üzeneteket küldhessenek és fogadhassanak, csak megbízható alkalmazásoknak szabad hozzáférniük, ezért az üzenetküldő rendszerben létre kell hozni egy felhasználót. A klaszteren futó alkalmazások esetében a klienseket az OpenShift szolgáltatásfiókjának hitelesítésével lehet azonosítani. A „serviceaccount” felhasználót például így lehet definiálni:
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"]
Alkalmazás beállítások engedélyei
Ahhoz, hogy az AMQ Online létrehozhassa a configmap-et, amelyet az AMQP végpont információinak bevitelére használtunk, meg kell határozni egy szerepet és szerepkötést (Role és 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
Hogyan alkalmazzuk a konfigurációkat
Az üzenetküldő rendszer konfigurációja az alábbi módon alkalmazható:
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
Alkalmazás ellenőrzése
Annak érdekében, hogy megbizonyosodjunk arról, hogy az alkalmazás elindult, először ellenőrizzük, hogy a megfelelő címek létrejöttek-e és aktívak-e:
until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Még nem készen"; sleep 5; done
Ezután ellenőrizzük az alkalmazás útvonalának URL-jét (egyszerűen nyissuk meg ezt a címet a böngészőben):
echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"
A böngészőben látható, hogy a jegyek időszakonként frissülnek, ahogy az üzeneteket az AMQ Online küldik és fogadják.
Összegzés
Tehát elkészítettük a Quarkus alkalmazást, amely AMQP-t használ az üzenetváltáshoz, beállítottuk ezt az alkalmazást a Red Hat OpenShift platformon, valamint implementáltuk a konfigurációját az AMQ Online konfigurációja alapján. Ezután létrehoztuk azokat a manifesztumokat, amelyek szükségesek az üzenetváltó rendszer inicializálásához a mi alkalmazásunk számára.
Ezzel befejezzük a Quarkus sorozatot, de sok új és érdekes dolog vár ránk, maradjatok velünk!
Forrás: habr.com
