Cloud-native messaging sa Red Hat OpenShift nga plataporma gamit ang Quarkus ug AMQ Online

Kumusta tanan! Ania na - ang among katapusang post sa serye sa Quarkus! (By the way, tan-awa ang among webinar "Kini ang Quarkus - Kubernetes lumad nga Java framework". Ipakita namon kanimo kung giunsa pagsugod gikan sa wala o pagbalhin mga andam nga solusyon)

Cloud-native messaging sa Red Hat OpenShift nga plataporma gamit ang Quarkus ug AMQ Online

Π’ kaniadto Sa kini nga post, among gitan-aw ang mga may kalabotan nga himan nga magamit aron maihap ang mga pag-uswag nga nakuha ingon usa ka sangputanan sa pag-modernize sa mga aplikasyon sa Java.

Sukad sa bersyon 0.17.0, quarkus nagsuporta sa paggamit sa Advanced Message Queuing Protocol (AMQP), nga usa ka bukas nga sumbanan alang sa pagbalhin sa mga mensahe sa negosyo tali sa mga aplikasyon o organisasyon.

Pula nga Hat AMQ Online usa ka serbisyo nga gitukod base sa usa ka open source nga proyekto EnMasse ug pag-implementar sa mekanismo sa pagmemensahe nga nakabase sa plataporma Red Hat OpenShift. Alang sa dugang nga mga detalye kung giunsa kini molihok, tan-awa dinhi (EN). Karon ipakita namo kanimo kung giunsa ang paghiusa sa AMQ Online ug Quarkus aron makahimo usa ka moderno nga sistema sa pagmemensa nga nakabase sa OpenShift gamit ang duha ka bag-ong teknolohiya sa pagmemensahe.

Gituohan nga na-deploy na nimo ang AMQ Online sa OpenShift nga plataporma (kung dili, unya tan-awa giya sa pag-instalar).

Sa pagsugod, maghimo kami og Quarkus nga aplikasyon nga usa ka yano nga sistema sa pagproseso sa order gamit ang reaktibo nga pagmemensahe. Kini nga aplikasyon maglakip sa usa ka order generator nga nagpadala sa mga order sa usa ka mensahe nga pila sa usa ka piho nga agwat, ingon man usa ka order processor nga magproseso sa mga mensahe gikan sa pila ug makamugna og mga kumpirmasyon nga makita sa browser.

Kung nahimo na namo ang aplikasyon, ipakita namo kanimo kung unsaon pag-embed sa configuration sa sistema sa pagmemensahe sa aplikasyon ug gamiton ang AMQ Online aron mahatag ang mga kapanguhaan nga among gikinahanglan sa sistema.

Quarkus app

Ang among Quarkus nga aplikasyon nagdagan sa OpenShift ug usa ka giusab nga bersyon sa programa amqp-dali nga pagsugod. Ang usa ka kompleto nga pananglitan sa bahin sa kliyente makit-an dinhi.

Order generator

Ang generator yano ra nga nagpadala sa nagtubo nga mga order ID sa "mga order" nga adres matag 5 segundos.

@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

Mas simple pa ang order handler, ibalik lang ang confirmation ID sa "confirmations" address.

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

Mga Kapanguhaan sa Pagkumpirma

Ang kapanguhaan sa pagkumpirma kay usa ka HTTP endpoint para sa paglista sa mga kumpirmasyon nga namugna sa among aplikasyon.

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

kausaban

Aron makonektar sa AMQ Online, ang among aplikasyon nanginahanglan pipila nga datos sa pag-configure, nga mao ang: Quarkus connector configuration, AMQP endpoint nga impormasyon ug mga kredensyal sa kliyente. Siyempre, mas maayo nga itago ang tanan nga datos sa pagsumpo sa usa ka lugar, apan tinuyo namon nga ibulag sila aron ipakita ang posible nga mga kapilian sa pag-configure sa aplikasyon sa Quarkus.

Mga konektor

Ang configuration sa connector mahimong mahatag sa oras sa pag-compile gamit ang application properties file:

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

Aron mapasimple ang mga butang, mogamit lang kami usa ka pila nga mensahe alang sa adres nga "mga order". Ug ang adres sa "pagkumpirma" sa among aplikasyon mogamit usa ka pila sa memorya.

AMQP endpoint

Sa oras sa pag-compile, ang hostname ug numero sa port alang sa AMQP endpoint wala mahibal-an, busa kinahanglan kini nga i-inject. Ang katapusan nga punto mahimong itakda sa configmap nga gihimo sa AMQ Online, mao nga among ipasabut kini pinaagi sa mga variable sa palibot sa aplikasyon nga gipakita:

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

Mga kredensyal

Ang token sa account sa serbisyo mahimong magamit aron mapamatud-an ang among aplikasyon sa OpenShift. Aron mahimo kini, kinahanglang maghimo ka ug custom ConfigSource nga mobasa sa authentication token gikan sa file system sa 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);
    }
}

Paghimo ug I-deploy ang Aplikasyon

Tungod kay ang aplikasyon kinahanglan nga i-compile sa usa ka executable file, usa ka GraalVM virtual machine ang gikinahanglan. Alang sa mga detalye kung giunsa ang pag-set up sa usa ka palibot alang niini, tan-awa ang katugbang nga mga panudlo sa Giya sa Quarkus.

Pagkahuman, pagsunod sa mga panudlo nga gihatag didto, kinahanglan nimo nga i-download ang gigikanan, paghimo ug i-deploy ang among aplikasyon:

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

Pagkahuman niini nga mga mando, ang aplikasyon i-deploy, apan dili magsugod hangtod nga ma-configure namon ang mga kapanguhaan sa pagmemensahe nga kinahanglan namon sa AMQ Online.

Pag-set up sa sistema sa pagmemensahe

Karon ang nahabilin mao ang pagtakda sa mga kapanguhaan nga gikinahanglan sa among aplikasyon sa sistema sa pagmemensahe. Aron mahimo kini, kinahanglang maghimo ka: 1) usa ka luna sa address aron masugdan ang endpoint sa sistema sa pagmemensahe; 2) adres aron ma-configure ang mga adres nga among gigamit sa aplikasyon; 3) Gumagamit sa pagmemensahe aron itakda ang mga kredensyal sa kliyente.

Lugar sa address

Ang usa ka butang nga AddressSpace sa AMQ Online usa ka grupo sa mga adres nga nag-ambit sa mga endpoint sa koneksyon ug mga palisiya sa pag-authenticate ug pagtugot. Kung maghimo ka usa ka espasyo sa adres, mahimo nimong ipiho kung giunsa ang pagpadayag sa mga endpoint sa pagmemensahe:

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

Mga pakigpulong

Ang mga adres gigamit sa pagpadala ug pagdawat sa mga mensahe. Ang matag adres adunay usa ka tipo, nga nagtino sa mga semantiko niini, ingon man usa ka plano, nga nagtino sa gidaghanon sa mga kapanguhaan nga ireserba. Ang adres mahimong matino, pananglitan, sama niini:

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

Gumagamit sa pagmemensahe

Aron masiguro nga ang kasaligan nga mga aplikasyon lamang ang makapadala ug makadawat mga mensahe sa imong mga adres, kinahanglan ka maghimo usa ka tiggamit sa sistema sa pagmemensahe. Para sa mga aplikasyon nga nagdagan sa usa ka cluster, ang mga kliyente mahimong ma-authenticate gamit ang OpenShift service account. Ang user "serviceaccount" mahimong ipasabut, pananglitan, sama niini:

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

Mga pagtugot sa pag-configure sa aplikasyon

Aron ang AMQ Online makahimo sa configmap nga among gigamit sa pag-embed sa AMQP endpoint nga impormasyon, ang Role ug RoleBinding kinahanglang itakda:

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

Giunsa paggamit ang mga pag-configure

Mahimo nimong i-apply ang configuration sa sistema sa pagmemensa sama niini:

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

Pagpamatuod sa aplikasyon

Aron masiguro nga ang aplikasyon nagsugod na, una sa tanan, atong susihon kung ang katugbang nga mga adres nahimo ug aktibo ba:

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

Dayon atong susihon ang URL sa ruta sa aplikasyon (ablihi lang kini nga adres sa browser):

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

Kinahanglang ipakita sa browser nga ang mga tiket gi-update matag karon ug unya samtang ang mga mensahe gipadala ug nadawat sa AMQ Online.

Pagsumada

Mao nga nagsulat kami usa ka aplikasyon sa Quarkus nga naggamit sa AMQP alang sa pagmemensahe, gi-configure ang aplikasyon nga modagan sa plataporma sa Red Hat OpenShift, ug gipatuman ang pag-configure niini base sa pagsumpo sa AMQ Online. Gibuhat dayon namo ang mga manifesto nga gikinahanglan aron masugdan ang sistema sa pagmemensahe para sa among aplikasyon.

Gitapos niini ang serye bahin sa Quarkus, apan adunay daghang bag-o ug makapaikag nga mga butang sa unahan, padayon nga tun-an!

Source: www.habr.com

Idugang sa usa ka comment