Mensaxería nativa na nube na plataforma Red Hat OpenShift mediante Quarkus e AMQ Online

Ola a todos! Aquí está a nosa publicación final da serie Quarkus! (Por certo, mira o noso webinar "Este é Quarkus - framework Java nativo de Kubernetes". Mostrémosche como comezar desde cero ou transferir solucións xa preparadas)

Mensaxería nativa na nube na plataforma Red Hat OpenShift mediante Quarkus e AMQ Online

В anterior Neste post, analizamos as ferramentas relevantes que se poden empregar para cuantificar as melloras obtidas como resultado da modernización das aplicacións Java.

Desde a versión 0.17.0, quarkus admite o uso do Advanced Message Queuing Protocol (AMQP), que é un estándar aberto para transferir mensaxes empresariais entre aplicacións ou organizacións.

Red Hat AMQ Online é un servizo construído sobre a base dun proxecto de código aberto EnMase e implementar un mecanismo de mensaxería baseado en plataformas RedHat OpenShift. Para obter máis detalles sobre como funciona, consulte aquí (EN). Hoxe mostrarémosche como combinar AMQ Online e Quarkus para construír un moderno sistema de mensaxería baseado en OpenShift utilizando dúas novas tecnoloxías de mensaxería.

Suponse que xa implantou AMQ Online na plataforma OpenShift (se non, consulte guía de instalación).

Para comezar, crearemos unha aplicación Quarkus que será un simple sistema de procesamento de pedidos mediante mensaxería reactiva. Esta aplicación incluirá un xerador de pedidos que envía pedidos a unha cola de mensaxes nun intervalo fixo, así como un procesador de pedidos que procesará as mensaxes da cola e xerará confirmacións visibles no navegador.

Unha vez que creamos a aplicación, mostrarémosche como inserir a configuración do sistema de mensaxería na aplicación e usar AMQ Online para proporcionar os recursos que necesitamos no sistema.

Aplicacion Quarkus

A nosa aplicación Quarkus execútase en OpenShift e é unha versión modificada do programa amqp-inicio rápido. Pódese atopar un exemplo completo do lado do cliente aquí.

Xerador de pedidos

O xerador simplemente envía monótonamente ID de pedidos crecentes ao enderezo de "pedidos" cada 5 segundos.

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

Procesador de pedidos

O controlador de pedidos é aínda máis sinxelo, só devolve un ID de confirmación ao enderezo de "confirmacións".

@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ón

O recurso de confirmación é un punto final HTTP para listar as confirmacións xeradas pola nosa aplicación.

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

axuste

Para conectarse a AMQ Online, a nosa aplicación necesitará algúns datos de configuración, a saber: configuración do conector Quarkus, información do punto final de AMQP e credenciais do cliente. Por suposto, é mellor manter todos os datos de configuración nun só lugar, pero separarémolos deliberadamente para mostrar as posibles opcións para configurar a aplicación Quarkus.

Conectores

A configuración do conector pódese proporcionar no momento da compilación mediante un ficheiro de propiedades da aplicación:

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

Para simplificar as cousas, só usaremos unha fila de mensaxes para o enderezo de "pedidos". E o enderezo de "confirmacións" da nosa aplicación utilizará unha cola na memoria.

Punto final de AMQP

No momento da compilación, o nome de host e o número de porto para o punto final AMQP son descoñecidos, polo que deben ser inxectados. O punto final pódese establecer no mapa de configuración creado por AMQ Online, polo que os definiremos mediante variables de ambiente no manifesto da aplicación:

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

Credenciais

O token da conta de servizo pódese usar para autenticar a nosa aplicación en OpenShift. Para iso, primeiro debes crear un ConfigSource personalizado que lerá o token de autenticación do sistema de ficheiros do 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);
    }
}

Construír e implementar a aplicación

Dado que a aplicación debe compilarse nun ficheiro executable, é necesaria unha máquina virtual GraalVM. Para obter máis información sobre como configurar un ambiente para iso, consulte as instrucións correspondentes en Guía Quarkus.

Despois, seguindo as instrucións indicadas alí, cómpre descargar a fonte, construír e implementar a nosa aplicación:

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

Despois destes comandos, a aplicación despregarase, pero non se iniciará ata que configuremos os recursos de mensaxería que necesitamos en AMQ Online.

Configurar o sistema de mensaxería

Agora só queda configurar os recursos que precisa a nosa aplicación no sistema de mensaxería. Para iso, cómpre crear: 1) un espazo de enderezos para inicializar o punto final do sistema de mensaxería; 2) enderezo para configurar os enderezos que usamos na aplicación; 3) Usuario de mensaxería para establecer as credenciais do cliente.

Espazo de enderezos

Un obxecto AddressSpace en AMQ Online é un grupo de enderezos que comparten puntos finais de conexión e políticas de autenticación e autorización. Cando creas un espazo de enderezos, podes especificar como se expoñerán os puntos finais de mensaxería:

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

Direccións

Os enderezos utilízanse para enviar e recibir mensaxes. Cada enderezo ten un tipo, que determina a súa semántica, así como un plan, que especifica o número de recursos a reservar. O enderezo pódese determinar, por exemplo, así:

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

Usuario de mensaxería

Para garantir que só as aplicacións de confianza poidan enviar e recibir mensaxes aos teus enderezos, debes crear un usuario no sistema de mensaxería. Para as aplicacións que se executan nun clúster, os clientes pódense autenticar mediante unha conta de servizo OpenShift. A "conta de servizo" do usuario pódese definir, por exemplo, así:

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 para configurar a aplicación

Para que AMQ Online cree o mapa de configuración que utilizamos para incorporar a información do punto final de AMQP, debe establecerse o Role e 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

Como aplicar as configuracións

Podes aplicar a configuración do sistema de mensaxería deste xeito:

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ón da aplicación

Para asegurarnos de que a aplicación se iniciou, comprobamos, en primeiro lugar, se os enderezos correspondentes foron creados e están activos:

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

A continuación, comprobemos o URL da ruta da aplicación (só abre este enderezo no navegador):

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

O navegador debería mostrar que os tickets se actualizan periodicamente a medida que AMQ Online envía e recibe mensaxes.

Resumindo

Entón, escribimos unha aplicación Quarkus que usa AMQP para a mensaxería, configuramos a aplicación para que se executase na plataforma Red Hat OpenShift e implementamos a súa configuración baseada na configuración de AMQ Online. Despois creamos os manifestos necesarios para inicializar o sistema de mensaxería para a nosa aplicación.

Así remata a serie sobre Quarkus, pero hai moitas cousas novas e interesantes por diante, estade atentos!

Fonte: www.habr.com

Engadir un comentario