Të njoftojmë për mesazhe të orientuara në re në platformën Red Hat OpenShift duke përdorur Quarkus dhe AMQ Online

PĂ«rshĂ«ndetje tĂ« gjithĂ«ve! Ky Ă«shtĂ« postimi ynĂ« i fundit nga seria pĂ«r Quarkus! (PĂ«r mĂ« tepĂ«r, shikoni webinarin tonĂ« «Kjo Ă«shtĂ« Quarkus – njĂ« framework Java native pĂ«r Kubernetes». Do tĂ« tregojmĂ« se si tĂ« filloni «nga zero» ose tĂ« trasferoni zgjidhjet e gatshme)

Të njoftojmë për mesazhe të orientuara në re në platformën Red Hat OpenShift duke përdorur Quarkus dhe AMQ Online

Në në postimin e mëparshëm kemi shqyrtuar mjetet përkatëse, me ndihmën e të cilave mund të vlerësoni përmirësimet e arritura si rezultat i modernizimit të aplikacioneve Java.

Duke filluar nga versioni 0.17.0, Quarkus mbështet përdorimin e Advanced Message Queuing Protocol (AMQP), i cili është një standard i hapur për transferimin 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 në bazë të platformës Red Hat OpenShift. Më shumë rreth strukturës së tij mund të shihni këtu (EN). Sot do të tregojmë se si të lidheni AMQ Online me Quarkus për të ndërtuar një sistem modern të shkëmbimit të mesazheve mbi OpenShift duke përdorur dy teknologji të reja të lidhura me procesimin e mesazheve.

Supozon se tashmë e keni vendosur AMQ Online në platformën OpenShift (nëse jo, shihni udhëzimin për instalimin).

Fillimisht, ne do të krijojmë aplikacione Quarkus, e cila do të përfaqësojë një sistem të thjeshtë të përpunimit të porosive duke përdorur shkëmbimi reaktiv të mesazheve. Kjo aplikacion do të përfshijë një gjenerator porosish që dërgon porosi në një radhë të mesazheve në një interval të fiksuar, si dhe një përpunues porosish që do të përpunojë mesazhet nga radhë dhe do të krijojë konfirmime të disponueshme për t'u parë në shfletues.

Pasi të krijojmë aplikacionin, ne do të tregojmë se si të integrojmë konfigurimin e sistemit të shkëmbimit të mesazheve dhe do të përfitojmë nga AMQ Online për të inicuar resurset që na nevojiten në këtë sistem.

Aplikacioni Quarkus

Aplikacioni ynë Quarkus funksionon mbi OpenShift dhe përbën një version të modifikuar të programit amqp-quickstart. Shembulli i plotë i anës klienti mund të gjendet këtu.

Gjeneratori i porosive

Gjeneratori dërgon monotonisht identifikuesit e rritjes së porosive çdo 5 sekonda në adresën «orders».

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

Përpunuesi i porosive

Përpunuesi i porosive është edhe më i thjeshtë, thjesht kthen një identifikues konfirmimi në adresën «confirmations».

@ApplicationScoped
public class OrderProcessor {
    @Incoming("orders")
    @Outgoing("confirmations")
    public Integer process(Integer order) {
        // Identifikuesi 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;
    }
}

Configuration

Për t'u lidhur me AMQ Online, aplikacioni ynë do të ketë nevojë për disa të dhëna konfigurimi, konkretisht: konfigurimin e lidhësit Quarkus, informacionin mbi pikën fundore AMQP dhe kredencialet e klientit. Përshtatshëm, është më mirë të mbani të gjitha të dhënat e konfigurimit në një vend, por ne do t'i ndajmë 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 me anë të një skedari pronash të aplikacionit:

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ë rresht mesazhesh vetëm për adresën «orders». Ndërsa adresa «confirmations» në aplikacionin tonë do të përdorë një rresht në memorie.

Pika fundore AMQP

Në fazën e kompilimit emri i hostit dhe numri i portit për pikën fundore AMQP nuk janë të njohura, prandaj duhet të inkorporohen. Pika fundore mund të përcaktohet në configmap, e cila krijohet nga AMQ Online, prandaj ne do t'i përcaktojmë ato përmes variablave të mjedisit 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 identifikimit tĂ« llogarisĂ« sĂ« shĂ«rbimit mund tĂ« pĂ«rdoren pĂ«r autentikimin e aplikacionit tonĂ« nĂ« OpenShift. PĂ«r kĂ«tĂ«, sĂ« pari duhet tĂ« krijoni njĂ« ConfigSource tĂ« personalizuar qĂ« do tĂ« lexojĂ« çelĂ«sin e autentikimit nga sistemi i skedarĂ«ve tĂ« pod’it:

publik klasa MessagingCredentialsConfigSource zbatohet 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);
    }
}

Konstruksioni dhe shpërndarja e aplikacionit

Pasi që aplikacioni duhet kompilihet në një skedar ekzekutiv, do të nevojitet një makinë virtuale GraalVM. Më shumë informacione rreth mënyrës se si të konfiguroni mjedisin për këtë, shihni udhëzimet përkatëse në Udhëzuesi Quarkus.

Pastaj, duke ndjekur udhëzimet e përcaktuara atje, duhet të shkarkoni kodin burimor, të bëni ndërtimin dhe të realizoni 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ë aktivizohet derisa të konfigurojmë burimet e nevojshme për shkëmbimin e mesazheve në AMQ Online.

Konfigurimi i sistemit të shkëmbimit të mesazheve

Tani mbetet të përcaktojmë në sistemin e shkëmbimit të mesazheve burimet që i nevojiten aplikacionit tonë. Për këtë, duhet të krijojmë: 1) një hapësirë adresash, për të inicializuar pikën përfundimtare të sistemit të shkëmbimit të mesazheve; 2) një adresë, për të konfiguruar adresat që përdorim në aplikacion; 3) një përdorues të sistemit të shkëmbimit të mesazheve, për të vendosur akreditimet e klientit.

Hapësira e adresave

Objekti AddressSpace në AMQ Online është një grup adresash që ndajnë pikët e lidhjes, si dhe politikat e autentifikimit dhe autorizimit. Kur krijoni një hapësirë adresash, mund të përcaktoni se 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

Adresa

AdresatĂ«t pĂ«rdoren pĂ«r tĂ« dĂ«rguar dhe marr mesajet. Çdo adresĂ« ka njĂ« lloj, i cili pĂ«rcakton semantiken e saj, si dhe njĂ« plan, i cili pĂ«rcakton sasinĂ« e burimeve tĂ« rezervuara. NjĂ« adresĂ« mund tĂ« pĂ«rkufizohet, 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 besueshme mund të dërgojnë dhe marrin mesazhe në adresat tuaja, nevojitet të krijoni një përdorues në sistemin e shkëmbimit të mesazheve. Për aplikacionet që punojnë në klaster, klientët mund të autentifikohen përmes një llogarie shërbimi OpenShift. Përdoruesi "serviceaccount" mund të përkufizohet, 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"]

Lejet për konfigurimin e aplikacionit

Për të lejuar AMQ Online të krijojë configmap-in që ne përdorëm për të inkorporuar informacionin e pikës së përfundimit AMQP, nevojitet të caktosh një rol dhe një 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

Konfigurimin e sistemit të shkëmbimit të mesazheve mund ta aplikoni 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ë nisur, së pari do të kontrollojmë 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 rrugës së aplikacionit (thjesht hapim këtë adresë në shfletues):

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

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

Të shohim përfundimet

Pra ndaj, ne shkruam një aplikacion Quarkus që përdor AMQP për shkëmbimin e mesazheve, e konfiguruam këtë aplikacion për të punuar në platformën Red Hat OpenShift, dhe gjithashtu implementuam konfigurimin e tij bazuar në konfigurimin AMQ Online. Pas kësaj, ne krijuam manifestet e nevojshme për të inicializuar sistemin e shkëmbimit të mesazheve për aplikacionin tonë.

Me këtë përfundojmë serinë tonë mbi Quarkus, por ka shumë gjëra të reja dhe interesante përpara, qëndroni me ne!

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster