Negeseuon cwmwl-frodorol ar blatfform Red Hat OpenShift gan ddefnyddio Quarkus ac AMQ Online

Helo pawb! Dyma fo - ein post olaf yn y gyfres Quarkus! (Gyda llaw, gwyliwch ein gweminar β€œDyma fframwaith Java brodorol Quarkus - Kubernetes”. Byddwn yn dangos i chi sut i ddechrau o'r dechrau neu drosglwyddo atebion parod)

Negeseuon cwmwl-frodorol ar blatfform Red Hat OpenShift gan ddefnyddio Quarkus ac AMQ Online

Π’ blaenorol Yn y swydd hon, fe wnaethom edrych ar yr offer perthnasol y gellir eu defnyddio i feintioli'r gwelliannau a gafwyd o ganlyniad i foderneiddio cymwysiadau Java.

Ers fersiwn 0.17.0, Cwarcws yn cefnogi'r defnydd o Brotocol Ciwio Neges Uwch (AMQP), sy'n safon agored ar gyfer trosglwyddo negeseuon busnes rhwng ceisiadau neu sefydliadau.

Red Hat AMQ Ar-lein yn wasanaeth a adeiladwyd ar sail prosiect ffynhonnell agored EnMasse a gweithredu mecanwaith negeseuon ar sail platfform Red Hat OpenShift. Am ragor o fanylion ar sut mae'n gweithio, gweler yma (EN). Heddiw, byddwn yn dangos i chi sut i gyfuno AMQ Online a Quarkus i adeiladu system negeseuon modern yn seiliedig ar OpenShift gan ddefnyddio dwy dechnoleg negeseuon newydd.

Tybir eich bod eisoes wedi defnyddio AMQ Online ar y platfform OpenShift (os na, yna gweler canllaw gosod).

I ddechrau, byddwn yn creu cymhwysiad Quarkus a fydd yn system prosesu archebion syml gan ddefnyddio negeseuon adweithiol. Bydd y cymhwysiad hwn yn cynnwys generadur archeb sy'n anfon archebion i giw neges ar gyfnod penodol, yn ogystal Γ’ phrosesydd archeb a fydd yn prosesu negeseuon o'r ciw ac yn cynhyrchu cadarnhad y gellir ei weld yn y porwr.

Unwaith y byddwn wedi creu'r cymhwysiad, byddwn yn dangos i chi sut i fewnosod cyfluniad y system negeseuon yn y rhaglen a defnyddio AMQ Online i ddarparu'r adnoddau sydd eu hangen arnom ar y system.

Ap Quarkus

Mae ein cymhwysiad Quarkus yn rhedeg ar OpenShift ac mae'n fersiwn wedi'i addasu o'r rhaglen amqp-cychwyn cyflym. Gellir dod o hyd i enghraifft gyflawn o ochr y cleient yma.

Archebwch generadur

Yn syml, mae'r generadur yn anfon IDau archeb gynyddol i'r cyfeiriad β€œarchebion” bob 5 eiliad.

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

Prosesydd Archeb

Mae'r triniwr archeb hyd yn oed yn symlach, mae'n dychwelyd ID cadarnhad i'r cyfeiriad "cadarnhau".

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

Adnoddau Cadarnhau

Mae'r adnodd cadarnhau yn bwynt terfyn HTTP ar gyfer rhestru'r cadarnhadau a gynhyrchir gan ein cais.

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

addasiad

Er mwyn cysylltu ag AMQ Ar-lein, bydd angen rhywfaint o ddata cyfluniad ar ein cais, sef: cyfluniad cysylltydd Quarkus, gwybodaeth pwynt terfyn AMQP a chymwysterau cleient. Wrth gwrs, mae'n well cadw'r holl ddata cyfluniad mewn un lle, ond byddwn yn eu gwahanu'n fwriadol i ddangos yr opsiynau posibl ar gyfer ffurfweddu'r cymhwysiad Quarkus.

Cysylltwyr

Gellir darparu ffurfweddiad cysylltydd ar amser llunio gan ddefnyddio ffeil priodweddau cymhwysiad:

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

I gadw pethau'n syml, dim ond ciw neges ar gyfer y cyfeiriad "archebion" y byddwn yn ei ddefnyddio. A bydd y cyfeiriad β€œcadarnhad” yn ein cais yn defnyddio ciw er cof.

diweddbwynt AMQP

Ar amser llunio, nid yw'r enw gwesteiwr a rhif y porthladd ar gyfer diweddbwynt AMQP yn hysbys, felly mae'n rhaid eu chwistrellu. Gellir gosod y diweddbwynt yn y configmap sy'n cael ei greu gan AMQ Online, felly byddwn yn eu diffinio trwy newidynnau amgylchedd ym maniffest y cymhwysiad:

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

Cymwysterau

Gellir defnyddio'r tocyn cyfrif gwasanaeth i ddilysu ein cais i OpenShift. I wneud hyn, yn gyntaf rhaid i chi greu ConfigSource arferol a fydd yn darllen y tocyn dilysu o system ffeiliau'r 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);
    }
}

Adeiladu a Defnyddio'r Cais

Gan fod yn rhaid i'r cais gael ei lunio'n ffeil gweithredadwy, mae angen peiriant rhithwir GraalVM. Am fanylion ar sut i sefydlu amgylchedd ar gyfer hyn, gweler y cyfarwyddiadau cyfatebol yn Arweinlyfr Quarkus.

Yna, gan ddilyn y cyfarwyddiadau a roddir yno, mae angen i chi lawrlwytho'r ffynhonnell, adeiladu a defnyddio ein cymhwysiad:

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

Ar Γ΄l y gorchmynion hyn, bydd y cymhwysiad yn cael ei ddefnyddio, ond ni fydd yn cychwyn nes i ni ffurfweddu'r adnoddau negeseuon sydd eu hangen arnom yn AMQ Online.

Sefydlu'r system negeseuon

Nawr y cyfan sydd ar Γ΄l yw gosod yr adnoddau sydd eu hangen ar ein cymhwysiad yn y system negeseuon. I wneud hyn, mae angen i chi greu: 1) gofod cyfeiriad i gychwyn pwynt terfyn y system negeseuon; 2) cyfeiriad i ffurfweddu'r cyfeiriadau a ddefnyddiwn yn y cais; 3) Negeseuon defnyddiwr i osod tystlythyrau cleient.

Gofod cyfeiriad

Mae gwrthrych AddressSpace yn AMQ Online yn grΕ΅p o gyfeiriadau sy'n rhannu diweddbwyntiau cysylltiad a pholisΓ―au dilysu ac awdurdodi. Pan fyddwch chi'n creu gofod cyfeiriad, gallwch chi nodi sut y bydd pwyntiau terfyn negeseuon yn cael eu hamlygu:

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

Cyfeiriadau

Defnyddir cyfeiriadau i anfon a derbyn negeseuon. Mae gan bob cyfeiriad fath, sy'n pennu ei semanteg, yn ogystal Γ’ chynllun, sy'n nodi nifer yr adnoddau i'w cadw. Gellir pennu'r cyfeiriad, er enghraifft, fel hyn:

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

Defnyddiwr negeseuon

Er mwyn sicrhau mai dim ond cymwysiadau dibynadwy all anfon a derbyn negeseuon i'ch cyfeiriadau, rhaid i chi greu defnyddiwr yn y system negeseuon. Ar gyfer cymwysiadau sy'n rhedeg ar glwstwr, gall cleientiaid gael eu dilysu gan ddefnyddio cyfrif gwasanaeth OpenShift. Gellir diffinio'r "cyfrif gwasanaeth" defnyddiwr, er enghraifft, fel hyn:

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

CaniatΓ’d i ffurfweddu'r rhaglen

Er mwyn i AMQ Online greu’r configmap a ddefnyddiwyd gennym i fewnosod gwybodaeth diweddbwynt AMQP, rhaid gosod y RΓ΄l a’r Rhwymo RΓ΄l:

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

Sut i gymhwyso ffurfweddiadau

Gallwch chi gymhwyso cyfluniad y system negeseuon fel hyn:

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

Gwirio cais

I wneud yn siΕ΅r bod y cais wedi cychwyn, yn gyntaf oll, gadewch i ni wirio a yw'r cyfeiriadau cyfatebol wedi'u creu ac yn weithredol:

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

Yna gadewch i ni wirio URL llwybr y cais (agorwch y cyfeiriad hwn yn y porwr):

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

Dylai'r porwr ddangos bod tocynnau'n cael eu diweddaru o bryd i'w gilydd wrth i negeseuon gael eu hanfon a'u derbyn gan AMQ Online.

Crynhoi

Felly fe wnaethon ni ysgrifennu cymhwysiad Quarkus sy'n defnyddio AMQP ar gyfer negeseuon, wedi ffurfweddu'r cymhwysiad i redeg ar lwyfan Red Hat OpenShift, ac wedi gweithredu ei ffurfweddiad yn seiliedig ar gyfluniad AMQ Online. Yna fe wnaethon ni greu'r maniffestau sydd eu hangen i gychwyn y system negeseuon ar gyfer ein cymhwysiad.

Mae hyn yn cloi'r gyfres am Quarkus, ond mae llawer o bethau newydd a diddorol o'ch blaen, cadwch draw!

Ffynhonnell: hab.com

Ychwanegu sylw