Cloud-nativní výměna zpráv na platformě Red Hat OpenShift pomocí Quarkus a AMQ Online

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ář "To je Quarkus – Kubernetes nativní Java framework". Ukážeme, jak začít "od nuly" nebo přenést existující řešení)

Cloud-nativní výměna zpráv na platformě Red Hat OpenShift pomocí Quarkus a AMQ Online

V V předchozím 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, Quarkus podporuje používání Advanced Message Queuing Protocol (AMQP), což je otevřený standard pro přenos obchodních zpráv mezi aplikacemi nebo organizacemi.

Red Hat AMQ Online je služba založená na open-source projektu EnMasse a implementuje mechanismus výměny zpráv na základě platformy Red Hat OpenShift. Více informací o tom, jak to funguje, najdete zde (EN). 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 příručku pro instalaci).

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 amqp-quickstart. Kompletní příklad klientské části můžete najít zde.

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 Quarkus Guide.

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

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster