Mākoņa vietējā ziņojumapmaiņa Red Hat OpenShift platformā, izmantojot Quarkus un AMQ Online

Sveiki visiem! Šeit tas ir - mūsu pēdējais ieraksts Quarkus sērijā! (Starp citu, skatieties mūsu vebināru “Šī ir Quarkus — Kubernetes vietējā Java ietvars”. Mēs parādīsim, kā sākt no nulles vai nodot gatavus risinājumus)

Mākoņa vietējā ziņojumapmaiņa Red Hat OpenShift platformā, izmantojot Quarkus un AMQ Online

В iepriekšējā Šajā ierakstā mēs apskatījām attiecīgos rīkus, ko var izmantot, lai kvantitatīvi noteiktu Java lietojumprogrammu modernizācijas rezultātā iegūtos uzlabojumus.

Kopš versijas 0.17.0, Kvarkuss atbalsta Advanced Message Queuing Protocol izmantošanu (AMQP), kas ir atvērts standarts biznesa ziņojumu pārsūtīšanai starp lietojumprogrammām vai organizācijām.

Red Hat AMQ tiešsaistē ir pakalpojums, kas izveidots, pamatojoties uz atvērtā pirmkoda projektu EnMasse un uz platformas balstīta ziņojumapmaiņas mehānisma ieviešana Red Hat OpenShift. Papildinformāciju par to, kā tas darbojas, skatiet šeit (EN). Šodien mēs parādīsim, kā apvienot AMQ Online un Quarkus, lai izveidotu modernu uz OpenShift balstītu ziņojumapmaiņas sistēmu, izmantojot divas jaunas ziņojumapmaiņas tehnoloģijas.

Tiek pieņemts, ka esat jau izvietojis AMQ Online platformā OpenShift (ja nē, skatiet uzstādīšanas rokasgrāmata).

Lai sāktu, mēs izveidosim Quarkus lietojumprogrammu, kas būs vienkārša pasūtījumu apstrādes sistēma, izmantojot reaktīvo ziņojumapmaiņu. Šajā lietojumprogrammā būs iekļauts pasūtījumu ģenerators, kas ar noteiktu intervālu nosūta pasūtījumus uz ziņojumu rindu, kā arī pasūtījumu apstrādātājs, kas apstrādās ziņojumus no rindas un ģenerēs pārlūkprogrammā skatāmus apstiprinājumus.

Kad lietojumprogramma būs izveidota, mēs jums parādīsim, kā lietojumprogrammā iegult ziņojumapmaiņas sistēmas konfigurāciju un izmantot AMQ Online, lai nodrošinātu sistēmā mums nepieciešamos resursus.

Quarkus lietotne

Mūsu Quarkus lietojumprogramma darbojas ar OpenShift un ir modificēta programmas versija amqp-quickstart. Pilnīgu klienta puses piemēru var atrast šeit.

Pasūtījumu ģenerators

Ģenerators ik pēc 5 sekundēm vienkārši monotoni nosūta pieaugošo pasūtījumu ID uz “pasūtījumu” adresi.

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

Pasūtījumu apstrādātājs

Pasūtījumu apstrādātājs ir vēl vienkāršāks, tas tikai atgriež apstiprinājuma ID uz "apstiprinājumu" adresi.

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

Apstiprinājuma resursi

Apstiprinājuma resurss ir HTTP galapunkts mūsu lietojumprogrammas ģenerēto apstiprinājumu uzskaitīšanai.

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

koriģēšana

Lai izveidotu savienojumu ar AMQ Online, mūsu lietojumprogrammai būs nepieciešami daži konfigurācijas dati, proti: Quarkus savienotāja konfigurācija, AMQP galapunkta informācija un klienta akreditācijas dati. Labāk, protams, visus konfigurācijas datus glabāt vienuviet, taču mēs tos apzināti atdalīsim, lai parādītu iespējamās iespējas Quarkus aplikācijas konfigurēšanai.

Savienotāji

Savienotāja konfigurāciju var nodrošināt kompilēšanas laikā, izmantojot lietojumprogrammas rekvizītu failu:

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

Lai lietas būtu vienkāršas, mēs izmantosim tikai ziņojumu rindu "pasūtījumu" adresei. Un “apstiprinājumu” adrese mūsu lietojumprogrammā izmantos rindu atmiņā.

AMQP galapunkts

Kompilēšanas laikā AMQP galapunkta resursdatora nosaukums un porta numurs nav zināmi, tāpēc tie ir jāievada. Gala punktu var iestatīt AMQ Online izveidotajā konfigurācijas kartē, tāpēc mēs tos definēsim, izmantojot vides mainīgos lietojumprogrammas 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

Akreditācijas dati

Pakalpojuma konta pilnvaru var izmantot, lai autentificētu mūsu lietojumprogrammu OpenShift. Lai to izdarītu, vispirms ir jāizveido pielāgots ConfigSource, kas nolasīs autentifikācijas pilnvaru no pod failu sistēmas:

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

Izveidojiet un izvietojiet lietojumprogrammu

Tā kā lietojumprogramma ir jāapkopo izpildāmā failā, ir nepieciešama GraalVM virtuālā mašīna. Sīkāku informāciju par vides iestatīšanu skatiet attiecīgajās instrukcijās Kvarkusa ceļvedis.

Pēc tam, izpildot tur sniegtos norādījumus, jums ir jālejupielādē avots, jāizveido un jāizvieto mūsu lietojumprogramma:

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

Pēc šīm komandām lietojumprogramma tiks izvietota, taču tā netiks startēta, kamēr mēs nekonfigurēsim nepieciešamos ziņojumapmaiņas resursus pakalpojumā AMQ Online.

Ziņojumapmaiņas sistēmas iestatīšana

Tagad atliek tikai iestatīt mūsu lietojumprogrammai nepieciešamos resursus ziņojumapmaiņas sistēmā. Lai to izdarītu, ir jāizveido: 1) adrešu telpa ziņojumapmaiņas sistēmas galapunkta inicializācijai; 2) adrese, lai konfigurētu adreses, kuras izmantojam aplikācijā; 3) Ziņojumapmaiņas lietotājs, lai iestatītu klienta akreditācijas datus.

Adreses telpa

AddressSpace objekts pakalpojumā AMQ Online ir adrešu grupa, kas koplieto savienojuma galapunktus un autentifikācijas un autorizācijas politikas. Kad veidojat adrešu telpu, varat norādīt, kā tiks parādīti ziņojumapmaiņas galapunkti.

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

Adreses

Adreses tiek izmantotas, lai nosūtītu un saņemtu ziņas. Katrai adresei ir tips, kas nosaka tās semantiku, kā arī plāns, kurā norādīts rezervējamo resursu skaits. Adresi var noteikt, piemēram, šādi:

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

Ziņapmaiņas lietotājs

Lai nodrošinātu, ka tikai uzticamas programmas var nosūtīt un saņemt ziņojumus uz jūsu adresēm, jums ir jāizveido lietotājs ziņojumapmaiņas sistēmā. Programmām, kas darbojas klasterī, klientus var autentificēt, izmantojot OpenShift pakalpojuma kontu. Lietotāju "servisa konts" var definēt, piemēram, šādi:

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

Atļaujas lietojumprogrammas konfigurēšanai

Lai AMQ Online izveidotu konfigurācijas karti, ko izmantojām AMQP galapunkta informācijas iegulšanai, ir jāiestata loma un lomu saistīšana:

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

Kā lietot konfigurācijas

Varat lietot ziņojumapmaiņas sistēmas konfigurāciju šādi:

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

Lietojumprogrammas pārbaude

Lai pārliecinātos, ka lietojumprogramma ir sākusies, vispirms pārbaudīsim, vai ir izveidotas un ir aktīvas atbilstošās adreses:

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

Pēc tam pārbaudīsim lietojumprogrammas maršruta URL (vienkārši atveriet šo adresi pārlūkprogrammā):

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

Pārlūkprogrammai ir jāparāda, ka biļetes tiek periodiski atjauninātas, kad AMQ Online nosūta un saņem ziņojumus.

Apkopojot

Tāpēc mēs uzrakstījām Quarkus lietojumprogrammu, kas ziņojumapmaiņai izmanto AMQP, konfigurējām lietojumprogrammu, lai tā darbotos Red Hat OpenShift platformā, un ieviesām tās konfigurāciju, pamatojoties uz AMQ Online konfigurāciju. Pēc tam mēs izveidojām manifestus, kas nepieciešami mūsu lietojumprogrammas ziņojumapmaiņas sistēmas inicializācijai.

Ar to sērija par Quarkus noslēdzas, taču priekšā ir daudz jauna un interesanta, sekojiet līdzi!

Avots: www.habr.com

Pievieno komentāru