Pilvepõhine sõnumite vahetus Red Hat OpenShift platvormil Quarkuse ja AMQ Online'i abil

Tere kõigile! Siin ta on – meie viimane postitus Quarkuse seerias! (Üksikasjalikke arutelusid näete meie veebiseminaril „See on Quarkus – Kubernetes'i kohaliku Java raamistik“. Näitame, kuidas alustada „nullist“ või migreerida valmis lahendusi)

Pilvepõhine sõnumite vahetus Red Hat OpenShift platvormil Quarkuse ja AMQ Online'i abil

V eelnevas Postituses vaatleme vastavaid tööriistu, millega saab kvantitatiivselt hinnata Java rakenduste moderniseerimisega saadud täiustusi.

Alates versioonist 0.17.0 Quarkus toetab Advanced Message Queuing Protocol'i (AMQP), mis on avatud standard ärisõnumite vahetamiseks rakenduste või organisatsioonide vahel.

Red Hat AMQ Online on teenus, mis põhineb avatud projektil EnMasse ja rakendab sõnumite vahetamise mehhanismi Red Hat OpenShift. Lisainfot selle kohta leiate siit (EN). Täna näitame, kuidas ühendada AMQ Online ja Quarkus, et üles ehitada kaasaegne sõnumite vahetussüsteem OpenShiftis, kasutades kahte uut tehnoloogiat, mis on seotud sõnumite töötlemisega.

Eeldatakse, et olete juba käivitanud AMQ Online'i OpenShift platvormil (kui ei, vaadake installatsiooni juhendit).

Alguses loome Quarkus rakenduse, mis esindab lihtsat tellimuste töötlemise süsteemi, kasutades reaktiivset sõnumivahetust. See rakendus hõlmab tellimuste generaatorit, mis saadab tellimusi sõnumijärjekorda kindla ajavahemiku järel, ja samuti tellimuste töötlejat, mis töötleb sõnumeid järjekorrast ning loob kinnitused, mida saab veebibrauseris vaadata.

Pärast rakenduse loomist näitame, kuidas integreerida sellesse sõnumivahetussüsteemi seadistust ja kasutame AMQ Online'i, et käivitada vajalikud ressursid selle süsteemis.

Quarkus rakendus

Meie Quarkus rakendus töötab OpenShiftis ja on modifitseeritud versioon programmist amqp-quickstart. Täieliku kliendiosa näite leiab siit.

Tellimuste generaator

Generaator saadab iga 5 sekundi järel lihtsalt monotoolselt kasvavaid tellimuse identifikaatoreid aadressile «orders».

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

Tellimuste töötleja

Tellimuste töötleja on veelgi lihtsam, see tagastab lihtsalt kinnituse tuvastaja aadressile "confirmations".

@ApplicationScoped
public class OrderProcessor {
    @Incoming("orders")
    @Outgoing("confirmations")
    public Integer process(Integer order) {
        // Kinnitusidentifikaator on tellimuse identifikaatori kahekordne väärtus <img draggable="false" class="emoji" alt=":-)" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f642.svg">
        return order * 2;
    }
}

Kinnitamise ressursid

Kinnitamise ressurss on HTTP lõpp-punkt, mis loetleb meie rakenduse töö tulemusena genereeritud kinnitusi.

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

Seadistamine

AMQ Online'i ühendamiseks vajab meie rakendus mõned konfiguratsioonid, sealhulgas Quarkuse liidese konfiguratsioon, AMQP lõpp-punkti andmed ja kliendi sisselogimise andmed. Parim on hoida kõik konfiguratsioonid ühes kohas, kuid me jagame need sihilikult, et näidata võimalikke Quarkuse rakenduse seadistamise variante.

Liidesed

Liidese konfiguratsiooni saab esitada kompileerimise käigus rakenduse omaduste faili kaudu:

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

Lihtsustamiseks kasutame sõnumijärjekorda ainult aadressile «orders». Aadress «confirmations» meie rakenduses kasutab aga mälu järjekorda.

AMQP lõpp-punkt

Kompileerimise etapis ei ole AMQP lõpp-punkti hosti nime ja porta number teada, seega tuleb need sisestada. Lõpp-punkti saab määratleda configmap'is, mille loob AMQ Online, seega määrame need meie rakenduse manifestis keskkonnamuutujate kaudu:

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

Krediteerimine

Teenusekonto märk võib meie rakenduse autentimiseks OpenShiftis kasutada. Selleks tuleb esmalt luua kohandatud ConfigSource, mis loeb autentimismärgi pod'i failisüsteemist:

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

Rakenduse koostamine ja paigaldamine

Kuna rakendus tuleb kompileerida töötatavaks failiks, on vajalik GraalVM virtuaalmasin. Lisainfot keskkonna seadistamise kohta leiate vastavatest juhenditest Quarkus'i juhend.

Seejärel järgige seal antud juhiseid, et alla laadida lähtekood, koostada ja juurutada meie rakendust:

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

Pärast neid käske rakendus juurutatakse, kuid see ei käivitu enne, kuni oleme AMQ Online'is seadistatud vajalikud sõnumivahetuse ressursid.

Sõnumivahetussüsteemi seadistamine

Nüüd jääb meil seadistada sõnumivahetussüsteemis ressursid, mida meie rakendus vajab. Selleks tuleb luua: 1) aadressiruumi, et initsialiseerida sõnumivahetussüsteemi lõpp-punkt; 2) aadress, et seadistada rakenduses kasutatavad aadressid; 3) sõnumivahetussüsteemi kasutaja, et määrata kliendi mandaat.

Aadressiruumi

AMQ Online'i AddressSpace objekt on aadresside rühm, mis jagavad ühiselt ühenduspunktide lõppepunkte ning autentimise ja autoriseerimise poliitikaid. Aadressiruumi loomisel saab määrata, kuidas sõnumite vahetuse süsteemi lõppepunkte antakse:

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

Aadressid

Aadresse kasutatakse sõnumite saatmiseks ja vastuvõtmiseks. Igal aadressil on tüüp, mis määrab selle semantika, ja plaan, mis määrab reserveeritavate ressursside arvu. Aadressi saab määratleda näiteks järgmiselt:

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

Sõnumite vahetuse süsteemi kasutaja

Et sõnumite saatmine ja vastuvõtmine teie aadresside kaudu oleks võimalik ainult usaldusväärsetele rakendustele, peab sõnumite vahetuse süsteemis olema loodud kasutaja. Klastri põhjal töötavatele rakendustele saab kliente autentida OpenShift'i teenusekonto abil. Kasutajat "serviceaccount" saab määratleda näiteks järgmiselt:

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

Rakenduse seadistamise õigused

Et AMQ Online saaks luua configmap'i, mida kasutasime AMQP lõpp-punkti andmete rakendamiseks, on vajalik määrata roll ja rolli sidumine (Role ja 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

Kuidas rakendada konfiguratsioone

Süsteemi sõnumivahetuse konfiguratsiooni saab rakendada järgmiselt:

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

Rakenduse kontrollimine

Et veenduda, et rakendus on käivitunud, kontrollime esmalt, kas vastavad aadressid on loodud ja aktiivsed:

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

Seejärel kontrollime rakenduse marsruudi URL-i (ava lihtsalt see aadress brauseris):

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

Brauseris peaks olema nähtav, et pileteid uuendatakse regulaarselt, kui sõnumeid saadetakse ja vastu võetakse AMQ Online.

Teeme kokkuvõtteid

Nii et oleme kirjutanud Quarkuse rakenduse, mis kasutab AMQP-d sõnumite vahetamiseks, seadnud selle rakenduse tööle Red Hat OpenShift platvormil ning rakendanud selle konfiguratsiooni AMQ Online-i põhjal. Seejärel loome manifestid, mis on vajalikud sõnumivahetussüsteemi käivitamiseks meie rakenduse jaoks.

Sellega lõpetame Quarkuse sarja, kuid ees on palju uut ja huvitavat, jääge meiega!

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster