Mauthenga amtundu wamtambo pa nsanja ya Red Hat OpenShift pogwiritsa ntchito Quarkus ndi AMQ Online

Moni nonse! Izi ndi izi - positi yathu yomaliza pamndandanda wa Quarkus! (Mwa njira, onani webinar yathu "Ichi ndi Quarkus - Kubernetes chikhalidwe cha Java". Tikuwonetsani momwe mungayambitsire kuchokera pachiyambi kapena kusamutsa mayankho okonzeka)

Mauthenga amtundu wamtambo pa nsanja ya Red Hat OpenShift pogwiritsa ntchito Quarkus ndi AMQ Online

Π’ zam'mbuyo Mu positi iyi, tidayang'ana zida zoyenera zomwe zingagwiritsidwe ntchito kuwerengera zosintha zomwe zapezeka chifukwa chosinthira mapulogalamu a Java amakono.

Kuyambira mtundu 0.17.0, quarkus imathandizira kugwiritsa ntchito Advanced Message Queuing Protocol (Zamgululi), womwe ndi mulingo wotseguka wotumizira mauthenga abizinesi pakati pa mapulogalamu kapena mabungwe.

Red Hat AMQ Pa intaneti ndi ntchito yomangidwa pamaziko a ntchito yotseguka EnMasse ndikukhazikitsa njira yotumizira mauthenga papulatifomu Chipewa Chofiira OpenShift. Kuti mudziwe zambiri za momwe zimagwirira ntchito, onani apa (EN). Lero tikuwonetsani momwe mungaphatikizire AMQ Online ndi Quarkus kuti mupange makina amakono a OpenShift otengera mauthenga pogwiritsa ntchito matekinoloje awiri atsopano a mauthenga.

Zimaganiziridwa kuti mwatumiza kale AMQ Online pa nsanja ya OpenShift (ngati sichoncho, onani unsembe kalozera).

Kuti tiyambe, tipanga pulogalamu ya Quarkus yomwe ingakhale njira yosavuta yopangira madongosolo pogwiritsa ntchito mameseji okhazikika. Pulogalamuyi iphatikizanso jenereta yamaoda yomwe imatumiza maoda pamzere wauthenga pakanthawi kokhazikika, komanso pulogalamu yoyitanitsa yomwe ikonza mauthenga kuchokera pamzere ndikupanga zitsimikiziro zomwe zimawoneka mumsakatuli.

Tikangopanga pulogalamuyo, tikuwonetsani momwe mungayikitsire dongosolo la mauthenga mu pulogalamuyo ndikugwiritsa ntchito AMQ Online kupereka zofunikira pakompyuta.

Pulogalamu ya Quark

Ntchito yathu ya Quarkus imayenda pa OpenShift ndipo ndi mtundu wosinthidwa wa pulogalamuyi amqp-quickstart. Chitsanzo chathunthu cha mbali ya kasitomala chingapezeke apa.

Kodi jenereta

Jeneretayo imangotumiza ma ID omwe akukulirakulira ku adilesi ya "maoda" masekondi 5 aliwonse.

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

Order processor

Wothandizira madongosolo ndiwosavuta, amangobweza ID yotsimikizira ku adilesi ya "zitsimikizo".

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

Zida Zotsimikizira

Chitsimikizochi ndi HTTP yomaliza kuti mulembe zotsimikizira zopangidwa ndi pulogalamu yathu.

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

kusintha

Kuti mulumikizane ndi AMQ Online, pulogalamu yathu idzafunika zosintha, zomwe ndi: Kusintha kwa cholumikizira cha Quarkus, chidziwitso chakumapeto kwa AMQP ndi zidziwitso za kasitomala. Ndiko kuti, ndikwabwino kusunga zosintha zonse pamalo amodzi, koma tidzawalekanitsa mwadala kuti tiwonetse zomwe zingatheke pakukonza pulogalamu ya Quarkus.

Zolumikizira

Kusintha kwa cholumikizira kutha kuperekedwa panthawi yophatikizira pogwiritsa ntchito fayilo yamapulogalamu:

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

Kuti zinthu zikhale zosavuta, tidzangogwiritsa ntchito pamzere wa mauthenga pa adilesi ya "maoda". Ndipo adilesi ya "zitsimikizo" mukugwiritsa ntchito kwathu idzagwiritsa ntchito mzere wokumbukira.

Mtengo wapatali wa magawo AMQP

Panthawi yophatikizira, dzina la alendo ndi nambala ya doko la AMQP endpoint sizikudziwika, kotero ziyenera kubayidwa. Mapeto atha kukhazikitsidwa mu configmap yomwe imapangidwa ndi AMQ Online, kotero tidzawafotokozera kudzera mumitundu yosiyanasiyana yachiwonetsero:

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

Zidziwitso

Chizindikiro chaakaunti yautumiki chingagwiritsidwe ntchito kutsimikizira kugwiritsa ntchito kwathu ku OpenShift. Kuti muchite izi, muyenera kupanga kaye ConfigSource yomwe idzawerenge chizindikiro chotsimikizika kuchokera pamafayilo a 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);
    }
}

Pangani ndi Kutumiza Ntchito

Popeza ntchitoyo iyenera kupangidwa kukhala fayilo yotheka, makina enieni a GraalVM amafunikira. Kuti mudziwe zambiri za momwe mungakhazikitsire chilengedwe cha izi, onani malangizo ofananira nawo Chitsogozo cha Quarkus.

Kenako, potsatira malangizo omwe aperekedwa pamenepo, muyenera kutsitsa gwero, kumanga ndi kutumiza pulogalamu yathu:

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

Pambuyo pa malamulowa, ntchitoyo idzatumizidwa, koma sichidzayamba mpaka titakonza mauthenga omwe tikufuna mu AMQ Online.

Kukhazikitsa dongosolo la mauthenga

Tsopano chomwe chatsala ndikukhazikitsa zofunikira zomwe pulogalamu yathu imafunikira pamakina a mauthenga. Kuti muchite izi, muyenera kupanga: 1) malo adiresi kuti muyambe mapeto a mauthenga; 2) adilesi yokonza maadiresi omwe timagwiritsa ntchito pakugwiritsa ntchito; 3) Wogwiritsa ntchito mauthenga kuti akhazikitse zidziwitso za kasitomala.

Malo adilesi

Chinthu cha AddressSpace mu AMQ Online ndi gulu la maadiresi omwe amagawana zomaliza zolumikizirana ndikutsimikizira ndi kuvomereza mfundo. Mukapanga malo adilesi, mutha kufotokoza momwe mathero a mauthenga adzawululidwe:

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

Maadiresi

Maadiresi amagwiritsidwa ntchito kutumiza ndi kulandira mauthenga. Adilesi iliyonse ili ndi mtundu, womwe umatsimikizira semantics yake, komanso ndondomeko, yomwe imatchula chiwerengero cha zinthu zomwe ziyenera kusungidwa. Adilesi imatha kuzindikirika, mwachitsanzo, motere:

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

Wogwiritsa ntchito mauthenga

Kuonetsetsa kuti mapulogalamu odalirika okha ndi omwe angatumize ndi kulandira mauthenga ku maadiresi anu, muyenera kupanga wogwiritsa ntchito mauthenga. Pamapulogalamu omwe akuyenda pagulu, makasitomala amatha kutsimikiziridwa pogwiritsa ntchito akaunti yautumiki ya OpenShift. Wogwiritsa "akaunti yautumiki" amatha kufotokozedwa, mwachitsanzo, motere:

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

Zilolezo zokonza pulogalamu

Kuti AMQ Online ipange configmap yomwe tidagwiritsa ntchito kuyika zambiri za AMQP, Role ndi RoleBinding ziyenera kukhazikitsidwa:

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

Momwe mungagwiritsire ntchito masinthidwe

Mutha kugwiritsa ntchito kasinthidwe ka mauthenga monga chonchi:

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

Kutsimikizira ntchito

Kuti muwonetsetse kuti pulogalamuyo yayamba, choyamba, tiyeni tiwone ngati ma adilesi ofananira adapangidwa ndipo akugwira ntchito:

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

Kenako tiyeni tiwone ulalo wa njira yogwiritsira ntchito (ingotsegulani adilesi iyi mu msakatuli):

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

Msakatuli akuyenera kuwonetsa kuti matikiti amasinthidwa nthawi ndi nthawi pomwe mauthenga amatumizidwa ndikulandiridwa ndi AMQ Online.

Kuphatikizidwa

Chifukwa chake tidalemba pulogalamu ya Quarkus yomwe imagwiritsa ntchito AMQP potumizirana mauthenga, tidakonza pulogalamuyo kuti iyendetse pa nsanja ya Red Hat OpenShift, ndikukhazikitsa kasinthidwe kake potengera kasinthidwe ka AMQ Online. Kenako tidapanga ma manifesto ofunikira kuti tiyambitse njira yotumizira mauthenga pakugwiritsa ntchito kwathu.

Izi zikumaliza mndandanda wa Quarkus, koma pali zinthu zambiri zatsopano komanso zosangalatsa zomwe zikubwera, khalani maso!

Source: www.habr.com

Kuwonjezera ndemanga