Fe'au fa'aoso i luga o le Red Hat OpenShift platform e fa'aoga ai le Quarkus ma le AMQ Online

Talofa uma! O le mea lea - o la matou pou mulimuli i le Quarkus series! (I le ala, matamata i la matou webinar "O le Quarkus - Kubernetes native Java framework". Matou te faʻaali atu ia te oe pe faʻafefea ona amata mai le maoaʻe pe faʻafeiloaʻi fofo ua saunia)

Fe'au fa'aoso i luga o le Red Hat OpenShift platform e fa'aoga ai le Quarkus ma le AMQ Online

В muamua I lenei pou, na matou vaʻavaʻai i mea faigaluega talafeagai e mafai ona faʻaogaina e faʻatusatusa ai faʻaleleia atili na maua ona o le faʻafouina o Java applications.

Talu mai le version 0.17.0, quarkus lagolagoina le fa'aogaina o le Advanced Message Queuing Protocol (AMQP), o se tulaga tatala mo le fesiitaiga o feʻau pisinisi i le va o talosaga poʻo faʻalapotopotoga.

Red Hat AMQ Online o se 'au'aunaga e fausia i luga o le fa'avae o se galuega fa'apogai tatala EnMasse ma le fa'atinoina o se faiga fe'au fa'avae RedHat OpenShift. Mo nisi faʻamatalaga i le auala e galue ai, vaʻai iinei (EN). O le asō o le a matou faʻaali atu ia te oe pe faʻafefea ona tuʻufaʻatasia le AMQ Online ma Quarkus e fausia ai se faiga faʻaonaponei faʻavae OpenShift e faʻaaoga ai tekinolosi feʻau fou e lua.

E faʻapea ua uma ona e faʻaogaina le AMQ Online i luga o le OpenShift platform (a leai, ona vaʻai lea taiala fa'apipi'i).

Ina ia amata, o le a matou fatuina se Quarkus talosaga o le a avea ma se faiga faʻatonuga faigofie e faʻaaoga ai feʻau faʻafefe. O lenei talosaga o le a aofia ai se faʻatonuga generator e auina atu poloaiga i se feʻau laina i se vaitaimi tumau, faʻapea foʻi ma se faʻatonuga faʻatonu e faʻagasolo ai feʻau mai le laina ma faʻatupuina faʻamaoniga e mafai ona vaʻaia i le browser.

O le taimi lava na matou fatuina ai le talosaga, matou te faʻaali atu ia te oe pe faʻafefea ona faʻapipiʻi le faʻatulagaina o feʻau i totonu o le talosaga ma faʻaoga le AMQ Online e tuʻuina atu punaoa matou te manaʻomia i luga o le polokalama.

Quarkus app

O la matou talosaga Quarkus e fa'agaoioi i luga o OpenShift ma o se fa'aliliuga o le polokalame amqp-amata vave. E mafai ona maua se fa'ata'ita'iga atoatoa o le itu a le kalani iinei.

Poloaiga afi

E na'o le monotonically e auina atu e le afi fa'atonu ID fa'atuputeleina i le tuatusi "poloaiga" i le 5 sekone.

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

Poloaiga Fa'atonu

E sili atu ona faigofie le faʻatonuga, naʻo le toe faʻafoʻiina o se ID faʻamaonia i le tuatusi "faʻamaonia".

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

Punaoa Faamauina

O le faʻamaoniga punaoa o se HTTP pito pito mo le lisiina o faʻamaoniga na faia e la matou talosaga.

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

tonu

Ina ia faʻafesoʻotaʻi i le AMQ Online, o le a manaʻomia e la matou talosaga ni faʻamatalaga faʻapipiʻi, e taʻua: Quarkus connector configuration, AMQP endpoint information and client credentials. O le mea moni, e sili atu le teuina uma o faʻamaumauga faʻamaumauga i se nofoaga e tasi, ae o le a matou vavaeeseina ma le loto i ai e faʻaalia ai filifiliga talafeagai mo le faʻatulagaina o le Quarkus application.

Feso'ota'i

E mafai ona tu'uina atu le fa'atulagaina o feso'ota'iga i le taimi fa'aopoopo e fa'aaoga ai se faila o meafaitino:

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

Ina ia fa'afaigofie mea, o le a matou fa'aogaina na'o le laina fe'au mo le tuatusi "poloaiga". Ma o le tuatusi "faʻamaoniga" i la matou talosaga o le a faʻaaogaina se laina i le mafaufau.

AMQP fa'ai'uga

I le taimi faʻapipiʻi, o le igoa talimalo ma le numera o le taulaga mo le AMQP endpoint e le o iloa, o lea e tatau ai ona tui. E mafai ona seti le pito i luga o le configmap na faia e AMQ Online, o lea o le a matou faʻamalamalamaina i latou e ala i suiga o le siosiomaga i le faʻaaliga talosaga:

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

Fa'ailoga

E mafai ona fa'aoga le fa'ailoga o le 'au'aunaga e fa'amaonia ai la matou talosaga i le OpenShift. Ina ia faia lenei mea, e tatau ona e faia muamua se ConfigSource masani e faitau le faʻamaoniga faʻamaonia mai le faila faila a le 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);
    }
}

Fausia ma Fa'atino le Talosaga

Talu ai o le talosaga e tatau ona tuʻufaʻatasia i totonu o se faila faila, e manaʻomia se masini masini GraalVM. Mo fa'amatalaga ile fa'atūina o se si'osi'omaga mo lenei mea, va'ai fa'atonuga fa'atatau ile Quarkus Taiala.

Ma, mulimuli i faʻatonuga o loʻo tuʻuina atu iina, e tatau ona e sii maia le puna, fausia ma faʻapipiʻi la matou talosaga:

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

A maeʻa nei faʻatonuga, o le a faʻapipiʻiina le talosaga, ae o le a le amataina seʻia oʻo ina matou faʻatulagaina punaoa feʻau matou te manaʻomia i le AMQ Online.

Fa'atulaga le faiga fe'au

O le taimi nei o mea uma e totoe o le setiina o punaoa e manaʻomia e le matou talosaga i le faiga o feʻau. Ina ia faia lenei mea, e tatau ona e fatuina: 1) se avanoa tuatusi e amata ai le fa'ai'uga o le faiga o fe'au; 2) tuatusi e faʻatulaga ai tuatusi matou te faʻaogaina i le talosaga; 3) Feau tagata fa'aoga e seti ai fa'amaoniga o tagata o tausia.

Avanoa tuatusi

O se mea AddressSpace i le AMQ Online o se vaega o tuatusi o loʻo faʻasoa faʻamatalaga fesoʻotaʻiga ma faʻamaoniga ma faiga faʻatagaina. A e fatuina se avanoa tuatusi, e mafai ona e faʻamaonia pe faʻafefea ona faʻaalia le faʻaiʻuga o feʻau:

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

Tuatusi

O tuatusi e fa'aoga e lafo ma maua ai fe'au. O tuatusi taʻitasi e iai se ituaiga, e faʻatatau i ana faʻamatalaga, faʻapea foʻi ma se fuafuaga, lea e faʻamaonia ai le numera o punaoa e faʻaagaga. E mafai ona fuafuaina le tuatusi, mo se faʻataʻitaʻiga, pei o lenei:

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

Fa'aoga fe'au

Ina ia mautinoa e na'o talosaga fa'atuatuaina e mafai ona lafo ma maua fe'au i au tuatusi, e tatau ona e fatuina se tagata fa'aoga i le faiga fe'au. Mo tusi talosaga o lo'o fa'agasolo i luga o se fuifui, e mafai ona fa'amaonia tagata fa'atau e fa'aaoga ai le OpenShift service account. O le tagata fa'aoga "auaunaga" e mafai ona faʻamatalaina, mo se faʻataʻitaʻiga, pei o lenei:

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

Fa'atagaga e fa'atulaga ai le talosaga

Ina ia mafai e le AMQ Online ona fatuina le configmap na matou faʻaaogaina e faʻapipiʻi ai le AMQP faʻamatalaga pito, e tatau ona seti le Role ma 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

Fa'afefea ona fa'aoga fetuutuunaiga

E mafai ona e fa'aogaina le fa'atulagaina o fe'au fa'apea:

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

Fa'amaoniga o talosaga

Ina ia mautinoa ua amata le talosaga, muamua lava, seʻi o tatou siaki pe na faia tuatusi fetaui ma o loʻo galue:

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

Ona tatou siaki lea ole auala ole talosaga URL (naʻo le tatalaina o le tuatusi lenei ile suʻega):

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

E tatau ona fa'aalia e le su'esu'e o tiketi e fa'afou i lea taimi ma lea taimi a'o lafo mai fe'au ma maua e le AMQ Online.

Faʻaopoopo i luga

O lea na matou tusia ai se talosaga a Quarkus e faʻaaoga ai le AMQP mo feʻau, faʻapipiʻi le talosaga e tamoʻe i luga o le Red Hat OpenShift platform, ma faʻatinoina lona faʻatulagaina e faʻavae i luga o le AMQ Online configuration. Ona matou fatuina lea o faʻaaliga e manaʻomia e amata ai le faiga o feʻau mo la matou talosaga.

E fa'ai'u ai le fa'asologa e uiga ia Quarkus, ae o lo'o i ai le tele o mea fou ma fiafia i luma, nofo fa'alogo!

puna: www.habr.com

Faaopoopo i ai se faamatalaga