Red Hat OpenShift plataforman hodeiko jatorrizko mezularitza Quarkus eta AMQ Online erabiliz

Kaixo guztioi! Hemen duzu - Quarkus serieko gure azken argitalpena! (Bide batez, ikusi gure webinarra "Hau Quarkus - Kubernetes jatorrizko Java esparrua da". Hutsetik hasi edo prest dauden irtenbideak nola transferitzen erakutsiko dizugu)

Red Hat OpenShift plataforman hodeiko jatorrizko mezularitza Quarkus eta AMQ Online erabiliz

Π’ aurrekoa Post honetan, Java aplikazioak modernizatzearen ondorioz lortutako hobekuntzak kuantifikatzeko erabil daitezkeen tresna garrantzitsuak aztertu ditugu.

0.17.0 bertsiotik aurrera, Quarkuak Mezuen Ilaran jartzeko Protokolo aurreratua erabiltzea onartzen du (AMQP), aplikazio edo erakundeen artean negozio-mezuak transferitzeko estandar irekia dena.

Red Hat AMQ Online kode irekiko proiektu batean oinarrituta eraikitako zerbitzua da EnMasse eta plataforman oinarritutako mezularitza-mekanismoa ezartzea Red Hat OpenShift. Funtzionamenduari buruzko xehetasun gehiago lortzeko, ikus hemen (EU). Gaur AMQ Online eta Quarkus nola konbinatu erakutsiko dizugu OpenShift-en oinarritutako mezularitza-sistema moderno bat eraikitzeko bi mezularitza teknologia berri erabiliz.

Suposatzen da dagoeneko AMQ Online zabaldu duzula OpenShift plataforman (ez bada, ikusi instalazio gida).

Hasteko, Quarkus aplikazio bat sortuko dugu, mezularitza erreaktiboa erabiliz eskaerak prozesatzeko sistema sinple bat izango dena. Aplikazio honek aginduak mezu-ilara batera bidaltzen dituen eskaera-sorgailu bat izango du tarte finko batean, baita ilararen mezuak prozesatu eta nabigatzailean ikus daitezkeen baieztapenak sortuko dituen eskaera-prozesadore bat ere.

Aplikazioa sortu ondoren, mezularitza-sistemaren konfigurazioa aplikazioan txertatu eta AMQ Online erabiltzen erakutsiko dizugu sisteman behar ditugun baliabideak hornitzeko.

Quarkus aplikazioa

Gure Quarkus aplikazioa OpenShift-en exekutatzen da eta programaren bertsio aldatua da amqp-abiarazte azkarra. Bezeroaren aldetik adibide osoa aurki daiteke Hemen.

Eskaera-sorgailua

Sorgailuak, besterik gabe, monotonikoki hazten diren eskaera IDak bidaltzen ditu "eskaerak" helbidera 5 segundoro.

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

Eskaera prozesadorea

Eskaeraren kudeatzailea are sinpleagoa da, berrespen ID bat besterik ez du itzultzen "berrespenak" helbidera.

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

Berrespen-baliabideak

Berrespen-baliabidea HTTP amaierako puntu bat da gure aplikazioak sortutako baieztapenak zerrendatzeko.

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

doikuntza

AMQ Online-ra konektatzeko, gure aplikazioak konfigurazio-datu batzuk beharko ditu, hau da: Quarkus konektorearen konfigurazioa, AMQP amaierako informazioa eta bezeroaren kredentzialak. Hobe da, noski, konfigurazio-datu guztiak leku batean gordetzea, baina nahita bereiziko ditugu Quarkus aplikazioa konfiguratzeko aukera posibleak erakusteko.

Konektoreak

Konektorearen konfigurazioa konpilazio garaian eman daiteke aplikazioaren propietate fitxategi bat erabiliz:

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

Gauza errazak izateko, mezu-ilara bat soilik erabiliko dugu "eskaerak" helbiderako. Eta gure aplikazioko "berrespenak" helbideak memorian ilara bat erabiliko du.

AMQP amaierako puntua

Konpilazio garaian, AMQP amaierako ostalari-izena eta ataka-zenbakia ezezagunak dira, beraz, injektatu behar dira. Amaiera-puntua AMQ Online-k sortzen duen konfigurazioan ezar daiteke, beraz, aplikazioaren manifestuan ingurune-aldagaien bidez definituko ditugu:

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

Kredentzialak

Zerbitzu-kontuaren tokena gure aplikazioa OpenShift-en autentifikatzeko erabil daiteke. Horretarako, lehenik eta behin konfigurazio-iturburu pertsonalizatu bat sortu behar duzu, pod-aren fitxategi-sistemako autentifikazio-tokena irakurriko duena:

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

Aplikazioa eraiki eta zabaldu

Aplikazioa fitxategi exekutagarri batean konpilatu behar denez, GraalVM makina birtual bat behar da. Horretarako ingurune bat konfiguratzeko moduari buruzko informazio gehiago lortzeko, ikusi dagozkion argibideak atalean Quarkus gida.

Ondoren, bertan emandako argibideei jarraituz, iturburua deskargatu, eraiki eta zabaldu behar duzu gure aplikazioa:

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

Komando hauen ondoren, aplikazioa zabalduko da, baina ez da martxan jarriko AMQ Online-n behar ditugun mezularitza-baliabideak konfiguratu arte.

Mezularitza sistema konfiguratzea

Orain gure aplikazioak mezularitza sisteman behar dituen baliabideak ezartzea besterik ez da geratzen. Horretarako, sortu behar duzu: 1) helbide-espazio bat mezularitza-sistemaren amaiera-puntua hasieratzeko; 2) helbidea aplikazioan erabiltzen ditugun helbideak konfiguratzeko; 3) Mezularitza erabiltzailea bezeroaren kredentzialak ezartzeko.

Helbide espazioa

AMQ Online-ko AddressSpace objektu bat konexio amaierako puntuak eta autentifikazio- eta baimen-politikak partekatzen dituen helbide talde bat da. Helbide-espazio bat sortzen duzunean, mezularitza amaierako puntuak nola azalduko diren zehaztu dezakezu:

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

helbidea

Helbideak mezuak bidaltzeko eta jasotzeko erabiltzen dira. Helbide bakoitzak mota bat du, eta horrek bere semantika zehazten du, baita plan bat, zeinak erreserbatu beharreko baliabide kopurua zehazten duena. Helbidea zehaztu daiteke, adibidez, honela:

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

Mezularitza erabiltzailea

Konfiantzazko aplikazioek soilik zure helbideetara mezuak bidali eta jaso ditzaketela ziurtatzeko, erabiltzaile bat sortu behar duzu mezularitza-sisteman. Kluster batean exekutatzen diren aplikazioetarako, bezeroak autentifikatu daitezke OpenShift zerbitzu-kontu bat erabiliz. Erabiltzailearen "zerbitzu-kontua" defini daiteke, adibidez, honela:

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

Aplikazioa konfiguratzeko baimenak

AMQ Online AMQP amaierako puntuaren informazioa txertatzeko erabili dugun konfigurazioa sortzeko, Role eta RoleBinding ezarri behar dira:

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

Nola aplikatu konfigurazioak

Mezu sistemaren konfigurazioa honela aplika dezakezu:

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

Aplikazioaren egiaztapena

Aplikazioa hasi dela ziurtatzeko, lehenik eta behin, egiaztatu dezagun dagozkion helbideak sortu diren eta aktibo dauden ala ez:

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

Ondoren, egiaztatu dezagun aplikazioaren ibilbidearen URLa (ireki helbide hau arakatzailean):

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

Arakatzaileak erakutsi beharko luke txartelak aldian-aldian eguneratzen direla AMQ Online-k mezuak bidali eta jasotzen dituen heinean.

Laburbilduz

Beraz, mezularitzarako AMQP erabiltzen duen Quarkus aplikazio bat idatzi genuen, aplikazioa Red Hat OpenShift plataforman exekutatzeko konfiguratu genuen eta bere konfigurazioa AMQ Online konfigurazioan oinarrituta ezarri genuen. Ondoren, gure aplikaziorako mezularitza sistema hasieratzeko beharrezkoak diren manifestuak sortu ditugu.

Honekin amaitzen da Quarkus-i buruzko seriea, baina gauza berri eta interesgarri asko daude aurretik, adi egon!

Iturria: www.habr.com

Gehitu iruzkin berria