Échange de messages orienté cloud sur la plateforme Red Hat OpenShift en utilisant Quarkus et AMQ Online

Bonjour à tous ! Voici notre dernier article de la série sur Quarkus ! (Au fait, regardez notre webinaire «C'est Quarkus – un framework Java natif de Kubernetes». Nous allons montrer comment commencer «de zéro» ou migrer des solutions existantes)

Échange de messages orienté cloud sur la plateforme Red Hat OpenShift en utilisant Quarkus et AMQ Online

Dans précédent dans cet article, nous avons examiné les outils pertinents qui permettent d'évaluer quantitativement les améliorations obtenues suite à la modernisation des applications Java.

À partir de la version 0.17.0, Quarkus supporte l'utilisation du Advanced Message Queuing Protocol (AMQP), qui est une norme ouverte pour le transfert de messages d'entreprise entre applications ou organisations.

Red Hat AMQ Online est un service basé sur un projet ouvert EnMasse et met en œuvre un mécanisme de messagerie sur la plateforme Red Hat OpenShift. Pour en savoir plus sur son fonctionnement, consultez ici (EN). Aujourd'hui, nous allons montrer comment combiner AMQ Online et Quarkus pour construire un système moderne de messagerie basé sur OpenShift en utilisant deux nouvelles technologies liées au traitement des messages.

Il est supposé que vous avez déjà déployé AMQ Online sur la plateforme OpenShift (si ce n'est pas le cas, consultez le guide d'installation).

Pour commencer, nous allons créer une application Quarkus qui représentera un système simple de gestion des commandes utilisant un échange de messages réactif. Cette application inclura un générateur de commandes envoyant des commandes dans une file de messages à intervalles réguliers, ainsi qu'un traitement des commandes qui traitera les messages de la file et générera des confirmations disponibles à visualiser dans le navigateur.

Après avoir créé l'application, nous montrerons comment intégrer la configuration du système de messagerie et utiliserons AMQ Online pour initialiser les ressources nécessaires sur ce système.

Application Quarkus

Notre application Quarkus s'exécute sur OpenShift et est une version modifiée du programme amqp-quickstart. Un exemple complet de la partie cliente peut être trouvé ici.

Générateur de commandes

Le générateur envoie simplement des identifiants de commande croissants à l'adresse « orders » toutes les 5 secondes.

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

Gestionnaire des commandes

Le gestionnaire des commandes est encore plus simple, il renvoie simplement l'identifiant de confirmation à l'adresse « confirmations ».

@ApplicationScoped
public class OrderProcessor {
    @Incoming("orders")
    @Outgoing("confirmations")
    public Integer process(Integer order) {
        // L'identifiant de confirmation est égal au double de l'identifiant de la commande <img draggable="false" class="emoji" alt=":-)" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f642.svg">
        return order * 2;
    }
}

Ressources de confirmation

La ressource de confirmation est un point de terminaison HTTP pour la liste des confirmations générées par notre application.

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

Configuration

Pour se connecter à AMQ Online, notre application a besoin de certaines données de configuration, à savoir : la configuration du connecteur Quarkus, les informations sur le point de terminaison AMQP et les identifiants du client. Il est préférable de garder toutes les données de configuration en un seul endroit, mais nous les diviserons intentionnellement pour montrer les différentes options de configuration de l'application Quarkus.

Connecteurs

La configuration du connecteur peut être fournie au moment de la compilation à l'aide d'un fichier de propriétés de l'application :

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

Pour simplifier, nous utiliserons la file de messages uniquement pour l'adresse « orders ». L'adresse « confirmations » dans notre application utilisera une file en mémoire.

Point de terminaison AMQP

Au moment de la compilation, le nom d'hôte et le numéro de port pour le point de terminaison AMQP ne sont pas connus, il faut donc les injecter. Le point de terminaison peut être défini dans le configmap, qui est créé par AMQ Online, nous allons donc les définir via des variables d'environnement dans le manifeste de l'application :

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

Identifiants

Le jeton du compte de service peut être utilisé pour authentifier notre application dans OpenShift. Pour cela, il faut d'abord créer une ConfigSource personnalisée qui lira le jeton d'authentification depuis le système de fichiers du pod :

public class MessagingCredentialsConfigSource implements 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);
    }
}

Compilation et déploiement de l'application

Puisque l'application doit être compilée en un exécutable, une machine virtuelle GraalVM sera nécessaire. Pour plus de détails sur la façon de configurer cet environnement, consultez les instructions correspondantes dans Quarkus Guide.

Ensuite, en suivant les instructions fournies là-bas, vous devez télécharger le code source, effectuer la compilation et déployer notre application :

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

Après ces commandes, l'application sera déployée, mais elle ne démarrera pas tant que nous n'aurons pas configuré les ressources de messagerie nécessaires dans AMQ Online.

Configuration du système de messagerie

Nous devons maintenant spécifier dans le système de messagerie les ressources dont notre application a besoin. Pour cela, il faut créer : 1) un espace d'adresses pour initialiser le point de terminaison du système de messagerie ; 2) une adresse pour configurer les adresses que nous utilisons dans l'application ; 3) un utilisateur du système de messagerie pour définir les informations d'identification du client.

Espace d'adresses

L'objet AddressSpace dans AMQ Online est un groupe d'adresses qui partagent les points de terminaison de connexion, ainsi que les politiques d'authentification et d'autorisation. Lors de la création de l'espace d'adresses, il est possible de définir comment les points de terminaison du système de messagerie seront fournis :

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

Adresses

Les adresses sont utilisées pour envoyer et recevoir des messages. Chaque adresse a un type qui définit sa sémantique, ainsi qu'un plan qui détermine le nombre de ressources réservées. Une adresse peut être définie comme suit :

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

Utilisateur du système de messagerie

Pour que seules les applications de confiance puissent envoyer et recevoir des messages sur vos adresses, un utilisateur doit être créé dans le système de messagerie. Pour les applications fonctionnant dans le cluster, les clients peuvent être authentifiés à l'aide d'un compte de service OpenShift. L'utilisateur « serviceaccount » peut être défini comme suit :

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

Permissions pour la configuration de l'application

Pour qu'AMQ Online puisse créer le configmap que nous avons utilisé pour injecter les informations sur le point de terminaison AMQP, il est nécessaire de définir un rôle et une liaison de rôle (Role et 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

Comment appliquer les configurations

Les configurations du système de messagerie peuvent être appliquées comme suit :

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

Vérification de l'application

Pour vous assurer que l'application a démarré, vérifions d'abord si les adresses correspondantes ont été créées et sont actives :

until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Pas encore prêt"; sleep 5; done

Ensuite, nous vérifierons l'URL de la route de l'application (il suffit d'ouvrir cette adresse dans le navigateur) :

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

Le navigateur devrait afficher que les tickets se mettent à jour périodiquement au fur et à mesure que les messages sont envoyés et reçus par AMQ Online.

Bilan

Ainsi, nous avons écrit une application Quarkus utilisant AMQP pour l'échange de messages, configuré cette application pour fonctionner sur la plateforme Red Hat OpenShift, et déployé sa configuration basée sur celle d'AMQ Online. Ensuite, nous avons créé les manifestes nécessaires pour initier le système d'échange de messages pour notre application.

Ainsi, nous concluons notre série sur Quarkus, mais beaucoup de nouvelles choses intéressantes nous attendent, restez avec nous !

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster