Missatgeria nativa del núvol a la plataforma Red Hat OpenShift mitjançant Quarkus i AMQ Online

Hola a tots! Aquí està: la nostra publicació final de la sèrie Quarkus! (Per cert, mireu el nostre seminari web "Això és Quarkus - el marc natiu Java de Kubernetes". Us mostrarem com començar des de zero o transferir solucions ja fetes)

Missatgeria nativa del núvol a la plataforma Red Hat OpenShift mitjançant Quarkus i AMQ Online

В anterior En aquest post hem analitzat les eines rellevants que es poden utilitzar per quantificar les millores obtingudes com a conseqüència de la modernització de les aplicacions Java.

Des de la versió 0.17.0, Quarkus admet l'ús del protocol Advanced Message Queuing Protocol (AMQP), que és un estàndard obert per transferir missatges empresarials entre aplicacions o organitzacions.

Red Hat AMQ Online és un servei construït sobre la base d'un projecte de codi obert EnMasse i implementar un mecanisme de missatgeria basat en plataformes Xarxa Hat OpenShift. Per obtenir més informació sobre com funciona, vegeu aquí (EN). Avui us mostrarem com combinar AMQ Online i Quarkus per crear un sistema de missatgeria modern basat en OpenShift utilitzant dues noves tecnologies de missatgeria.

Se suposa que ja heu implementat AMQ Online a la plataforma OpenShift (si no, consulteu guia d'instal·lació).

Per començar, crearem una aplicació Quarkus que serà un sistema senzill de processament de comandes mitjançant missatgeria reactiva. Aquesta aplicació inclourà un generador de comandes que envia comandes a una cua de missatges a un interval fix, així com un processador de comandes que processarà els missatges de la cua i generarà confirmacions visualitzables al navegador.

Un cop hàgim creat l'aplicació, us mostrarem com inserir la configuració del sistema de missatgeria a l'aplicació i utilitzar AMQ Online per subministrar els recursos que necessitem al sistema.

Aplicació Quarkus

La nostra aplicació Quarkus s'executa a OpenShift i és una versió modificada del programa amqp-inici ràpid. Es pot trobar un exemple complet del costat del client aquí.

Generador de comandes

El generador simplement envia monòtonament identificadors de comandes creixents a l'adreça de "comandes" cada 5 segons.

@ApplicationScoped
public class OrderGenerator {
 
    private int orderId = 1;
 
    @Outgoing("orders")
    public Flowable<Integer> generate() {
        return Flowable.interval(5, TimeUnit.SECONDS)
        .map(tick -> orderId++);
    }
}

Processador de comandes

El gestor de comandes és encara més senzill, només retorna un identificador de confirmació a l'adreça de "confirmacions".

@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;
    }
}

Recursos de confirmació

El recurs de confirmació és un punt final HTTP per llistar les confirmacions generades per la nostra aplicació.

@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;
    }
}

ajust

Per connectar-se a AMQ Online, la nostra aplicació necessitarà algunes dades de configuració, a saber: configuració del connector Quarkus, informació del punt final AMQP i credencials del client. Per descomptat, és millor mantenir totes les dades de configuració en un sol lloc, però les separarem deliberadament per mostrar les possibles opcions per configurar l'aplicació Quarkus.

Connectors

La configuració del connector es pot proporcionar en temps de compilació mitjançant un fitxer de propietats de l'aplicació:

mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp

Per simplificar les coses, només utilitzarem una cua de missatges per a l'adreça de "comandes". I l'adreça de "confirmacions" de la nostra aplicació utilitzarà una cua a la memòria.

Punt final AMQP

En el moment de la compilació, el nom d'amfitrió i el número de port del punt final AMQP són desconeguts, de manera que s'han d'injectar. El punt final es pot configurar al mapa de configuració que ha creat AMQ Online, de manera que els definirem mitjançant variables d'entorn al manifest de l'aplicació:

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

Credencials

El testimoni del compte de servei es pot utilitzar per autenticar la nostra aplicació a OpenShift. Per fer-ho, primer heu de crear un ConfigSource personalitzat que llegirà el testimoni d'autenticació del sistema de fitxers del pod:

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);
    }
}

Crear i desplegar l'aplicació

Com que l'aplicació s'ha de compilar en un fitxer executable, cal una màquina virtual GraalVM. Per obtenir més informació sobre com configurar un entorn per a això, consulteu les instruccions corresponents a Guia Quarkus.

A continuació, seguint les instruccions que s'hi donen, heu de descarregar la font, crear i desplegar la nostra aplicació:

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

Després d'aquestes ordres, l'aplicació es desplegarà, però no s'iniciarà fins que no configurem els recursos de missatgeria que necessitem a AMQ Online.

Configuració del sistema de missatgeria

Ara només queda configurar els recursos que necessita la nostra aplicació al sistema de missatgeria. Per fer-ho, heu de crear: 1) un espai d'adreces per inicialitzar el punt final del sistema de missatgeria; 2) adreça per configurar les adreces que utilitzem a l'aplicació; 3) Usuari de missatgeria per establir les credencials del client.

Espai d'adreces

Un objecte AddressSpace a AMQ Online és un grup d'adreces que comparteixen punts finals de connexió i polítiques d'autenticació i autorització. Quan creeu un espai d'adreces, podeu especificar com s'exposaran els punts finals de missatgeria:

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

Adreces

Les adreces s'utilitzen per enviar i rebre missatges. Cada adreça té un tipus, que en determina la semàntica, així com un pla, que especifica el nombre de recursos a reservar. L'adreça es pot determinar, per exemple, així:

apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
  name: quarkus-example.orders
spec:
  address: orders
  type: queue
  plan: brokered-queue

Usuari de missatgeria

Per assegurar-vos que només les aplicacions de confiança poden enviar i rebre missatges a les vostres adreces, heu de crear un usuari al sistema de missatgeria. Per a les aplicacions que s'executen en un clúster, els clients es poden autenticar mitjançant un compte de servei OpenShift. El "compte de servei" d'usuari es pot definir, per exemple, així:

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"]

Permisos per configurar l'aplicació

Perquè AMQ Online creï el mapa de configuració que hem utilitzat per incrustar la informació del punt final d'AMQP, s'han d'establir Role i 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

Com aplicar configuracions

Podeu aplicar la configuració del sistema de missatgeria així:

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

Verificació de l'aplicació

Per assegurar-nos que l'aplicació s'ha iniciat, en primer lloc, comprovem si les adreces corresponents s'han creat i estan actives:

until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Not yet ready"; sleep 5; done

A continuació, comprovem l'URL de la ruta de l'aplicació (només obriu aquesta adreça al navegador):

echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"

El navegador hauria de mostrar que les entrades s'actualitzen periòdicament a mesura que AMQ Online envia i rep missatges.

En resum

Així que vam escriure una aplicació Quarkus que utilitza AMQP per a la missatgeria, vam configurar l'aplicació perquè s'executi a la plataforma Red Hat OpenShift i vam implementar la seva configuració basada en la configuració d'AMQ Online. Després vam crear els manifests necessaris per inicialitzar el sistema de missatgeria per a la nostra aplicació.

Això conclou la sèrie sobre Quarkus, però hi ha moltes coses noves i interessants per endavant, estigueu atents!

Font: www.habr.com

Afegeix comentari