Shkëmbimi i mesazheve të orientuar ndaj cloud në platformën Red Hat OpenShift duke përdorur Quarkus dhe AMQ Online

Përshëndetje të gjithëve! Ja ku është – postimi ynë përfundimtar nga seria mbi Quarkus! (P.S. shikoni webinarin tonë «Ky është Quarkus – një framework Java native për Kubernetes». Do të tregojmë se si të filloni «nga zero» ose të transferoni zgjidhje të gatshme)

Shkëmbimi i mesazheve të orientuar ndaj cloud në platformën Red Hat OpenShift duke përdorur Quarkus dhe AMQ Online

të kaluarën në këtë postim ne shqyrtuam mjetet përkatëse që lejojnë vlerësimin e përmirësimeve që janë arritur si rezultat i modernizimit të aplikacioneve Java.

Duke filluar nga versioni 0.17.0, Quarkus mbështet përdorimin e Protokollit Të Avancuar Të Njoftimeve (AMQP), i cili është një standard i hapur për transmetimin e mesazheve të biznesit midis aplikacioneve ose organizatave.

Red Hat AMQ Online është një shërbim i ndërtuar mbi projektin e hapur EnMasse dhe realizon mekanizmin e shkëmbimit të mesazheve mbi platformën Red Hat OpenShift. Më shumë për mënyrën se si është ndërtuar, shihni këtu (EN). Sot do të tregojmë si të kombinoni AMQ Online dhe Quarkus për të ndërtuar një sistem modern të shkëmbimit të mesazheve mbi OpenShift duke përdorur dy teknologji të reja lidhur me përpunimin e mesazheve.

Supozohen se keni vepruar AMQ Online në platformën OpenShift (nëse jo, shihni udhëzimin për instalim).

Fillimisht, ne do të krijojmë një aplikacion Quarkus, i cili do të përfaqësojë një sistem të thjeshtë për përpunimin e porosisë duke përdorur shkëmbim reaktiv të mesazheve. Ky aplikacion do të përfshijë një gjenerator porosish që dërgon porosi në një radhë mesazhesh me një interval të caktuar, si dhe një përpunues porosish që do të trajtojë mesazhet nga radhë dhe do të formojë konfirmime të cilat mund të shfaqen në shfletues.

Pas krijimit të aplikacionit, ne do të tregojmë se si të integrojmë në të konfigurimin e sistemit të shkëmbimit të mesazheve dhe do të angazhojmë AMQ Online, për të inicuar burimet e nevojshme në këtë sistem.

Aplikacioni Quarkus

Aplikacioni ynë Quarkus ekzekutohet në OpenShift dhe është një version i modifikuar i programit amqp-quickstart. Një shembull i plotë i pjesës klient mund të gjendet këtu.

Gjeneratori i porosive

Gjeneratori çdo 5 sekonda thjesht dërgon monotonikisht identifikatorë në rritje të porosive në adresën "orders".

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

Përpunuesi i porosive

Menaxhimi i porosive është bërë edhe më i thjeshtë; ai kthehet vetëm identifikuesin e konfirmimit në adresën "confirmations".

@ApplicationScoped
public class OrderProcessor {
    @Incoming("orders")
    @Outgoing("confirmations")
    public Integer process(Integer order) {
        // Identifikimi i konfirmimit është dyfishimi i identifikuesit të porosisë <img draggable="false" class="emoji" alt=":-)" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f642.svg">
        return order * 2;
    }
}

Burimet e konfirmimit

Burimi i konfirmimit është një pikë fundore HTTP për listimin e konfirmimeve të formuara si rezultat i punës së aplikacionit tonë.

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

Konfigurimi

Për t'u lidhur me AMQ Online, aplikacioni ynë do të ketë nevojë për disa të dhëna konfigurimi, përkatësisht: konfigurimin e lidhësit Quarkus, informacione për pikën fundore AMQP dhe kredencialet e klientit. Më mirë është të mbani të gjitha të dhënat e konfigurimit në një vend, por ne do t'i ndajmë ato qëllimisht për të treguar mundësitë e konfigurimit të aplikacionit Quarkus.

Lidhësit

Konfigurimi i lidhësit mund të ofrohet në fazën e kompilimit përmes një skedari pronar aplikacioni:

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

Për të mos e komplikuar, do të përdorim një radhë mesazhesh vetëm për adresën "orders". Ndërsa adresa "confirmations" në aplikacionin tonë do të përdorë një radhë në memorie.

Pika e fundit AMQP

Në fazën e kompilimit, emri i hostit dhe numri i portës për Pikën e fundit AMQP nuk dihen, prandaj duhet të inkorporohen. Pika e fundit mund të caktohet në configmap, e cila krijohet nga AMQ Online, prandaj ne do t'i përcaktojmë ato përmes variablave të ambientit në manifestin e aplikacionit:

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

Kredencialet

Të dhënat e llogarisë së shërbimit mund të përdoren për autentifikimin e aplikacionit tonë në OpenShift. Për këtë, duhet së pari të krijohet një ConfigSource personal, i cili do të lexojë tokenin e autentifikimit nga sistemi i skedarëve të pod-it:

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

Ndërtimi dhe vendosja e aplikacionit

Duke qenë se aplikacioni duhet të kompozohet në një skedar ekzekutiv, do të nevojitet një makinë virtuale GraalVM. Më shumë detaje se si të konfigurohet ky mjedis, shihni udhëzimet përkatëse në Guide Quarkus.

Pastaj, duke ndjekur udhëzimet e dhëna atje, nevojitet të shkarkoni kodin burimor, të kryeni ndërtimin dhe të bëni shpërndarjen e aplikacionit tonë:

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

Pas këtyre komandave, aplikacioni do të shpërndahet, por nuk do të nisë derisa të konfigurojmë burimet e nevojshme për ndërlidhje në AMQ Online.

Konfigurimi i sistemit të ndërlidhjes

Tani mbetet të caktojmë në sistemin e ndërlidhjes burimet që i nevojiten aplikacionit tonë. Për këtë, duhet të krijojmë: 1) një hapësirë adresash, për të inicializuar pikën fundore të sistemit të ndërlidhjes; 2) një adresë, për të konfiguruar adresat që përdorim në aplikacion; 3) një përdorues të sistemit të ndërlidhjes, për të caktuar akrediatet e klientit.

Hapësira e adresave

Objekti AddressSpace në AMQ Online është një grup adresesh që ndajnë përbashkët pikëkoneksione, si dhe politika të autentikimit dhe autorizimit. Gjatë krijimit të një hapësire adresash, mund të specifikoni si do të ofrohen pikët e sistemit të shkëmbimit të mesazheve:

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

Adresat

Adresat përdoren për të dërguar dhe pranuar mesazhe. Çdo adresë ka një lloj që përcakton semantikën e saj, si dhe një plan që përcakton numrin e burimeve që rezervohen. Një adresë mund të përcaktohet, për shembull, kështu:

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

Përdoruesi i sistemit të shkëmbimit të mesazheve

Për të siguruar që vetëm aplikacionet e besuara mund të dërgojnë dhe pranojnë mesazhe në adresat tuaja, në sistemin e shkëmbimit të mesazheve duhet të krijoni një përdorues. Për aplikacionet që funksionojnë në kuadër, klientët mund të autentikohen duke përdorur një llogari shërbimi OpenShift. Përdoruesin 'serviceaccount' mund ta përcaktoni, për shembull, kështu:

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

Lejot për konfigurimin e aplikacionit

Për të mundësuar që AMQ Online të krijojë configmap që kemi përdorur për të dërguar informacione mbi pikën përfundimtare AMQP, duhet të vendosim një rol dhe lidhje roli (Role dhe 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

Si të aplikoni konfigurimet

Konfigurimi i sistemit të mesazheve mund të aplikohet kështu:

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

Verifikimi i aplikacionit

Për të siguruar që aplikacioni është ngritur, e para që do të kontrollojmë është nëse adresat përkatëse janë krijuar dhe aktive:

until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Nuk është ende gati"; sleep 5; done

Pastaj do të kontrollojmë URL-në e aplikacionit (thjesht do ta hapim këtë adresë në shfletues):

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

Në shfletues duhet të jetë e dukshme se biletat përditësohen periodikisht ndërsa mesazhet dërgohen dhe pranohen nga AMQ Online.

Përmbledhje

Kështu, krijuam një aplikacion Quarkus që përdor AMQP për shkëmbimin e mesazheve, e konfiguram këtë aplikacion për të punuar në platformën Red Hat OpenShift, dhe gjithashtu implementuam konfigurimin e tij bazuar në konfigurimin e AMQ Online. Më pas krijuam manifestet e nevojshme për të inicializuar sistemin e shkëmbimit të mesazheve për aplikacionin tonë.

Këtu e mbyllim serinë mbi Quarkus, por kemi shumë gjëra interesante përpara, qëndroni me ne!

Burimi: habr.com

Bli një hosting të besueshëm për faqet me mbrojtje DDoS, VPS VDS serverë 🔥 Bli një hosting të besueshëm për faqet me mbrojtje DDoS, VPS VDS serverë | ProHoster