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

Tere kõigile! Siin see on – meie viimane postitus Quarkuse sarjas! (Muide, vaadake meie veebiseminari "See on Quarkus – Kubernetesi kohalik Java raamistik". Näitame teile, kuidas nullist alustada või valmislahendusi üle kanda)

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

В eelmine Selles postituses vaatlesime asjakohaseid tööriistu, mille abil saab kvantifitseerida Java rakenduste moderniseerimise tulemusel saavutatud täiustusi.

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

Red Hat AMQ Online on avatud lähtekoodiga projekti alusel üles ehitatud teenus EnMasse ja platvormipõhise sõnumsidemehhanismi rakendamine Red Hat OpenShift. Lisateavet selle toimimise kohta vt siin (EN). Täna näitame teile, kuidas ühendada AMQ Online ja Quarkus, et luua kaasaegne OpenShift-põhine sõnumsidesüsteem, kasutades kahte uut sõnumsidetehnoloogiat.

Eeldatakse, et olete AMQ Online'i juba OpenShifti platvormil juurutanud (kui mitte, siis vaadake paigaldusjuhend).

Alustuseks loome Quarkuse rakenduse, mis on lihtne tellimuste töötlemise süsteem, mis kasutab reaktiivset sõnumivahetust. See rakendus sisaldab tellimuste generaatorit, mis saadab tellimusi kindla intervalliga sõnumijärjekorda, samuti tellimuste töötlejat, mis töötleb järjekorras olevaid sõnumeid ja genereerib brauseris nähtavaid kinnitusi.

Kui oleme rakenduse loonud, näitame teile, kuidas manustada sõnumsidesüsteemi konfiguratsiooni rakendusse ja kasutada AMQ Online'i süsteemis vajalike ressursside varustamiseks.

Quarkuse rakendus

Meie Quarkuse rakendus töötab OpenShiftis ja on programmi muudetud versioon amqp-quickstart. Täieliku näite kliendi poole kohta leiate siin.

Tellimuste generaator

Generaator saadab lihtsalt iga 5 sekundi järel kasvavad tellimuse ID-d "tellimuste" aadressile.

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

Tellimuse töötleja

Tellimuste töötleja on veelgi lihtsam, see lihtsalt tagastab "kinnituste" aadressile kinnituse ID.

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

Kinnitusressursid

Kinnitusressurss on HTTP lõpp-punkt meie rakenduse loodud kinnituste loetlemiseks.

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

reguleerimine

AMQ Online'iga ühenduse loomiseks vajab meie rakendus mõningaid konfiguratsiooniandmeid, nimelt: Quarkuse konnektori konfiguratsioon, AMQP lõpp-punkti teave ja kliendi mandaadid. Loomulikult on parem hoida kõiki konfiguratsiooniandmeid ühes kohas, kuid me eraldame need teadlikult, et näidata Quarkuse rakenduse seadistamise võimalikke valikuid.

Pistikud

Konnektori konfiguratsiooni saab esitada kompileerimise ajal, kasutades rakenduse atribuutide faili:

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

Asjade lihtsuse huvides kasutame ainult tellimuste aadressi jaoks sõnumijärjekorda. Ja meie rakenduse „kinnituste” aadress kasutab mälus olevat järjekorda.

AMQP lõpp-punkt

Kompileerimise ajal on AMQP lõpp-punkti hostinimi ja pordi number teadmata, seega tuleb need sisestada. Lõpp-punkti saab määrata AMQ Online'i loodud konfiguratsioonikaardil, seega määratleme need keskkonnamuutujate kaudu rakenduse manifestis:

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

Volikirjad

Teenusekonto tunnust saab kasutada meie rakenduse autentimiseks OpenShiftis. Selleks peate esmalt looma kohandatud ConfigSource'i, mis loeb autentimisluba podi failisüsteemist:

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

Rakenduse loomine ja juurutamine

Kuna rakendus tuleb kompileerida käivitatavaks failiks, on vaja GraalVM-i virtuaalmasinat. Täpsemat teavet selle kohta, kuidas selleks keskkonda seadistada, leiate vastavatest juhistest Kvarkuse juhend.

Seejärel, järgides seal antud juhiseid, peate alla laadima allika, looma ja juurutama meie rakenduse:

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, kui konfigureerime AMQ Online'is vajalikud sõnumiressursid.

Sõnumisüsteemi seadistamine

Nüüd jääb üle vaid seadistada sõnumisüsteemis ressursid, mida meie rakendus vajab. Selleks tuleb luua: 1) aadressiruum sõnumisüsteemi lõpp-punkti lähtestamiseks; 2) aadress rakenduses kasutatavate aadresside seadistamiseks; 3) Sõnumside kasutaja määrata kliendi mandaadid.

Aadressiruum

AMQ Online'i aadressiruumi objekt on aadresside rühm, mis jagavad ühenduse lõpp-punkte ning autentimis- ja autoriseerimispoliitikaid. Aadressiruumi loomisel saate määrata, kuidas sõnumside lõpp-punktid avalikustatakse.

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

aadress

Aadresse kasutatakse sõnumite saatmiseks ja vastuvõtmiseks. Igal aadressil on tüüp, mis määrab selle semantika, samuti plaan, mis määrab reserveeritavate ressursside arvu. Aadressi saab määrata 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 kasutaja

Tagamaks, et ainult usaldusväärsed rakendused saaksid teie aadressidele sõnumeid saata ja vastu võtta, peate looma sõnumisüsteemis kasutaja. Klastris töötavate rakenduste puhul saab kliente autentida OpenShifti teenusekonto abil. Kasutaja "teenusekonto" 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"]

Õigused rakenduse konfigureerimiseks

Selleks, et AMQ Online saaks luua konfiguratsioonikaardi, mida kasutasime AMQP lõpp-punkti teabe manustamiseks, tuleb määrata roll 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 konfiguratsioone rakendada

Saate rakendada sõnumisüsteemi konfiguratsiooni 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 kinnitamine

Rakenduse käivitumises veendumiseks 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 (avage see aadress brauseris):

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

Brauser peaks näitama, et pileteid uuendatakse perioodiliselt, kui AMQ Online sõnumeid saadab ja vastu võtab.

Kokkuvõtteks

Nii kirjutasime Quarkuse rakenduse, mis kasutab sõnumside jaoks AMQP-d, konfigureerisime rakenduse töötama Red Hat OpenShift platvormil ja rakendasime selle konfiguratsiooni AMQ Online'i konfiguratsiooni alusel. Seejärel lõime manifestid, mis on vajalikud meie rakenduse sõnumisüsteemi lähtestamiseks.

Sellega on Quarkuse teemaline sari lõppenud, kuid palju uut ja huvitavat on ees ootamas, olge lainel!

Allikas: www.habr.com

Lisa kommentaar