Cloudové zasílání zpráv na platformě Red Hat OpenShift pomocí Quarkus a AMQ Online

Ahoj všichni! Tady to je – náš poslední příspěvek v seriálu Quarkus! (Mimochodem, sledujte náš webinář „Toto je Quarkus – nativní Java framework Kubernetes“. Ukážeme vám, jak začít od začátku nebo přenést hotová řešení)

Cloudové zasílání zpráv na platformě Red Hat OpenShift pomocí Quarkus a AMQ Online

В předchozí V tomto příspěvku jsme se podívali na příslušné nástroje, které lze použít ke kvantifikaci zlepšení získaných v důsledku modernizace aplikací Java.

Od verze 0.17.0, kvarkus podporuje použití Advanced Message Queuing Protocol (AMQP), což je otevřený standard pro přenos obchodních sdělení mezi aplikacemi nebo organizacemi.

Red Hat AMQ online je služba postavená na základě open source projektu EnMasse a implementaci mechanismu zasílání zpráv založeného na platformě Red Hat OpenShift. Další podrobnosti o tom, jak to funguje, viz zde (EN). Dnes vám ukážeme, jak zkombinovat AMQ Online a Quarkus a vytvořit moderní systém zasílání zpráv založený na OpenShift pomocí dvou nových technologií zasílání zpráv.

Předpokládá se, že jste již AMQ Online nasadili na platformu OpenShift (pokud ne, viz instalační průvodce).

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 amqp-rychlý start. Kompletní příklad klientské strany lze nalézt zde.

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 Průvodce kvarkusem.

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

Přidat komentář