Nub-indiĝena mesaĝado sur la platformo Red Hat OpenShift uzante Quarkus kaj AMQ Online

Saluton al ĉiuj! Jen ĝi estas - nia fina afiŝo en la Quarkus-serio! (Cetere, spektu nian retseminarion "Ĉi tio estas Quarkus - Kubernetes denaska Java kadro". Ni montros al vi kiel komenci de nulo aŭ translokigi pretajn solvojn)

Nub-indiĝena mesaĝado sur la platformo Red Hat OpenShift uzante Quarkus kaj AMQ Online

В antaŭa En ĉi tiu afiŝo, ni rigardis la koncernajn ilojn, kiuj povas esti uzataj por kvantigi la plibonigojn akiritajn rezulte de modernigado de Java-aplikoj.

Ekde versio 0.17.0, quarkus subtenas la uzon de Altnivela Message Queuing Protocol (AMQP), kiu estas malferma normo por transdoni komercajn mesaĝojn inter aplikaĵoj aŭ organizoj.

Red Hat AMQ Enreta estas servo konstruita surbaze de malfermkoda projekto EnMasse kaj efektivigado de platform-bazita mesaĝmekanismo OpenShift de Ruĝa Ĉapelo. Por pliaj detaloj pri kiel ĝi funkcias, vidu ĉi tie (EN). Hodiaŭ ni montros al vi kiel kombini AMQ Online kaj Quarkus por konstrui modernan mesaĝsistemon bazitan sur OpenShift uzante du novajn mesaĝajn teknologiojn.

Oni supozas, ke vi jam deplojis AMQ Online sur la platformo OpenShift (se ne, tiam vidu gvidilo pri instalado).

Por komenci, ni kreos Quarkus-aplikaĵon, kiu estos simpla mendpretiga sistemo per reaktiva mesaĝado. Ĉi tiu aplikaĵo inkluzivos mendgeneratoron, kiu sendas mendojn al mesaĝvico je fiksa intervalo, same kiel mendprocesoron, kiu prilaboros mesaĝojn de la atendovico kaj generos konfirmojn videblajn en la retumilo.

Post kiam ni kreis la aplikaĵon, ni montros al vi kiel enigi la mesaĝsisteman agordon en la aplikaĵon kaj uzi AMQ Online por provizi la rimedojn, kiujn ni bezonas en la sistemo.

Quarkus-apo

Nia Quarkus-aplikaĵo funkcias per OpenShift kaj estas modifita versio de la programo amqp-rapida starto. Kompleta ekzemplo de la klienta flanko troveblas tie.

Ordogeneratoro

La generatoro simple monotone sendas kreskantajn ordidentigilojn al la "mendoj" adreso ĉiujn 5 sekundojn.

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

Ordoprocesoro

La mendtraktilo estas eĉ pli simpla, ĝi nur resendas konfirman identigilon al la adreso de "konfirmoj".

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

Konfirmaj Rimedoj

La konfirma rimedo estas HTTP-finpunkto por listigi la konfirmojn generitajn de nia aplikaĵo.

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

alĝustigo

Por konektiĝi al AMQ Online, nia aplikaĵo bezonos kelkajn agordajn datumojn, nome: Quarkus-konektilo-agordo, AMQP-finpunkto-informoj kaj klientaj akreditaĵoj. Estas, kompreneble, pli bone konservi ĉiujn agordajn datumojn en unu loko, sed ni intence apartigos ilin por montri la eblajn opciojn por agordi la Quarkus-aplikaĵon.

Konektiloj

Konektilo-agordo povas esti disponigita ĉe kompiltempo uzante aplikaĵan proprietdosieron:

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

Por simpligi aferojn, ni uzos nur mesaĝvicon por la adreso de "mendoj". Kaj la adreso de "konfirmoj" en nia aplikaĵo uzos atendovicon en memoro.

AMQP finpunkto

Dum kompilo, la gastiga nomo kaj havennumero por la AMQP finpunkto estas nekonataj, do ili devas esti injektitaj. La finpunkto povas esti agordita en la konfigmapo kreita de AMQ Online, do ni difinos ilin per mediaj variabloj en la aplikaĵa manifesto:

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

Atestiloj

La serva konto-ĵetono povas esti uzata por aŭtentikigi nian aplikaĵon al OpenShift. Por fari tion, vi unue devas krei kutiman ConfigSource, kiu legos la aŭtentikigĵetonon de la dosiersistemo de la 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);
    }
}

Konstruu kaj Deploji la Aplikon

Ĉar la aplikaĵo devas esti kompilita en ruleblan dosieron, necesas virtuala maŝino GraalVM. Por detaloj pri kiel agordi medion por tio, vidu la respondajn instrukciojn en Quarkus Gvidilo.

Poste, sekvante la instrukciojn donitajn tie, vi devas elŝuti la fonton, konstrui kaj deploji nian aplikaĵon:

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

Post ĉi tiuj komandoj, la aplikaĵo estos deplojita, sed ne komenciĝos ĝis ni agordas la mesaĝajn rimedojn, kiujn ni bezonas en AMQ Online.

Agordi la mesaĝsistemon

Nun restas nur agordi la rimedojn, kiujn nia aplikaĵo bezonas en la mesaĝsistemo. Por fari tion, vi devas krei: 1) adrespacon por pravalorigi la mesaĝsisteman finpunkton; 2) adreso por agordi la adresojn, kiujn ni uzas en la aplikaĵo; 3) Mesaĝa uzanto por agordi klientajn akreditaĵojn.

Adresspaco

AddressSpace-objekto en AMQ Online estas grupo de adresoj, kiuj kunhavas konektajn finpunktojn kaj aŭtentikajn kaj rajtigajn politikojn. Kiam vi kreas adrespacon, vi povas specifi kiel mesaĝaj finpunktoj estos elmontritaj:

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

Direktoj

Adresoj estas uzataj por sendi kaj ricevi mesaĝojn. Ĉiu adreso havas tipon, kiu determinas ĝian semantikon, same kiel planon, kiu precizigas la nombron da rimedoj por esti rezervitaj. La adreso povas esti determinita, ekzemple, jene:

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

Mesaĝa uzanto

Por certigi, ke nur fidindaj aplikaĵoj povas sendi kaj ricevi mesaĝojn al viaj adresoj, vi devas krei uzanton en la mesaĝa sistemo. Por aplikaĵoj kurantaj en areto, klientoj povas esti aŭtentikigitaj per OpenShift-serva konto. La uzanto "servokonto" povas esti difinita, ekzemple, jene:

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

Permesoj por agordi la aplikaĵon

Por ke AMQ Online kreu la konfiguracion, kiun ni uzis por enigi la AMQP-finpunkton-informojn, la Rolo kaj RoleBinding devas esti agordita:

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

Kiel apliki agordojn

Vi povas apliki la mesaĝsisteman agordon jene:

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

Konfirmo de aplikaĵo

Por certigi, ke la aplikaĵo komenciĝis, unue ni kontrolu ĉu la respondaj adresoj estas kreitaj kaj aktivaj:

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

Tiam ni kontrolu la aplikaĵitineran URL (nur malfermu ĉi tiun adreson en la retumilo):

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

La retumilo devus montri, ke biletoj estas periode ĝisdatigitaj dum mesaĝoj estas senditaj kaj ricevitaj de AMQ Online.

Supre

Do ni skribis Quarkus-aplikaĵon kiu uzas AMQP por mesaĝado, agordis la aplikaĵon por funkcii sur la Red Hat OpenShift-platformo, kaj efektivigis ĝian agordon bazitan sur la AMQ Online-agordo. Ni tiam kreis la manifestojn necesajn por pravalorigi la mesaĝsistemon por nia aplikaĵo.

Ĉi tio finas la serion pri Quarkus, sed estas multaj novaj kaj interesaj aferoj antaŭen, restu agordita!

fonto: www.habr.com

Aldoni komenton