Mesazhet vendase në renë kompjuterike në platformën Red Hat OpenShift duke përdorur Quarkus dhe AMQ Online

Pershendetje te gjitheve! Këtu është - postimi ynë i fundit në serinë Quarkus! (Meqë ra fjala, shikoni webinarin tonë "Ky është korniza Java vendase Quarkus - Kubernetes". Ne do t'ju tregojmë se si të filloni nga e para ose të transferoni zgjidhje të gatshme)

Mesazhet vendase në renë kompjuterike në platformën Red Hat OpenShift duke përdorur Quarkus dhe AMQ Online

В e mëparshme Në këtë postim, ne shikuam mjetet përkatëse që mund të përdoren për të përcaktuar sasinë e përmirësimeve të marra si rezultat i modernizimit të aplikacioneve Java.

Që nga versioni 0.17.0, Kuarkus mbështet përdorimin e Protokollit të Avancuar të Radhës së Mesazheve (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 bazën e një projekti me kod të hapur EnMasse dhe zbatimin e një mekanizmi mesazhesh të bazuar në platformë Red Hat OpenShift. Për më shumë informacion se si funksionon, shihni këtu (EN). Sot do t'ju tregojmë se si të kombinoni AMQ Online dhe Quarkus për të ndërtuar një sistem modern të mesazheve të bazuara në OpenShift duke përdorur dy teknologji të reja mesazhesh.

Supozohet se ju keni vendosur tashmë AMQ Online në platformën OpenShift (nëse jo, atëherë shihni udhëzues instalimi).

Për të filluar, ne do të krijojmë një aplikacion Quarkus që do të jetë një sistem i thjeshtë përpunimi i porosive duke përdorur mesazhe reaktive. Ky aplikacion do të përfshijë një gjenerues porosish që dërgon porosi në një radhë mesazhesh në një interval fiks, si dhe një përpunues porosie që do të përpunojë mesazhet nga radha dhe do të gjenerojë konfirmime të dukshme në shfletues.

Pasi të kemi krijuar aplikacionin, do t'ju tregojmë se si të futni konfigurimin e sistemit të mesazheve në aplikacion dhe të përdorni AMQ Online për të siguruar burimet që na nevojiten në sistem.

Aplikacioni Quarkus

Aplikacioni ynë Quarkus funksionon në OpenShift dhe është një version i modifikuar i programit amqp-fillimi i shpejtë. Mund të gjendet një shembull i plotë i anës së klientit këtu.

Gjeneratori i porosive

Gjeneratori thjesht dërgon në mënyrë monotonike ID-të e porosive në rritje në adresën "porosi" çdo 5 sekonda.

@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

Trajtuesi i porosisë është edhe më i thjeshtë, ai thjesht kthen një ID konfirmimi në adresën e "konfirmimeve".

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

Burimet e Konfirmimit

Burimi i konfirmimit është një pikë përfundimtare HTTP për renditjen e konfirmimeve të krijuara nga aplikacioni ynë.

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

rregullim

Për t'u lidhur me AMQ Online, aplikacionit tonë do t'i duhen disa të dhëna konfigurimi, përkatësisht: konfigurimi i lidhësit Quarkus, informacioni i pikës fundore AMQP dhe kredencialet e klientit. Sigurisht, është më mirë që të gjitha të dhënat e konfigurimit të ruhen në një vend, por ne do t'i ndajmë qëllimisht për të treguar opsionet e mundshme për konfigurimin e aplikacionit Quarkus.

Lidhës

Konfigurimi i lidhësit mund të sigurohet në kohën e përpilimit duke përdorur një skedar të vetive të aplikacionit:

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

Për t'i mbajtur gjërat të thjeshta, ne do të përdorim vetëm një radhë mesazhesh për adresën "porositë". Dhe adresa e "konfirmimeve" në aplikacionin tonë do të përdorë një radhë në memorie.

Pika përfundimtare AMQP

Në kohën e përpilimit, emri i hostit dhe numri i portit për pikën përfundimtare AMQP janë të panjohura, kështu që ato duhet të injektohen. Pika përfundimtare mund të vendoset në hartën e konfigurimit që është krijuar nga AMQ Online, kështu që 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

Shenja e llogarisë së shërbimit mund të përdoret për të vërtetuar aplikacionin tonë në OpenShift. Për ta bërë këtë, së pari duhet të krijoni një burim të personalizuar Configurce që do të lexojë shenjën e vërtetimit nga sistemi i skedarëve të 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);
    }
}

Ndërtoni dhe vendosni aplikacionin

Meqenëse aplikacioni duhet të kompilohet në një skedar të ekzekutueshëm, kërkohet një makinë virtuale GraalVM. Për detaje se si të konfiguroni një mjedis për këtë, shihni udhëzimet përkatëse në Udhëzues Quarkus.

Më pas, duke ndjekur udhëzimet e dhëna atje, duhet të shkarkoni burimin, të ndërtoni dhe vendosni aplikacionin 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ë vendoset, por nuk do të fillojë derisa të konfigurojmë burimet e mesazheve që na duhen në AMQ Online.

Vendosja e sistemit të mesazheve

Tani mbetet vetëm të vendosim burimet që i duhen aplikacionit tonë në sistemin e mesazheve. Për ta bërë këtë, ju duhet të krijoni: 1) një hapësirë ​​adresash për të inicializuar pikën përfundimtare të sistemit të mesazheve; 2) adresa për të konfiguruar adresat që përdorim në aplikacion; 3) Dërgimi i mesazheve nga përdoruesi për të vendosur kredencialet e klientit.

Hapësira e adresës

Një objekt AddressSpace në AMQ Online është një grup adresash që ndajnë pikat fundore të lidhjes dhe politikat e vërtetimit dhe autorizimit. Kur krijoni një hapësirë ​​adresash, mund të specifikoni se si do të ekspozohen pikat fundore 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 përdoren për të dërguar dhe marrë mesazhe. Çdo adresë ka një lloj, i cili përcakton semantikën e saj, si dhe një plan, i cili specifikon numrin e burimeve që do të rezervohen. Adresa mund të përcaktohet, për shembull, si kjo:

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

Përdorues i mesazheve

Për të siguruar që vetëm aplikacionet e besuara mund të dërgojnë dhe marrin mesazhe në adresat tuaja, duhet të krijoni një përdorues në sistemin e mesazheve. Për aplikacionet që funksionojnë në një grup, klientët mund të vërtetohen duke përdorur një llogari shërbimi OpenShift. "Llogaria e shërbimit" e përdoruesit mund të përcaktohet, për shembull, si kjo:

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 cilësimet e aplikacionit

Në mënyrë që AMQ Online të krijojë hartën e konfigurimit që kemi përdorur për të futur informacionin e pikës fundore AMQP, duhet të vendosim Rolin 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

Ju mund të aplikoni konfigurimin e sistemit të mesazheve si kjo:

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'u siguruar që aplikacioni ka filluar, para së gjithash, le të kontrollojmë nëse adresat përkatëse janë krijuar dhe janë aktive:

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

Pastaj le të kontrollojmë URL-në e rrugës së aplikacionit (thjesht hapni këtë adresë në shfletues):

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

Shfletuesi duhet të tregojë se biletat përditësohen periodikisht ndërsa mesazhet dërgohen dhe merren nga AMQ Online.

Përmbledhja

Pra, ne shkruam një aplikacion Quarkus që përdor AMQP për mesazhe, konfiguruam aplikacionin që të funksionojë në platformën Red Hat OpenShift dhe implementuam konfigurimin e tij bazuar në konfigurimin AMQ Online. Më pas krijuam manifestet e nevojshme për të inicializuar sistemin e mesazheve për aplikacionin tonë.

Kjo përfundon serialin për Quarkus, por ka shumë gjëra të reja dhe interesante përpara, qëndroni të sintonizuar!

Burimi: www.habr.com

Shto një koment