Ahoj všichni! Tady to je – náš poslední příspěvek v seriálu Quarkus! (Mimochodem, sledujte náš webinář
В
Od verze 0.17.0,
Předpokládá se, že jste již AMQ Online nasadili na platformu OpenShift (pokud ne, viz
Pro začátek vytvoříme aplikaci Quarkus, která bude jednoduchým systémem zpracování objednávek pomocí reaktivního zasílání zpráv. Tato aplikace bude obsahovat generátor objednávek, který odesílá objednávky do fronty zpráv v pevném intervalu, a také procesor objednávek, který bude zpracovávat zprávy z fronty a generovat potvrzení zobrazitelná v prohlížeči.
Jakmile aplikaci vytvoříme, ukážeme vám, jak vložit konfiguraci systému zasílání zpráv do aplikace a pomocí AMQ Online zajistit prostředky, které potřebujeme v systému.
Aplikace Quarkus
Naše aplikace Quarkus běží na OpenShift a je upravenou verzí programu
Generátor objednávek
Generátor jednoduše každých 5 sekund monotónně posílá rostoucí ID objednávek na adresu „objednávky“.
@ApplicationScoped
public class OrderGenerator {
private int orderId = 1;
@Outgoing("orders")
public Flowable<Integer> generate() {
return Flowable.interval(5, TimeUnit.SECONDS)
.map(tick -> orderId++);
}
}
Zpracovatel objednávek
Obsluha objednávky je ještě jednodušší, pouze vrací potvrzovací ID na adresu „potvrzení“.
@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;
}
}
Zdroje potvrzení
Zdroj potvrzení je koncový bod HTTP pro výpis potvrzení generovaných naší aplikací.
@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;
}
}
Nastavení
Pro připojení k AMQ Online bude naše aplikace potřebovat některá konfigurační data, konkrétně: konfiguraci konektoru Quarkus, informace o koncovém bodu AMQP a přihlašovací údaje klienta. Je samozřejmě lepší mít všechna konfigurační data na jednom místě, ale záměrně je oddělíme, abychom ukázali možné možnosti konfigurace aplikace Quarkus.
Konektory
Konfigurace konektoru může být poskytnuta v době 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 pro adresu „objednávky“ pouze frontu zpráv. A adresa „potvrzení“ v naší aplikaci bude používat frontu v paměti.
Koncový bod AMQP
V době kompilace jsou název hostitele a číslo portu pro koncový bod AMQP neznámé, takže je třeba je vložit. Koncový bod lze nastavit v konfigurační mapě vytvořené AMQ Online, takže je definujeme 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
Pověření
Token servisního účtu lze použít k ověření naší aplikace pro OpenShift. Chcete-li to provést, musíte nejprve vytvořit vlastní zdroj ConfigSource, který načte ověřovací token ze systému souborů modulu:
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);
}
}
Sestavte a nasaďte aplikaci
Protože aplikace musí být zkompilována do spustitelného souboru, je vyžadován virtuální stroj GraalVM. Podrobnosti o tom, jak k tomu nastavit prostředí, viz odpovídající pokyny v
Poté si podle zde uvedených pokynů musíte stáhnout zdroj, sestavit 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 nespustí se, dokud nenakonfigurujeme prostředky pro zasílání zpráv, které potřebujeme v AMQ Online.
Nastavení systému zpráv
Nyní zbývá pouze nastavit prostředky, které naše aplikace potřebuje v systému zasílání zpráv. Chcete-li to provést, musíte vytvořit: 1) adresní prostor pro inicializaci koncového bodu systému zasílání zpráv; 2) adresa pro konfiguraci adres, které používáme v aplikaci; 3) Uživateli zasílání zpráv k nastavení přihlašovacích údajů klienta.
Adresní prostor
Objekt AddressSpace v AMQ Online je skupina adres, které sdílejí koncové body připojení a zásady ověřování a autorizace. Když vytvoříte adresní prostor, můžete určit, jak budou vystaveny koncové body zasílání zpráv:
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 se používají k odesílání a přijímání zpráv. Každá adresa má typ, který určuje její sémantiku, a také plán, který určuje počet zdrojů, které mají být rezervovány. Adresu lze určit například takto:
apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
name: quarkus-example.orders
spec:
address: orders
type: queue
plan: brokered-queue
Uživatel zpráv
Chcete-li zajistit, aby zprávy na vaše adresy mohly odesílat a přijímat pouze důvěryhodné aplikace, musíte v systému zasílání zpráv vytvořit uživatele. U aplikací běžících na clusteru lze klienty ověřit pomocí účtu služby OpenShift. Uživatelský "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í ke konfiguraci aplikace
Aby AMQ Online vytvořil konfigurační mapu, kterou jsme použili k vložení informací o koncovém bodu AMQP, musí být nastavena role a vazba rolí:
---
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 použít konfigurace
Konfiguraci systému zasílání zpráv můžete použít 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 se aplikace spustila, nejprve zkontrolujte, zda byly vytvořeny a aktivní odpovídající adresy:
until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Not yet ready"; sleep 5; done
Poté zkontrolujeme adresu URL trasy aplikace (stačí otevřít tuto adresu v prohlížeči):
echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"
Prohlížeč by měl ukazovat, že vstupenky jsou pravidelně aktualizovány tak, jak jsou zprávy odesílány a přijímány AMQ Online.
Sčítání
Napsali jsme tedy aplikaci Quarkus, která používá AMQP pro zasílání zpráv, nakonfigurovali aplikaci pro běh na platformě Red Hat OpenShift a implementovali její konfiguraci založenou na konfiguraci AMQ Online. Poté jsme vytvořili manifesty potřebné k inicializaci systému zasílání zpráv pro naši aplikaci.
Tímto je série o Quarkusovi uzavřena, ale čeká nás spousta nových a zajímavých věcí, zůstaňte naladěni!
Zdroj: www.habr.com