Mesaj nwaj natif natal sou platfòm Red Hat OpenShift lè l sèvi avèk Quarkus ak AMQ Online

Bonjou tout moun! Men li - dènye pòs nou an nan seri Quarkus la! (Bon wout la, gade webinar nou an "Sa a se Quarkus - Kubernetes natif natal kad Java". Nou pral montre w ki jan yo kòmanse nan grafouyen oswa transfere solisyon pare-fè)

Mesaj nwaj natif natal sou platfòm Red Hat OpenShift lè l sèvi avèk Quarkus ak AMQ Online

В anvan Nan pòs sa a, nou te gade zouti ki enpòtan yo ka itilize pou quantifier amelyorasyon yo jwenn kòm rezilta modènize aplikasyon Java yo.

Depi vèsyon 0.17.0, Karkus sipòte itilizasyon Advanced Message Queuing Protocol (AMQP), ki se yon estanda ouvè pou transfere mesaj biznis ant aplikasyon oswa òganizasyon.

Red Hat AMQ sou entènèt se yon sèvis ki bati sou baz yon pwojè sous louvri EnMasse ak mete ann aplikasyon yon mekanis mesaj ki baze sou platfòm Sou entènèt jwèt Red Hat OpenShift. Pou plis detay sou kijan li fonksyone, gade isit la (EN). Jodi a nou pral montre w kouman pou konbine AMQ Online ak Quarkus pou konstwi yon sistèm messagerie modèn ki baze sou OpenShift lè l sèvi avèk de nouvo teknoloji messagerie.

Li sipoze ke ou te deja deplwaye AMQ Online sou platfòm OpenShift la (si se pa sa, gade gid enstalasyon).

Pou kòmanse, nou pral kreye yon aplikasyon Quarkus ki pral yon senp sistèm pwosesis lòd lè l sèvi avèk mesaj reyaktif. Aplikasyon sa a pral gen ladan yon jeneratè lòd ki voye lòd nan yon keu mesaj nan yon entèval fiks, osi byen ke yon processeur lòd ki pral trete mesaj ki soti nan keu la ak jenere konfimasyon ki ka wè nan navigatè a.

Yon fwa nou fin kreye aplikasyon an, n ap montre w kouman pou w entegre konfigirasyon sistèm mesaj la nan aplikasyon an epi itilize AMQ Online pou bay resous nou bezwen sou sistèm nan.

Quarkus aplikasyon

Aplikasyon Quarkus nou an kouri sou OpenShift epi li se yon vèsyon modifye nan pwogram nan amqp-quickstart. Ou ka jwenn yon egzanp konplè sou bò kliyan an isit la.

Dèlko lòd

Dèlko a tou senpleman voye yon idantite lòd k ap grandi nan adrès "lòd" yo chak 5 segonn.

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

Lòd processeur

Moun k ap okipe lòd la se menm pi senp, li jis retounen yon ID konfimasyon nan adrès "konfimasyon yo".

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

Resous Konfimasyon

Resous konfimasyon an se yon pwen final HTTP pou lis konfimasyon aplikasyon nou an te pwodwi.

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

ajisteman

Pou konekte ak AMQ Online, aplikasyon nou an ap bezwen kèk done konfigirasyon, sètadi: konfigirasyon konektè Quarkus, enfòmasyon AMQP pwen final ak kalifikasyon kliyan yo. Li se, nan kou, pi bon kenbe tout done yo konfigirasyon nan yon sèl kote, men nou pral fè espre separe yo montre opsyon ki posib pou konfigirasyon aplikasyon an Quarkus.

Konektè

Konfigirasyon Connector ka bay nan moman konpile lè l sèvi avèk yon dosye pwopriyete aplikasyon:

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

Pou kenbe bagay sa yo senp, nou pral itilize sèlman yon keu mesaj pou adrès "lòd yo". Ak adrès "konfimasyon" nan aplikasyon nou an pral sèvi ak yon keu nan memwa.

pwen final AMQP

Nan moman konpile, non host la ak nimewo pò pou pwen final AMQP la pa konnen, kidonk yo dwe sou fòm piki. Ka pwen final la dwe mete nan konfigmap ki kreye pa AMQ Online, kidonk nou pral defini yo atravè varyab anviwònman nan manifest aplikasyon an:

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

kalifikasyon yo

Ou ka itilize siy kont sèvis la pou otantifye aplikasyon nou an nan OpenShift. Pou fè sa, ou dwe premye kreye yon ConfigSource koutim ki pral li siy otantifikasyon an nan sistèm dosye gous la:

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

Konstwi ak deplwaye aplikasyon an

Depi aplikasyon an dwe konpile nan yon dosye ègzèkutabl, yon machin vityèl GraalVM obligatwa. Pou plis detay sou fason pou mete yon anviwònman pou sa, gade enstriksyon korespondan yo nan Gid Quarkus.

Lè sa a, swiv enstriksyon yo bay la, ou bezwen telechaje sous la, bati ak deplwaye aplikasyon nou an:

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

Apre kòmandman sa yo, aplikasyon an pral deplwaye, men li p ap kòmanse jiskaske nou konfigirasyon resous mesaj nou bezwen nan AMQ Online.

Mete kanpe sistèm nan messagerie

Koulye a, tout sa ki rete se mete resous aplikasyon nou an bezwen nan sistèm nan messagerie. Pou fè sa, ou bezwen kreye: 1) yon espas adrès pou inisyalize pwen final sistèm mesaj la; 2) adrès pou configured adrès nou itilize nan aplikasyon an; 3) Itilizatè mesaj pou mete kalifikasyon kliyan yo.

Adrès espas

Yon objè AddressSpace nan AMQ Online se yon gwoup adrès ki pataje pwen final koneksyon ak règleman otantifikasyon ak otorizasyon. Lè ou kreye yon espas adrès, ou ka presize kijan pwen final mesaj yo pral ekspoze:

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

Adrès

Adrès yo itilize pou voye ak resevwa mesaj. Chak adrès gen yon kalite, ki detèmine semantik li yo, osi byen ke yon plan, ki presize kantite resous yo dwe rezève. Adrès la ka detèmine, pou egzanp, tankou sa a:

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

Itilizatè mesaj

Pou asire ke sèlman aplikasyon ou fè konfyans ka voye ak resevwa mesaj nan adrès ou, ou dwe kreye yon itilizatè nan sistèm nan messagerie. Pou aplikasyon ki kouri sou yon gwoup, kliyan yo ka otantifye lè l sèvi avèk yon kont sèvis OpenShift. Ou ka defini "serviceaccount" itilizatè a, pou egzanp, tankou sa a:

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

Otorizasyon pou konfigirasyon aplikasyon an

Pou AMQ Online kreye konfigmap ke nou te itilize pou entegre enfòmasyon AMQP pwen final la, yo dwe mete wòl ak 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

Ki jan yo aplike konfigirasyon yo

Ou ka aplike konfigirasyon sistèm mesaj la tankou sa a:

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

Verifikasyon aplikasyon an

Pou asire w ke aplikasyon an te kòmanse, anvan tout bagay, ann tcheke si adrès korespondan yo te kreye epi yo aktif:

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

Lè sa a, ann tcheke adrès URL aplikasyon an (jis louvri adrès sa a nan navigatè a):

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

Navigatè a ta dwe montre tikè yo mete ajou detanzantan pandan AMQ Online voye epi resevwa mesaj yo.

Adisyon moute

Se konsa, nou te ekri yon aplikasyon Quarkus ki sèvi ak AMQP pou messagerie, konfigirasyon aplikasyon an pou kouri sou platfòm Red Hat OpenShift, epi aplike konfigirasyon li ki baze sou konfigirasyon AMQ Online la. Lè sa a, nou te kreye manifest ki nesesè yo inisyalize sistèm nan messagerie pou aplikasyon nou an.

Sa a fini seri a sou Quarkus, men gen yon anpil nan bagay nouvo ak enteresan devan yo, rete branche!

Sous: www.habr.com

Add nouvo kòmantè