Cloud-based messaging paRed Hat OpenShift chikuva uchishandisa Quarkus uye AMQ Online

Mhoroi mose! Hezvinoi - yedu yekupedzisira positi muQuarkus nhevedzano! (Nenzira, tarisa webinar yedu "Iyi iQuarkus - Kubernetes yekuzvarwa Java chimiro". Isu tinokuratidza maitiro ekutanga kubva pakatanga kana kutamisa akagadzirira-akagadzirwa mhinduro)

Cloud-based messaging paRed Hat OpenShift chikuva uchishandisa Quarkus uye AMQ Online

Π’ yapfuura Mune ino positi, takatarisa maturusi akakodzera anogona kushandiswa kuyera kuvandudzwa kunowanikwa nekuda kwekuvandudza maapplication eJava.

Kubva vhezheni 0.17.0, quarkus inotsigira kushandiswa kweAdvanced Message Queuing Protocol (AMQP), inova chiyero chakavhurika chekufambisa mameseji ebhizinesi pakati pezvikumbiro kana masangano.

Red Hat AMQ Online ibasa rakavakirwa pahwaro hwechirongwa chakavhurwa sosi EnMasse uye kushandisa chikuva-based messaging mechanism RedHat OpenShift. Kuti uwane rumwe ruzivo rwekuti inoshanda sei, ona pano (EN). Nhasi tichakuratidza nzira yekubatanidza AMQ Online uye Quarkus kuvaka yemazuva ano OpenShift-based messaging system uchishandisa maviri matsva ekutumira mameseji.

Zvinofungidzirwa kuti wakatoisa AMQ Online pane OpenShift papuratifomu (kana zvisiri, wobva waona yekuisa gwara).

Kutanga, isu tichagadzira Quarkus application inova yakapusa odha yekugadzirisa system uchishandisa reactive messaging. Ichi chishandiso chinosanganisa jenareta reodha inotumira maodha kumutsara wemeseji panguva yakatarwa, pamwe neodha processor iyo inogadzirisa mameseji kubva pamutsetse uye kugadzira zvisimbiso zvinoonekwa mubrowser.

Kana tangogadzira application, tinokuratidza nzira yekumisikidza iyo messaging system mukushandisa uye shandisa AMQ Online kupa zviwanikwa zvatinoda pane system.

Quarks app

Yedu Quarkus application inomhanya paOpenShift uye ishanduro yakagadziridzwa yechirongwa amqp-quickstart. Muenzaniso wakakwana wedivi remutengi unogona kuwanikwa pano.

Order jenareta

Jenareta inongotumira monotonically inokura maID ID kune "maodha" kero masekonzi mashanu ega ega.

@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

Iyo yekuodha inobata yakatonyanya kupusa, inongodzosera ID yekusimbisa kune "zvisimbiso" kero.

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

Kusimbisa Zviwanikwa

Iyo yekusimbisa sosi ndeye HTTP yekupedzisira yekunyora zvisimbiso zvinogadzirwa neapp yedu.

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

kuchinja

Kuti ubatanidze ku AMQ Online, application yedu inoda imwe data yekumisikidza, inoti: Quarkus connector configuration, AMQP endpoint information uye client credentials. Izvo, hongu, zviri nani kuchengetedza data rese rekugadzirisa munzvimbo imwechete, asi isu tichavapatsanura nemaune kuratidza sarudzo dzinogoneka dzekugadzirisa iyo Quarkus application.

Connectors

Connector kumisikidza inogona kupihwa panguva yekuunganidza uchishandisa application zvivakwa faira:

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

Kuti zvinhu zvive nyore, tichangoshandisa mutsara wemeseji yekero ye "maodha". Uye kero "yekusimbisa" mukushandisa kwedu inoshandisa mutsara mundangariro.

AMQP yekupedzisira

Panguva yekubatanidza, zita rekutambira uye nhamba yechiteshi cheiyo AMQP endpoint hazvizivikanwe, saka dzinofanirwa kubaiwa. Iyo yekupedzisira inogona kusetwa mune iyo configmap inogadzirwa ne AMQ Online, saka isu tichavatsanangura kuburikidza nemamiriro ekunze akasiyana mune application manifest:

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

Zvinyorwa

Iyo sevhisi account tokeni inogona kushandiswa kusimbisa application yedu kuOpenShift. Kuti uite izvi, unofanira kutanga wagadzira tsika yeConfigSource iyo inoverenga chiratidzo chechokwadi kubva kune pod's file system:

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

Gadzira uye shandisa iyo application

Sezvo application yacho ichifanirwa kuunganidzwa kuita faira rinogoneka, GraalVM virtual muchina inodiwa. Kuti uwane ruzivo rwekugadzirisa nharaunda yeizvi, ona mirairo inoenderana mu Quarkus Guide.

Zvadaro, uchitevera mirairo yakapihwa ipapo, iwe unofanirwa kudhawunirodha sosi, kuvaka uye kutumira application yedu:

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

Mushure memirairo iyi, application ichaiswa, asi haizotanga kudzamara tagadzirisa mameseji ekushandisa atinoda mu AMQ Online.

Kugadzira iyo messaging system

Ikozvino chasara kuseta zviwanikwa zvinodiwa neapplication yedu muhurongwa hwekutumira mameseji. Kuti uite izvi, unofanirwa kugadzira: 1) kero nzvimbo yekutanga messaging system yekupedzisira; 2) kero kugadzirisa kero dzatinoshandisa mukushandisa; 3) Kutumira meseji mushandisi kuseta magwaro emutengi.

Kero nzvimbo

Kero yenzvimbo mu AMQ Online iboka remakero anogovera mapeji ekubatanidza uye echokwadi uye mvumo. Paunogadzira nzvimbo yekero, unogona kutsanangura kuti mameseji ekupedzisira achaburitswa sei:

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

Mazita

Kero dzinoshandiswa kutumira uye kugamuchira mameseji. Kero imwe neimwe ine mhando, iyo inosarudza semantics yayo, pamwe nehurongwa, iyo inotsanangura huwandu hwezviwanikwa zvinofanirwa kuchengetwa. Kero inogona kutsanangurwa, semuenzaniso, seizvi:

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

Mushandisi wemeseji

Kuti uve nechokwadi chekuti maapplication akavimbika chete anogona kutumira uye kugamuchira mameseji kumakero ako, unofanirwa kugadzira mushandisi muhurongwa hwekutumira mameseji. Kune maapplication ari kushanda pachikwata, vatengi vanogona kutenderwa vachishandisa OpenShift service account. Mushandisi "serviceaccount" inogona kutsanangurwa, semuenzaniso, seizvi:

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

Mvumo yekugadzira application

Kuti AMQ Online igadzire iyo configmap yatakashandisa kumisa iyo AMQP endpoint ruzivo, Role uye RoleBinding inofanira kusetwa:

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

Maitiro ekushandisa magadzirirwo

Iwe unogona kushandisa iyo messaging system kumisikidza seizvi:

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

App verification

Kuti uve nechokwadi chekuti application yatanga, chekutanga, ngatitarisei kana kero dzinoenderana dzakagadzirwa uye dziri kushanda:

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

Zvadaro ngatitarisei nzira yekushandisa URL (ingovhura kero iyi mubrowser):

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

Iyo bhurawuza inofanirwa kuratidza kuti matikiti anogadziridzwa nguva nenguva sezvo mameseji achitumirwa uye nekugamuchirwa ne AMQ Online.

Summing up

Saka isu takanyora Quarkus application inoshandisa AMQP yekutumira mameseji, yakagadzirisa application kuti imhanye paRed Hat OpenShift papuratifomu, uye ikaita kumisikidzwa kwayo zvichienderana neiyo AMQ Online kumisikidza. Isu takazogadzira ma manifests anodiwa kuti titange messaging system yekushandisa yedu.

Izvi zvinopedzisa nhevedzano yeQuarkus, asi kune zvakawanda zvezvinhu zvitsva uye zvinonakidza zviri pamberi, gara wakatarisa!

Source: www.habr.com

Voeg