Sziasztok! Itt van - utolsó bejegyzésünk a Quarkus sorozatban! (Egyébként nézze meg webináriumunkat
В
A 0.17.0 verzió óta,
Feltételezzük, hogy már telepítette az AMQ Online-t az OpenShift platformon (ha nem, akkor lásd
Kezdésként létrehozunk egy Quarkus alkalmazást, amely egy egyszerű, reaktív üzenetküldést használó rendelésfeldolgozó rendszer lesz. Ez az alkalmazás tartalmazni fog egy rendelésgenerátort, amely meghatározott időközönként küld rendeléseket egy üzenetsorba, valamint egy rendelésfeldolgozót, amely feldolgozza a sor üzeneteit, és a böngészőben megtekinthető visszaigazolásokat generál.
Miután létrehoztuk az alkalmazást, megmutatjuk, hogyan ágyazhatja be az üzenetküldő rendszer konfigurációját az alkalmazásba, és hogyan használhatja az AMQ Online-t a szükséges erőforrások biztosításához a rendszeren.
Quarkus alkalmazás
Quarkus alkalmazásunk OpenShift-en fut, és a program módosított változata
Rendelés generátor
A generátor egyszerűen monoton módon 5 másodpercenként küldi a növekvő rendelésazonosítókat a „rendelések” címére.
@ApplicationScoped
public class OrderGenerator {
private int orderId = 1;
@Outgoing("orders")
public Flowable<Integer> generate() {
return Flowable.interval(5, TimeUnit.SECONDS)
.map(tick -> orderId++);
}
}
Rendelésfeldolgozó
A rendeléskezelő még egyszerűbb, csak egy visszaigazoló azonosítót ad vissza a „visszaigazolások” címére.
@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;
}
}
Megerősítő források
A megerősítési erőforrás egy HTTP-végpont az alkalmazásunk által generált megerősítések listázásához.
@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;
}
}
beállítás
Az AMQ Online-hoz való csatlakozáshoz alkalmazásunknak szüksége lesz néhány konfigurációs adatra, nevezetesen: Quarkus-csatlakozó-konfigurációra, AMQP-végpont-információkra és ügyfél hitelesítő adataira. Természetesen jobb, ha az összes konfigurációs adatot egy helyen tároljuk, de szándékosan szétválasztjuk őket, hogy megmutassuk a Quarkus alkalmazás beállítási lehetőségeit.
Csatlakozók
A csatlakozási szoftver konfigurációja fordításkor is megadható egy alkalmazástulajdonság-fájl segítségével:
mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp
Az egyszerűség kedvéért csak üzenetsort fogunk használni a „rendelési” címhez. Az alkalmazásunkban található „megerősítési” cím pedig egy sort fog használni a memóriában.
AMQP végpont
Fordításkor az AMQP-végpont gazdagépneve és portszáma ismeretlen, ezért be kell adni őket. A végpont az AMQ Online által létrehozott konfigurációs térképben állítható be, ezért az alkalmazás jegyzékében lévő környezeti változókon keresztül határozzuk meg őket:
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
Hitelesítő adatok
A szolgáltatásfiók-token felhasználható alkalmazásunk OpenShift hitelesítésére. Ehhez először létre kell hoznia egy egyéni ConfigSource-t, amely beolvassa a hitelesítési tokent a pod fájlrendszeréből:
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);
}
}
Az alkalmazás felépítése és üzembe helyezése
Mivel az alkalmazást végrehajtható fájlba kell fordítani, GraalVM virtuális gépre van szükség. Az ehhez szükséges környezet beállításának részleteiért tekintse meg a megfelelő utasításokat
Ezután az ott megadott utasításokat követve le kell töltenie a forrást, össze kell építenie és telepítenie 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
E parancsok után az alkalmazás telepítésre kerül, de addig nem indul el, amíg be nem állítjuk a szükséges üzenetkezelési erőforrásokat az AMQ Online-ban.
Az üzenetküldő rendszer beállítása
Most már csak be kell állítani azokat az erőforrásokat, amelyekre alkalmazásunknak szüksége van az üzenetküldő rendszerben. Ehhez létre kell hoznia: 1) egy címteret az üzenetküldő rendszer végpontjának inicializálásához; 2) cím az alkalmazásban használt címek konfigurálásához; 3) Üzenetküldő felhasználó az ügyfél hitelesítő adatainak beállításához.
Címterület
Az AMQ Online AddressSpace objektuma olyan címcsoport, amely megosztja a kapcsolati végpontokat, valamint a hitelesítési és engedélyezési házirendeket. Amikor létrehoz egy címteret, megadhatja, hogyan jelenjenek meg az üzenetküldési végpontok:
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 üzenetek küldésére és fogadására szolgálnak. Minden címnek van egy típusa, amely meghatározza a szemantikáját, valamint egy terv, amely meghatározza a lefoglalandó erőforrások számát. A címet például így lehet meghatározni:
apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
name: quarkus-example.orders
spec:
address: orders
type: queue
plan: brokered-queue
Üzenetküldő felhasználó
Annak biztosítása érdekében, hogy csak megbízható alkalmazások küldhessenek és fogadhassanak üzeneteket az Ön címére, létre kell hoznia egy felhasználót az üzenetküldő rendszerben. Fürtön futó alkalmazások esetén az ügyfelek OpenShift szolgáltatásfiókkal hitelesíthetők. A "serviceaccount" felhasználó például a következőképpen határozható meg:
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"]
Engedélyek az alkalmazás konfigurálásához
Ahhoz, hogy az AMQ Online létrehozza azt a konfigurációs térképet, amelyet az AMQP végpont információinak beágyazásához használtunk, be kell állítani a Role és RoleBinding paramétereket:
---
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
A konfigurációk alkalmazása
Az üzenetküldő rendszer konfigurációját a következőképpen alkalmazhatja:
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őrizze, 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 "Not yet ready"; sleep 5; done
Ezután nézzük meg az alkalmazás útvonalának URL-jét (csak nyissa 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őnek azt kell mutatnia, hogy a jegyek rendszeresen frissülnek, ahogy az AMQ Online üzeneteket küld és fogad.
Összefoglalva
Így írtunk egy Quarkus alkalmazást, amely AMQP-t használ az üzenetküldéshez, beállítottuk az alkalmazást, hogy a Red Hat OpenShift platformon fusson, és a konfigurációját az AMQ Online konfigurációja alapján implementáltuk. Ezután létrehoztuk az alkalmazásunk üzenetküldő rendszerének inicializálásához szükséges jegyzékeket.
Ezzel véget is ért a Quarkusról szóló sorozat, de sok új és érdekes dolog áll előttünk, maradj velünk!
Forrás: will.com