Ka leka uila ma ke kahua ʻo Red Hat OpenShift me Quarkus a me AMQ Online

Aloha kākou! Eia - kā mākou pou hope loa ma ka moʻo Quarkus! (Ma ke ala, e nānā i kā mākou webinar "ʻO Quarkus kēia - Kubernetes maoli Java framework". E hōʻike mākou iā ʻoe pehea e hoʻomaka ai mai ka ʻohi ʻana a i ʻole e hoʻololi i nā hoʻonā i hana ʻia)

Ka leka uila ma ke kahua ʻo Red Hat OpenShift me Quarkus a me AMQ Online

В mua Ma kēia pou, ua nānā mākou i nā mea pono e hiki ke hoʻohana ʻia e helu i nā hoʻomaikaʻi i loaʻa ma muli o ka hoʻololi ʻana i nā noi Java.

Mai ka mana 0.17.0, ʻO Quarkus kākoʻo i ka hoʻohana ʻana i ka Advanced Message Queuing Protocol (AMQP), he maʻamau ākea no ka hoʻoili ʻana i nā leka ʻoihana ma waena o nā noi a i ʻole nā ​​hui.

ʻO Red Hat AMQ Online he lawelawe i kūkulu ʻia ma muli o kahi papahana open source EnMasse a me ka hoʻokō ʻana i kahi ʻano memo ma muli o ke kahua ʻO Red Hat OpenShift. No nā kikoʻī hou aku e pili ana i ka hana ʻana, e ʻike maanei (EN). I kēia lā e hōʻike mākou iā ʻoe pehea e hoʻohui ai i ka AMQ Online a me Quarkus e kūkulu i kahi ʻōnaehana memo OpenShift hou me ka hoʻohana ʻana i ʻelua ʻenehana leka uila.

Ua manaʻo ʻia ua kau mua ʻoe iā AMQ Online ma ka OpenShift platform (inā ʻaʻole, a laila ʻike. alakaʻi hoʻonohonoho).

No ka hoʻomaka ʻana, e hana mākou i kahi noi Quarkus e lilo i ʻōnaehana hoʻonohonoho maʻalahi me ka hoʻohana ʻana i ka memo reactive. Hoʻokomo ʻia kēia palapala noi i kahi mea hoʻonohonoho kauoha e hoʻouna i nā kauoha i kahi queue memo ma kahi manawa paʻa, a me kahi mea hana kauoha e hoʻoponopono i nā memo mai ka pila a hoʻopuka i nā hōʻoia i ʻike ʻia ma ka polokalamu kele pūnaewele.

Ke hana mākou i ka noi, e hōʻike mākou iā ʻoe pehea e hoʻokomo ai i ka hoʻonohonoho ʻōnaehana memo i loko o ka noi a hoʻohana i ka AMQ Online e hoʻolako i nā kumuwaiwai a mākou e pono ai ma ka ʻōnaehana.

polokalamu Quarkus

Holo kā mākou noi Quarkus ma OpenShift a he mana i hoʻololi ʻia o ka papahana amqp-hoomaka koke. Hiki ke loaʻa kahi hiʻohiʻona piha o ka ʻaoʻao o ka mea kūʻai aku maanei.

Kauoha generator

Hoʻouna monotonically ka mea hana i nā ID kauoha e ulu nei i ka helu "kauoha" i kēlā me kēia 5 kekona.

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

Mea Hana Kauoha

ʻOi aku ka maʻalahi o ka mea mālama kauoha, hoʻihoʻi wale ia i kahi ID hōʻoia i ka helu "hōʻoia".

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

Nā kumuwaiwai hōʻoia

ʻO ka punawai hōʻoia he wahi hope HTTP no ka papa inoa ʻana i nā hōʻoia i hana ʻia e kā mākou noi.

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

hoʻoponopono

No ka hoʻopili ʻana iā AMQ Online, pono kā mākou noi i kekahi ʻikepili hoʻonohonoho, ʻo ia hoʻi: Quarkus connector configuration, AMQP endpoint information and client credentials. ʻOi aku ka maikaʻi o ka mālama ʻana i nā ʻikepili hoʻonohonoho āpau ma kahi hoʻokahi, akā e hoʻokaʻawale mākou iā lākou e hōʻike i nā koho kūpono no ka hoʻonohonoho ʻana i ka noi Quarkus.

Nā mea hoʻohui

Hiki ke hāʻawi ʻia ka hoʻonohonoho hoʻohui i ka manawa hōʻuluʻulu me ka hoʻohana ʻana i kahi faila waiwai noi:

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

No ka maʻalahi o nā mea, e hoʻohana wale mākou i ka laina leka no ka helu "kauoha". A ʻo ka helu "hōʻoia" i kā mākou noi e hoʻohana i kahi pila i ka hoʻomanaʻo.

AMQP hope

I ka manawa hōʻuluʻulu, ʻaʻole ʻike ʻia ka hostname a me ka helu port no ka AMQP endpoint, no laila pono lākou e hoʻokomo ʻia. Hiki ke hoʻonohonoho ʻia ka hopena i ka configmap i hana ʻia e AMQ Online, no laila e wehewehe mākou iā lākou ma o nā ʻano hoʻololi i ka palapala noi.

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

Palapala hōʻoia

Hiki ke hoʻohana ʻia ka hōʻailona moʻokāki lawelawe e hōʻoia i kā mākou noi iā OpenShift. No ka hana ʻana i kēia, pono ʻoe e hana i kahi ConfigSource maʻamau e heluhelu i ka hōʻailona hōʻoia mai ka ʻōnaehana faila o ka 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);
    }
}

Kūkulu a hoʻolaha i ka noi

No ka mea pono e hoʻopili ʻia ka noi i kahi faila hiki ke hoʻokō ʻia, pono kahi mīkini virtual GraalVM. No nā kikoʻī e pili ana i ka hoʻonohonoho ʻana i kahi kaiapuni no kēia, e ʻike i nā ʻōlelo kuhikuhi i loko Alakaʻi Quarkus.

A laila, ma hope o nā ʻōlelo aʻoaʻo i hāʻawi ʻia ma laila, pono ʻoe e hoʻoiho i ke kumu, kūkulu a kau i kā mākou noi:

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

Ma hope o kēia mau kauoha, e kau ʻia ka palapala noi, akā ʻaʻole e hoʻomaka a hiki i ka hoʻonohonoho ʻana i nā kumuwaiwai e pono ai mākou ma AMQ Online.

Hoʻonohonoho i ka ʻōnaehana memo

I kēia manawa, ʻo ka hoʻonohonoho ʻana i nā kumuwaiwai e pono ai kā mākou noi ma ka ʻōnaehana memo. No ka hana ʻana i kēia, pono ʻoe e hana: 1) kahi wahi kikoʻī e hoʻomaka ai i ka hopena o ka ʻōnaehana memo; 2) ʻōlelo e hoʻonohonoho i nā ʻōlelo a mākou e hoʻohana ai i ka noi; 3) Mea hoʻohana e hoʻonohonoho i nā hōʻoia o ka mea kūʻai aku.

Helu wahi

ʻO kahi mea AddressSpace ma AMQ Online he pūʻulu o nā ʻōlelo e kaʻana like i nā hopena pili a me nā kulekele hōʻoia a me ka ʻae. Ke hana ʻoe i wahi kikoʻī, hiki iā ʻoe ke kuhikuhi i ke ʻano o ka ʻike ʻia ʻana o nā wahi hopena memo:

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

Helu wahi

Hoʻohana ʻia nā helu wahi e hoʻouna a loaʻa i nā leka. Loaʻa i kēlā me kēia helu wahi kahi ʻano, kahi e hoʻoholo ai i kāna mau semantics, a me kahi hoʻolālā, e kuhikuhi ana i ka helu o nā kumuwaiwai e mālama ʻia. Hiki ke hoʻoholo ʻia ka helu wahi, no ka laʻana, e like me kēia:

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

Mea hoʻohana leka uila

No ka hōʻoia ʻana i hiki i nā noi hilinaʻi ke hoʻouna a loaʻa i nā leka i kāu mau helu wahi, pono ʻoe e hana i mea hoʻohana ma ka ʻōnaehana memo. No nā noi e holo ana ma kahi hui, hiki ke hōʻoia ʻia nā mea kūʻai me ka hoʻohana ʻana i kahi moʻokāki lawelawe OpenShift. Hiki ke wehewehe ʻia ka mea hoʻohana "serviceaccount", no ka laʻana, penei:

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

Nā ʻae e hoʻonohonoho i ka noi

I mea e hana ai ʻo AMQ Online i ka configmap a mākou i hoʻohana ai e hoʻokomo i ka ʻike hope AMQP, pono e hoʻonohonoho ʻia ka Role a me 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

Pehea e hoʻopili ai i nā hoʻonohonoho

Hiki iā ʻoe ke hoʻohana i ka hoʻonohonoho ʻōnaehana memo e like me kēia:

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

Hōʻoia noi

No ka hōʻoia ʻana ua hoʻomaka ka noi, ʻo ka mea mua, e nānā inā ua hana ʻia nā ʻōlelo kūpono a ua hana ʻia:

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

A laila e nānā kākou i ka URL ala noi (e wehe wale i kēia helu wahi ma ka polokalamu kele pūnaewele):

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

Pono ka polokalamu kele pūnaewele e hōʻano hou i kēlā me kēia manawa ke hoʻouna ʻia nā memo a loaʻa iā AMQ Online.

Loaʻa i luna

No laila ua kākau mākou i kahi noi Quarkus e hoʻohana ana i ka AMQP no ka leka uila, hoʻonohonoho i ka noi e holo ma ka Red Hat OpenShift platform, a hoʻokō i kāna hoʻonohonoho e pili ana i ka hoʻonohonoho AMQ Online. A laila hana mākou i nā hōʻike e pono ai e hoʻomaka i ka ʻōnaehana memo no kā mākou noi.

Hoʻopau kēia i ka moʻolelo e pili ana iā Quarkus, akā he nui nā mea hou a hoihoi i mua, e hoʻomau!

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka