Messaġġi cloud-native fuq il-pjattaforma Red Hat OpenShift bl-użu ta' Quarkus u AMQ Online

Hi kollha! Hawn hu - l-aħħar post tagħna fis-serje Quarkus! (Mill-mod, ara l-webinar tagħna "Dan huwa Quarkus - qafas Java nattiv ta' Kubernetes". Aħna ser nuruk kif tibda mill-bidu jew tittrasferixxi soluzzjonijiet lesti)

Messaġġi cloud-native fuq il-pjattaforma Red Hat OpenShift bl-użu ta' Quarkus u AMQ Online

В preċedenti F'din il-kariga, ħares lejn l-għodod rilevanti li jistgħu jintużaw biex jikkwantifikaw it-titjib miksub bħala riżultat tal-immodernizzar tal-applikazzjonijiet Java.

Mill-verżjoni 0.17.0, quarkus jappoġġja l-użu ta' Advanced Message Queuing Protocol (AMQP), li huwa standard miftuħ għat-trasferiment ta' messaġġi kummerċjali bejn applikazzjonijiet jew organizzazzjonijiet.

Red Hat AMQ Online huwa servizz mibni fuq il-bażi ta’ proġett open source EnMasse u l-implimentazzjoni ta' mekkaniżmu ta' messaġġi bbażat fuq pjattaforma RedHat OpenShift. Għal aktar dettalji dwar kif taħdem, ara hawn (EN). Illum ser nuruk kif tgħaqqad AMQ Online u Quarkus biex tibni sistema moderna ta' messaġġi bbażata fuq OpenShift billi tuża żewġ teknoloġiji ġodda ta' messaġġi.

Huwa preżunt li diġà skjerajt AMQ Online fuq il-pjattaforma OpenShift (jekk le, allura ara gwida għall-installazzjoni).

Biex tibda, aħna ser noħolqu applikazzjoni Quarkus li se tkun sistema sempliċi ta 'pproċessar ta' ordnijiet bl-użu ta 'messaġġi reattivi. Din l-applikazzjoni se tinkludi ġeneratur tal-ordnijiet li jibgħat ordnijiet lil kju tal-messaġġi f'intervall fiss, kif ukoll proċessur tal-ordnijiet li jipproċessa messaġġi mill-kju u jiġġenera konfermi li jistgħu jidhru fil-browser.

Ladarba ħloqna l-applikazzjoni, aħna ser nuruk kif tiddaħħal il-konfigurazzjoni tas-sistema tal-messaġġi fl-applikazzjoni u nużaw AMQ Online biex nipprovdu r-riżorsi li neħtieġu fis-sistema.

App Quarkus

L-applikazzjoni Quarkus tagħna taħdem fuq OpenShift u hija verżjoni modifikata tal-programm amqp-quickstart. Eżempju komplut tan-naħa tal-klijent jista 'jinstab hawn.

Ordni ġeneratur

Il-ġeneratur sempliċement jibgħat b'mod monotoniku IDs tal-ordnijiet li qed jikbru lill-indirizz ta '"ordnijiet" kull 5 sekondi.

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

Proċessur tal-Ordni

Il-handler tal-ordnijiet huwa saħansitra aktar sempliċi, huwa biss jirritorna ID ta 'konferma lill-indirizz tal-"konfermi".

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

Riżorsi ta' Konferma

Ir-riżorsa ta' konferma hija punt ta' tmiem HTTP għall-elenkar tal-konfermi ġġenerati mill-applikazzjoni tagħna.

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

aġġustament

Biex tikkonnettja ma 'AMQ Online, l-applikazzjoni tagħna se teħtieġ xi dejta ta' konfigurazzjoni, jiġifieri: konfigurazzjoni tal-konnettur Quarkus, informazzjoni tal-endpoint AMQP u kredenzjali tal-klijent. Huwa, ovvjament, aħjar li nżommu d-dejta tal-konfigurazzjoni kollha f'post wieħed, iżda aħna se nisseparawhom apposta biex nuru l-għażliet possibbli għall-konfigurazzjoni tal-applikazzjoni Quarkus.

Konnetturi

Il-konfigurazzjoni tal-konnettur tista' tiġi pprovduta fil-ħin tal-kompilazzjoni bl-użu ta' fajl tal-proprjetajiet tal-applikazzjoni:

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

Biex inżommu l-affarijiet sempliċi, aħna ser nużaw biss kju tal-messaġġi għall-indirizz "ordnijiet". U l-indirizz tal-"konfermi" fl-applikazzjoni tagħna se juża kju fil-memorja.

Endpoint AMQP

Fiż-żmien tal-kompilazzjoni, l-isem tal-host u n-numru tal-port għall-endpoint AMQP mhumiex magħrufa, għalhekk għandhom jiġu injettati. L-endpoint jista 'jiġi stabbilit fil-konfigurazzjoni li hija maħluqa minn AMQ Online, għalhekk aħna ser niddefinixxuhom permezz ta' varjabbli ambjentali fil-manifest tal-applikazzjoni:

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

Kredenzjali

It-token tal-kont tas-servizz jista' jintuża biex jawtentika l-applikazzjoni tagħna għal OpenShift. Biex tagħmel dan, l-ewwel trid toħloq ConfigSource tad-dwana li jaqra t-token tal-awtentikazzjoni mis-sistema tal-fajls tal-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);
    }
}

Ibni u Użu l-Applikazzjoni

Peress li l-applikazzjoni trid tiġi kkompilata f'fajl eżekutibbli, hija meħtieġa magna virtwali GraalVM. Għal dettalji dwar kif twaqqaf ambjent għal dan, ara l-istruzzjonijiet korrispondenti f' Gwida tal-Quarkus.

Imbagħad, wara l-istruzzjonijiet mogħtija hemmhekk, trid tniżżel is-sors, tibni u tuża l-applikazzjoni tagħna:

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

Wara dawn il-kmandi, l-applikazzjoni tiġi skjerata, iżda mhux se tibda qabel ma nikkonfiguraw ir-riżorsi tal-messaġġi li għandna bżonn f'AMQ Online.

Twaqqif tas-sistema tal-messaġġi

Issa dak kollu li jibqa 'huwa li jiġu stabbiliti r-riżorsi li l-applikazzjoni tagħna teħtieġ fis-sistema tal-messaġġi. Biex tagħmel dan, għandek bżonn toħloq: 1) spazju għall-indirizzi biex inizjalizza l-endpoint tas-sistema tal-messaġġi; 2) indirizz biex tikkonfigura l-indirizzi li nużaw fl-applikazzjoni; 3) Utent tal-messaġġi biex jistabbilixxi l-kredenzjali tal-klijent.

Spazju tal-indirizz

Oġġett AddressSpace f'AMQ Online huwa grupp ta' indirizzi li jaqsmu punti ta' tmiem tal-konnessjoni u politiki ta' awtentikazzjoni u awtorizzazzjoni. Meta toħloq spazju għall-indirizzi, tista' tispeċifika kif se jkunu esposti l-endpoints tal-messaġġi:

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

Indirizz

L-indirizzi jintużaw biex jintbagħtu u jirċievu messaġġi. Kull indirizz għandu tip, li jiddetermina s-semantika tiegħu, kif ukoll pjan, li jispeċifika n-numru ta 'riżorsi li għandhom jiġu riżervati. L-indirizz jista 'jiġi determinat, pereżempju, bħal dan:

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

Utent tal-messaġġi

Biex tiżgura li applikazzjonijiet ta' fiduċja biss jistgħu jibagħtu u jirċievu messaġġi fl-indirizzi tiegħek, trid toħloq utent fis-sistema tal-messaġġi. Għal applikazzjonijiet li jaħdmu fuq cluster, il-klijenti jistgħu jiġu awtentikati bl-użu ta' kont tas-servizz OpenShift. L-utent "serviceaccount" jista 'jiġi definit, pereżempju, bħal dan:

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

Permessi biex jiġi kkonfigurat l-applikazzjoni

Sabiex AMQ Online toħloq il-konfigurazzjoni li użajna biex inkorporaw l-informazzjoni tal-endpoint AMQP, ir-Rwol u l-Irbit tar-Rwol iridu jiġu stabbiliti:

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

Kif tapplika konfigurazzjonijiet

Tista' tapplika l-konfigurazzjoni tas-sistema tal-messaġġi bħal din:

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

Verifika tal-applikazzjoni

Biex niżguraw li l-applikazzjoni bdiet, l-ewwelnett, ejja niċċekkjaw jekk l-indirizzi korrispondenti inħolqux u humiex attivi:

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

Imbagħad ejja niċċekkja l-URL tar-rotta tal-applikazzjoni (iftaħ dan l-indirizz fil-browser):

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

Il-browser għandu juri li l-biljetti jiġu aġġornati perjodikament hekk kif il-messaġġi jintbagħtu u jirċievu minn AMQ Online.

Bħala sinteżi

Allura ktibna applikazzjoni Quarkus li tuża AMQP għall-messaġġi, kkonfigurajna l-applikazzjoni biex taħdem fuq il-pjattaforma Red Hat OpenShift, u implimentajna l-konfigurazzjoni tagħha bbażata fuq il-konfigurazzjoni AMQ Online. Imbagħad ħloqna l-manifesti meħtieġa biex inizjalizzaw is-sistema tal-messaġġi għall-applikazzjoni tagħna.

Dan jikkonkludi s-serje dwar Quarkus, iżda hemm ħafna affarijiet ġodda u interessanti quddiem, ibqa' sintonizzat!

Sors: www.habr.com

Żid kumment