Ahoj všichni! Tady je – náš závěrečný příspěvek ze série o Quarkus! (Mimochodem, podívejte se na náš webinář . Ukážeme, jak začít "od nuly" nebo přenést existující řešení)

V příspěvku jsme prozkoumali odpovídající nástroje, pomocí kterých lze kvantitativně posoudit zlepšení dosažená díky modernizaci Java aplikací.
Od verze 0.17.0, podporuje používání Advanced Message Queuing Protocol (), což je otevřený standard pro přenos obchodních zpráv mezi aplikacemi nebo organizacemi.
je služba založená na open-source projektu a implementuje mechanismus výměny zpráv na základě platformy . Více informací o tom, jak to funguje, najdete . Dnes ukážeme, jak spojit AMQ Online a Quarkus, abychom vybudovali moderní systém výměny zpráv na základě OpenShift s využitím dvou nových technologií spojených s zpracováním zpráv.
Předpokládá se, že jste již nasadili AMQ Online na platformě OpenShift (pokud ne, podívejte se na ).
Na začátek vytvoříme aplikaci Quarkus, která bude představovat jednoduchý systém zpracování objednávek s použitím reaktivní výměny zpráv. Tato aplikace bude zahrnovat generátor objednávek, který posílá objednávky do fronty zpráv v pravidelných intervalech, a zpracovatele objednávek, který zpracovává zprávy z fronty a vytváří potvrzení dostupná pro zobrazení v prohlížeči.
Po vytvoření aplikace ukážeme, jak implementovat konfiguraci systému výměny zpráv a využijeme AMQ Online k inicializaci potřebných zdrojů na tomto systému.
Aplikace Quarkus
Naše Quarkus aplikace běží na OpenShift a představuje modifikovanou verzi programu . Kompletní příklad klientské části můžete najít .
Generátor objednávek
Generátor každých 5 sekund monotónně posílá rostoucí identifikátory objednávek 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++);
}
}
Zpracovatel objednávek
Zpracovatel objednávek je ještě jednodušší, vrací pouze identifikátor potvrzení na adresu „confirmations“.
@ApplicationScoped
public class OrderProcessor {
@Incoming("orders")
@Outgoing("confirmations")
public Integer process(Integer order) {
// Identifikátor potvrzení je roven dvojnásobku identifikátoru 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;
}
}
Potvrzovací zdroje
Potvrzovací zdroj je HTTP koncový bod pro seznam potvrzení, která byla vytvořena na základě činnosti naší aplikace.
@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;
}
}
Nastavení
Pro připojení k AMQ Online bude naší aplikaci potřeba několik konfiguračních údajů, konkrétně: konfigurace Quarkus konektoru, informace o AMQP koncovém bodu a klientské přihlašovací údaje. Samozřejmě je nejlepší uchovávat všechny konfigurační údaje na jednom místě, ale záměrně je rozdělíme, abychom ukázali možné varianty nastavení aplikace Quarkus.
Konektory
Konfiguraci konektoru lze poskytnout na fázi kompilace pomocí souboru vlastností aplikace:
mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp
Abychom to zjednodušili, použijeme frontu zpráv pouze pro adresu „orders“. Adresa „confirmations“ v naší aplikaci bude používat frontu v paměti.
AMQP koncový bod
Na fázi kompilace není jméno hostitele a číslo portu pro AMQP koncový bod známo, proto je třeba je do aplikace integrovat. Konec lze definovat v configmap, který vytváří AMQ Online, a proto je určíme prostřednictvím proměnných prostředí v manifestu aplikace:
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
Přihlašovací údaje
Token účtu služby lze použít k autentizaci naší aplikace v OpenShift. Nejdříve je třeba vytvořit vlastní ConfigSource, který bude číst autentizační token ze souborového systému podu:
veřejná třída MessagingCredentialsConfigSource implementuje 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);
}
}
Sestavení a nasazení aplikace
Jelikož je třeba aplikaci zkompilovat do spustitelného souboru, bude potřeba virtuální stroj GraalVM. Podrobnosti o tom, jak nastavit toto prostředí, nalezněte v odpovídajících pokynech v .
Poté, co budete následovat uvedené pokyny, je třeba stáhnout zdrojový kód, provést sestavení a nasadit naši aplikaci:
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 příkazech bude aplikace nasazena, ale nebude spuštěna, dokud nenastavíme v AMQ Online potřebné prostředky pro výměnu zpráv.
Nastavení systému pro výměnu zpráv
Nyní je třeba v systému výměny zpráv definovat prostředky, které naše aplikace potřebuje. K tomu je nutné vytvořit: 1) adresní prostor pro inicializaci koncového bodu systému výměny zpráv; 2) adresu pro nastavení adres, které používáme v aplikaci; 3) uživatele systému výměny zpráv pro definování přihlašovacích údajů klienta.
Adresní prostor
Objekt AddressSpace v AMQ Online je skupina adres, které společně používají koncové body připojení, stejně jako politiky autentizace a autorizace. Při vytváření adresního prostoru lze určit, jak budou koncové body systému výměny zpráv poskytovány:
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
Adresy se používají k odesílání a příjmu zpráv. Každá adresa má typ, který určuje její semantiku, a také plán, který určuje počet rezervovaných zdrojů. Adresu lze definovat například takto:
apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
name: quarkus-example.orders
spec:
address: orders
type: queue
plan: brokered-queue
Uživatel systému pro výměnu zpráv
Aby bylo možné odesílat a přijímat zprávy na vašich adresách pouze důvěryhodným aplikacím, je v systému pro výměnu zpráv nutné vytvořit uživatele. Pro aplikace běžící na clusteru lze klienty autentizovat pomocí účtu služby OpenShift. Uživatel "serviceaccount" může být definován napří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ávnění pro nastavení aplikace
Aby mohl AMQ Online vytvořit configmap, který jsme použili pro nasazení informací o koncové bodě AMQP, je nutné nastavit roli a vazbu role (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
Jak aplikovat konfigurace
Konfiguraci systému pro výměnu zpráv lze aplikovat 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
Ověření aplikace
Abychom se ujistili, že aplikace běží, nejprve zkontrolujeme, zda byly vytvořeny a jsou aktivní příslušné adresy:
until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Not yet ready"; sleep 5; done
Poté zkontrolujeme URL adresu aplikace (jednoduše otevřeme tuto adresu v prohlížeči):
echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"
V prohlížeči by mělo být vidět, že se lístky pravidelně aktualizují, jakmile jsou zprávy odesílány a přijímány AMQ Online.
Shrnutí
Napsali jsme aplikaci Quarkus, která používá AMQP k výměně zpráv, nastavili jsme tuto aplikaci pro provoz na platformě Red Hat OpenShift a implementovali její konfiguraci založenou na konfiguraci AMQ Online. Dále jsme vytvořili manifesty potřebné k inicializaci systému výměny zpráv pro naši aplikaci.
Tímto ukončujeme sérii o Quarkusu, ale čeká nás spousta nového a zajímavého, zůstaňte s námi!
Zdroj: habr.com
