Umlayezo womdabu wasefu kuplathifomu ye-Red Hat OpenShift kusetshenziswa i-Quarkus ne-AMQ Online

Sanibonani nonke! Nakhu - okuthunyelwe kwethu kokugcina ochungechungeni lwe-Quarkus! (Ngendlela, bukela i-webinar yethu "Lena iQuarkus - uhlaka lweJava yaseKubernetes". Sizokukhombisa ukuthi ungaqala kanjani ukusuka ekuqaleni noma udlulisele izixazululo esezilungile)

Umlayezo womdabu wasefu kuplathifomu ye-Red Hat OpenShift kusetshenziswa i-Quarkus ne-AMQ Online

Π’ edlule Kulokhu okuthunyelwe, sibheke amathuluzi afanelekile angasetshenziswa ukulinganisa ukuthuthukiswa okutholwe njengomphumela wokwenza izinhlelo ze-Java zibe zesimanjemanje.

Kusukela inguqulo 0.17.0, Ama-Quarkus isekela ukusetshenziswa kwe-Advanced Message Queuing Protocol (I-AMQP), okuyindinganiso evulekile yokudlulisa imilayezo yebhizinisi phakathi kwezicelo noma izinhlangano.

Isigqoko Esibomvu AMQ Online iyisevisi eyakhelwe phezu kwesisekelo sephrojekthi yomthombo ovulekile EnMasse kanye nokusebenzisa indlela yokuthumela imiyalezo esekwe endaweni I-Red Hat OpenShift. Ukuze uthole imininingwane eyengeziwe yokuthi isebenza kanjani, bheka lapha (EN). Namuhla sizokukhombisa ukuthi ungahlanganisa kanjani i-AMQ Online kanye ne-Quarkus ukuze kwakhiwe isistimu yesimanje ye-OpenShift yemiyalezo esebenzisa ubuchwepheshe obusha obusha bemiyalezo.

Kucatshangwa ukuthi usuvele uthumele i-AMQ Online endaweni yesikhulumi se-OpenShift (uma kungenjalo, bheka umhlahlandlela wokufaka).

Ukuze siqale, sizodala uhlelo lwe-Quarkus oluzoba uhlelo olulula lokucubungula i-oda sisebenzisa imilayezo esabelayo. Lolu hlelo lokusebenza luzobandakanya ijeneretha ye-oda ethumela ama-oda emugqeni womlayezo ngesikhathi esinqunyiwe, kanye nephrosesa ye-oda ezocubungula imilayezo esuka kulayini futhi ikhiqize iziqinisekiso ezibukeka esipheqululini.

Uma sesidale uhlelo lokusebenza, sizokukhombisa ukuthi ungashumeka kanjani ukumiswa kwesistimu yemiyalezo kuhlelo lokusebenza futhi sisebenzise i-AMQ Online ukuze sinikeze izinsiza esizidingayo ohlelweni.

Uhlelo lokusebenza lwe-Quarcus

Uhlelo lwethu lwe-Quarkus lusebenza ku-OpenShift futhi luyinguqulo yohlelo elungisiwe amqp-quickstart. Isibonelo esiphelele sohlangothi lweklayenti singatholakala lapha.

Oda ijeneretha

Ijeneretha ivele ithumele ama-ID e-oda akhulayo ekhelini "lama-oda" njalo ngemizuzwana emi-5.

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

Oda Iphrosesa

Isibambi se-oda silula nakakhulu, sivele sibuyisele i-ID yokuqinisekisa ekhelini "lokuqinisekisa".

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

Izinsiza Zokuqinisekisa

Isisetshenziswa sokuqinisekisa siyisiphetho se-HTTP sokufaka kuhlu iziqinisekiso ezikhiqizwe uhlelo lwethu lokusebenza.

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

Yenza ngokwezifiso

Ukuze uxhume ku-AMQ Online, uhlelo lwethu lokusebenza luzodinga idatha yokucushwa, okungukuthi: Ukucushwa kwesixhumi se-Quarkus, ulwazi lwephoyinti lokugcina le-AMQP kanye nemininingwane yeklayenti. Yiqiniso, kungcono ukugcina yonke idatha yokumisa endaweni eyodwa, kodwa sizoyihlukanisa ngamabomu ukuze sibonise izinketho ezingenzeka zokumisa uhlelo lwe-Quarkus.

Izixhumi

Ukucushwa kwesixhumi kunganikezwa ngesikhathi sokuhlanganiswa kusetshenziswa ifayela lezakhiwo zohlelo lokusebenza:

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

Ukuze sigcine izinto zilula, sizosebenzisa umugqa wemilayezo kuphela ekhelini "lama-oda". Futhi ikheli "lokuqinisekisa" kuhlelo lwethu lokusebenza lizosebenzisa umugqa enkumbulweni.

Iphoyinti lokugcina le-AMQP

Ngesikhathi sokuhlanganiswa, igama lomethuleli nenombolo yembobo ye-AMQP ekugcineni akwaziwa, ngakho-ke kufanele ajovwe. Isiphetho singasethwa kumephu yokumisa edalwe i-AMQ Online, ngakho-ke sizoyichaza ngokuhlukahluka kwemvelo ku-manifest yohlelo lokusebenza:

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

Imininingwane

Ithokheni ye-akhawunti yesevisi ingasetshenziswa ukuze kugunyazwe uhlelo lwethu lokusebenza ku-OpenShift. Ukwenza lokhu, kufanele uqale udale i-ConfigSource yangokwezifiso ezofunda ithokheni yokuqinisekisa ohlelweni lwefayela le-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);
    }
}

Yakha futhi Sebenzisa Isicelo

Njengoba uhlelo lokusebenza kufanele luhlanganiswe lube ifayela elisebenzisekayo, umshini obonakalayo we-GraalVM uyadingeka. Ukuze uthole imininingwane yokuthi ungasetha kanjani indawo yalokhu, bheka imiyalelo ehambisanayo ku Quarkus Guide.

Ngemuva kwalokho, ngokulandela imiyalo enikezwe lapho, udinga ukulanda umthombo, wakhe futhi usebenzise uhlelo lwethu lokusebenza:

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

Ngemva kwale miyalo, uhlelo lokusebenza luzosetshenziswa, kodwa ngeke luqale size silungise izinsiza zemiyalezo esizidingayo ku-AMQ Online.

Ukusetha isistimu yemiyalezo

Manje osekusele wukusetha izinsiza ezidingwa uhlelo lwethu lokusebenza kusistimu yemiyalezo. Ukuze wenze lokhu, udinga ukudala: 1) indawo yekheli ukuze uqalise indawo yokugcina yesistimu yemiyalezo; 2) ikheli lokumisa amakheli esiwasebenzisa kuhlelo lokusebenza; 3) Umsebenzisi wokuthumela imiyalezo ukusetha izifakazelo zeklayenti.

Indawo yekheli

Into ye-AddressSpace ku-AMQ Online iyiqembu lamakheli abelana ngeziphetho zokuxhuma kanye nezinqubomgomo zokuqinisekisa nokugunyazwa. Uma udala isikhala sekheli, ungacacisa ukuthi iziphetho zemilayezo zizovezwa kanjani:

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

Amakheli

Amakheli asetshenziselwa ukuthumela nokwamukela imilayezo. Ikheli ngalinye linohlobo, olunquma i-semantics yalo, kanye nohlelo, olucacisa inani lezinsiza okufanele zigcinwe. Ikheli linganqunywa, isibonelo, kanje:

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

Umsebenzisi womlayezo

Ukuqinisekisa ukuthi izinhlelo zokusebenza ezithenjwayo kuphela ezingathumela futhi zamukele imilayezo kumakheli akho, kufanele udale umsebenzisi ohlelweni lokuthumela imiyalezo. Kuzinhlelo zokusebenza ezisebenza kuqoqo, amaklayenti angagunyazwa kusetshenziswa i-akhawunti yesevisi ye-OpenShift. Umsebenzisi "i-akhawunti yesevisi" ingachazwa, isibonelo, kanje:

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

Izimvume zokumisa uhlelo lokusebenza

Ukuze i-AMQ Online idale i-configmap esiyisebenzisele ukushumeka imininingwane yephoyinti lokugcina le-AMQP, Indima kanye ne-RoleBinding kufanele isethwe:

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

Isetshenziswa kanjani ukucupha

Ungasebenzisa ukucushwa kwesistimu yemiyalezo kanje:

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

Ukuqinisekiswa kohlelo lokusebenza

Ukuqinisekisa ukuthi uhlelo lokusebenza luqalile, okokuqala, ake sihlole ukuthi amakheli ahambisanayo adaliwe yini futhi ayasebenza:

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

Bese sihlola i-URL yomzila wohlelo lokusebenza (vele uvule leli kheli esipheqululini):

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

Isiphequluli kufanele sibonise ukuthi amathikithi abuyekezwa ngezikhathi ezithile njengoba imilayezo ithunyelwa futhi yamukelwe yi-AMQ Online.

Ukufingqa

Ngakho-ke sibhale uhlelo lwe-Quarkus olusebenzisa i-AMQP yokuthumela imiyalezo, salungisa uhlelo lokusebenza ukuthi lusebenze kuplathifomu ye-Red Hat OpenShift, futhi sasebenzisa ukucushwa kwayo okusekelwe ekucushweni kwe-AMQ Online. Sibe sesidala ama-manifest adingekayo ukuze siqalise isistimu yemiyalezo yohlelo lwethu lokusebenza.

Lokhu kuphetha uchungechunge olumayelana neQuarkus, kodwa kunezinto eziningi ezintsha nezithokozisayo ezizayo, hlala ubukele!

Source: www.habr.com

Engeza amazwana