Melaetsa ea tlhaho ea leru sethaleng sa Red Hat OpenShift se sebelisa Quarkus le AMQ Online

Lumelang bohle! Ke ena - poso ea rona ea ho qetela letotong la Quarkus! (Ka tsela, shebella webinar ea rona "Ena ke Quarkus - Kubernetes sebopeho sa Java sa matsoalloa". Re tla u bontša mokhoa oa ho qala ho tloha qalong kapa ho fetisetsa litharollo tse seng li entsoe)

Melaetsa ea tlhaho ea leru sethaleng sa Red Hat OpenShift se sebelisa Quarkus le AMQ Online

В e fetileng Ka poso ena, re shebile lisebelisoa tse nepahetseng tse ka sebelisoang ho lekanya lintlafatso tse fumanoeng ka lebaka la ho ntlafatsa lits'ebetso tsa Java.

Ho tloha ka mofuta oa 0.17.0, quarkus e tšehetsa tšebeliso ea Advanced Message Queuing Protocol (AMQP), e leng mokhoa o bulehileng oa ho fetisa melaetsa ea khoebo pakeng tsa likopo kapa mekhatlo.

Red Hat AMQ Online ke tšebeletso e hahiloeng motheong oa morero oa mohloli o bulehileng EnMasse le ho kenya ts'ebetsong mokhoa oa melaetsa o thehiloeng sethaleng RedHat OpenShift. Bakeng sa lintlha tse ling mabapi le hore na e sebetsa joang, bona mona (EN). Kajeno re tla u bonts'a mokhoa oa ho kopanya AMQ Online le Quarkus ho aha sistimi ea melaetsa e thehiloeng ho OpenShift e sebelisang mahlale a mabeli a macha a melaetsa.

Ho nahanoa hore o se o kentse AMQ Online sethaleng sa OpenShift (haeba ho se joalo, bona tataiso ea ho kenya).

Ho qala, re tla theha ts'ebeliso ea Quarkus e tla ba sistimi e bonolo ea ts'ebetso ea odara re sebelisa melaetsa e sebetsang. Sesebelisoa sena se tla kenyelletsa jenereithara ea odara e romellang liodara moleng oa melaetsa ka nako e behiloeng, hammoho le processor ea odara e tla sebetsana le melaetsa e tsoang moleng le ho hlahisa linetefatso tse bonoang ho sebatli.

Ha re se re thehile sesebelisoa, re tla u bontša mokhoa oa ho kenya tlhophiso ea sistimi ea melaetsa ts'ebelisong le ho sebelisa AMQ Online ho fana ka lisebelisoa tseo re li hlokang ho sistimi.

Sesebelisoa sa Quarkus

Sesebelisoa sa rona sa Quarkus se sebetsa ho OpenShift mme ke mofuta o fetotsoeng oa lenaneo amqp - qala ka potlako. Mohlala o felletseng oa lehlakore la bareki o ka fumanoa mona.

Laela jenereithara

Jenereithara e romella feela li-ID tse ntseng li hola ho aterese ea "litaelo" metsotsoana e meng le e meng e 5.

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

Odara processor

Sesebelisoa sa odara se bonolo le ho feta, se khutlisetsa ID ea netefatso atereseng ea "litiiso".

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

Lisebelisoa tsa Tiiso

Mohloli oa netefatso ke pheletso ea HTTP bakeng sa ho thathamisa linetefatso tse hlahisoang ke ts'ebeliso ea rona.

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

phetoho

Ho hokela ho AMQ Online, ts'ebeliso ea rona e tla hloka data ea tlhophiso, e leng: Tlhophiso ea sehokelo sa Quarkus, tlhaiso-leseling ea AMQP le lintlha tsa bareki. Ha e le hantle, ho molemo ho boloka lintlha tsohle tsa tlhophiso sebakeng se le seng, empa re tla li arola ka boomo ho bontša mekhoa e ka khonehang ea ho lokisa ts'ebeliso ea Quarkus.

Lihokelo

Tlhophiso ea sehokelo e ka fanoa ka nako ea ho kopanya ho sebelisoa faele ea thepa ea kopo:

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

Ho boloka lintho li le bonolo, re tla sebelisa feela mola oa melaetsa bakeng sa aterese ea "liodara". 'Me aterese ea "litiiso" ts'ebelisong ea rona e tla sebelisa mokoloko mohopolong.

Qeto ea AMQP

Ka nako ea ho bokella, lebitso la moamoheli le nomoro ea boema-kepe bakeng sa pheletso ea AMQP ha e tsejoe, kahoo li tlameha ho entoa. Qetello e ka beoa ho configmap e entsoeng ke AMQ Online, kahoo re tla e hlalosa ka mefuta e fapaneng ea tikoloho ho pontšo ea kopo:

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

Lintlha tsa bopaki

Letšoao la ak'haonte ea litšebeletso le ka sebelisoa ho netefatsa kopo ea rona ho OpenShift. Ho etsa sena, o tlameha ho qala ka ho theha ConfigSource e tloaelehileng e tla bala lets'oao la netefatso ho tsoa ho sistimi ea faele ea 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);
    }
}

Theha le ho Beha Sesebelisoa

Kaha kopo e tlameha ho bokelloa hore e be faele e ka sebetsoang, mochini o sebetsang oa GraalVM oa hlokahala. Bakeng sa lintlha tse mabapi le mokhoa oa ho theha tikoloho bakeng sa sena, bona litaelo tse tsamaellanang ho Tataiso ea Quarkus.

Ebe, ho latela litaelo tse fanoeng moo, o hloka ho khoasolla mohloli, ho aha le ho tsamaisa ts'ebeliso ea rona:

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

Ka mor'a litaelo tsena, kopo e tla romelloa, empa e ke ke ea qala ho fihlela re lokisa lisebelisoa tsa melaetsa tseo re li hlokang ho AMQ Online.

Ho theha tsamaiso ea melaetsa

Hona joale ho setseng ke ho beha lisebelisoa tseo kopo ea rona e li hlokang tsamaisong ea melaetsa. Ho etsa sena, o hloka ho theha: 1) sebaka sa aterese ho qala pheletso ea sistimi ea melaetsa; 2) aterese ho hlophisa liaterese tseo re li sebelisang ts'ebelisong; 3) Mosebelisi oa melaetsa ho beha lintlha tsa bareki.

Sebaka sa aterese

Ntho ea AddressSpace ho AMQ Online ke sehlopha sa liaterese tse arolelanang lintlha tsa khokahano le maano a netefatso le tumello. Ha o theha sebaka sa aterese, o ka hlakisa hore na li-endpoints tsa melaetsa li tla pepesoa joang:

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

Li-aterese

Liaterese li sebelisoa ho romella le ho amohela melaetsa. Aterese ka 'ngoe e na le mofuta, o khethollang semantics ea eona, hammoho le moralo, o hlalosang palo ea lisebelisoa tse lokelang ho bolokoa. Aterese e ka khethoa, mohlala, joalo ka:

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

Mosebelisi oa melaetsa

Ho netefatsa hore ke lits'ebetso tse tšepahalang feela tse ka romellang le ho amohela melaetsa ho liaterese tsa hau, u tlameha ho theha mosebelisi ho sistimi ea melaetsa. Bakeng sa lits'ebetso tse sebetsang ho sehlopha, bareki ba ka netefatsoa ba sebelisa ak'haonte ea tšebeletso ea OpenShift. Mosebelisi "account account" e ka hlalosoa, mohlala, joalo ka:

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

Litumello tsa ho lokisa sesebelisoa

E le hore AMQ Online e ka etsa configmap eo re e sebelisitseng ho kenya lintlha tsa AMQP tsa pheletso, Role le RoleBinding li tlameha ho hlophisoa:

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

Mokhoa oa ho sebelisa litlhophiso

U ka sebelisa tlhophiso ea sistimi ea melaetsa joalo ka:

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

Netefatso ya kopo

Ho etsa bonnete ba hore ts'ebeliso e se e qalile, pele ho tsohle, a re hlahlobeng hore na liaterese tse tsamaellanang li entsoe le hore lia sebetsa:

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

Joale ha re hlahlobeng URL ea tsela ea ts'ebeliso ( bula aterese ena ho sebatli):

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

Sebatli se lokela ho bonts'a hore litekete li ntlafatsoa nako le nako ha melaetsa e romelloa le ho amoheloa ke AMQ Online.

Ho akaretsa

Kahoo re ngotse kopo ea Quarkus e sebelisang AMQP bakeng sa melaetsa, re lokiselitse kopo hore e sebetse sethaleng sa Red Hat OpenShift, 'me ra kenya ts'ebetsong tlhophiso ea eona e thehiloeng ho AMQ Online tlhophiso. Ka mor'a moo re thehile li-manifest tse hlokahalang ho qala tsamaiso ea melaetsa bakeng sa ts'ebeliso ea rona.

Sena se phethela letoto le mabapi le Quarkus, empa ho na le lintho tse ngata tse ncha le tse khahlisang tse tlang, lula u mametse!

Source: www.habr.com

Eketsa ka tlhaloso