Ujumbe wa asili wa wingu kwenye jukwaa la Red Hat OpenShift kwa kutumia Quarkus na AMQ Online

Salaam wote! Hii hapa - chapisho letu la mwisho katika safu ya Quarkus! (Kwa njia, angalia wavuti yetu "Hii ni Quarkus - Mfumo wa Java asilia wa Kubernetes". Tutakuonyesha jinsi ya kuanza kutoka mwanzo au kuhamisha suluhu zilizotengenezwa tayari)

Ujumbe wa asili wa wingu kwenye jukwaa la Red Hat OpenShift kwa kutumia Quarkus na AMQ Online

Π’ uliopita Katika chapisho hili, tuliangalia zana zinazofaa ambazo zinaweza kutumika kuhesabu maboresho yaliyopatikana kama matokeo ya kusasisha programu za Java.

Tangu toleo la 0.17.0, quarcus inasaidia utumiaji wa Itifaki ya Kuweka Foleni ya Ujumbe wa Juu (AMQP), ambayo ni kiwango kilicho wazi cha kuhamisha ujumbe wa biashara kati ya programu au mashirika.

Red Hat AMQ Online ni huduma iliyojengwa kwa msingi wa mradi wa chanzo huria EnMasse na kutekeleza utaratibu wa utumaji ujumbe unaotegemea jukwaa Red Hat OpenShift. Kwa maelezo zaidi juu ya jinsi inavyofanya kazi, ona hapa (EN). Leo tutakuonyesha jinsi ya kuchanganya AMQ Online na Quarkus ili kuunda mfumo wa kisasa wa utumaji ujumbe unaotegemea OpenShift kwa kutumia teknolojia mbili mpya za utumaji ujumbe.

Inachukuliwa kuwa tayari umetuma AMQ Online kwenye jukwaa la OpenShift (ikiwa sivyo, basi ona mwongozo wa ufungaji).

Kuanza, tutaunda programu ya Quarkus ambayo itakuwa mfumo rahisi wa kuchakata agizo kwa kutumia ujumbe tendaji. Programu hii itajumuisha jenereta ya kuagiza ambayo hutuma maagizo kwa foleni ya ujumbe kwa muda maalum, pamoja na kichakataji cha kuagiza ambacho kitachakata ujumbe kutoka kwenye foleni na kutoa uthibitisho unaoweza kuonekana kwenye kivinjari.

Mara tu tutakapounda programu, tutakuonyesha jinsi ya kupachika usanidi wa mfumo wa kutuma ujumbe kwenye programu na kutumia AMQ Online kutoa nyenzo tunazohitaji kwenye mfumo.

Programu ya Quarkus

Programu yetu ya Quarkus inaendeshwa kwenye OpenShift na ni toleo lililorekebishwa la programu amqp-kuanza haraka. Mfano kamili wa upande wa mteja unaweza kupatikana hapa.

Jenereta ya agizo

Jenereta hutuma tu vitambulisho vya kuagiza vinavyoongezeka kwa anwani ya "maagizo" kila baada ya sekunde 5.

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

Agiza Kichakataji

Kidhibiti cha agizo ni rahisi zaidi, kinarudisha kitambulisho cha uthibitishaji kwa anwani ya "uthibitisho".

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

Rasilimali za Uthibitishaji

Nyenzo ya uthibitishaji ni sehemu ya mwisho ya HTTP ya kuorodhesha uthibitisho unaotolewa na programu yetu.

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

marekebisho

Ili kuunganisha kwa AMQ Online, programu yetu itahitaji data ya usanidi, ambayo ni: usanidi wa kiunganishi cha Quarkus, maelezo ya mwisho ya AMQP na stakabadhi za mteja. Kwa kweli, ni bora kuweka data zote za usanidi mahali pamoja, lakini tutazitenga kwa makusudi ili kuonyesha chaguzi zinazowezekana za kusanidi programu ya Quarkus.

Viunganishi

Usanidi wa kiunganishi unaweza kutolewa kwa wakati wa kukusanya kwa kutumia faili ya sifa za programu:

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

Ili kurahisisha mambo, tutatumia tu foleni ya ujumbe kwa anwani ya "maagizo". Na anwani ya "uthibitisho" katika programu yetu itatumia foleni kwenye kumbukumbu.

Mwisho wa AMQP

Wakati wa kukusanya, jina la mpangishaji na nambari ya mlango wa mwisho wa AMQP hazijulikani, kwa hivyo lazima zidungwe. Mwisho unaweza kuwekwa katika usanidi ambao umeundwa na AMQ Online, kwa hivyo tutafafanua kupitia vigeu vya mazingira kwenye faili ya maelezo ya programu:

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

Hati tambulishi

Tokeni ya akaunti ya huduma inaweza kutumika kuthibitisha programu yetu kwa OpenShift. Ili kufanya hivyo, lazima kwanza uunde ConfigSource maalum ambayo itasoma tokeni ya uthibitishaji kutoka kwa mfumo wa faili wa 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);
    }
}

Jenga na Upeleke Maombi

Kwa kuwa programu lazima ijumuishwe kuwa faili inayoweza kutekelezwa, mashine pepe ya GraalVM inahitajika. Kwa maelezo juu ya jinsi ya kuweka mazingira kwa hili, angalia maagizo yanayolingana katika Mwongozo wa Quarkus.

Kisha, kufuata maagizo yaliyotolewa hapo, unahitaji kupakua chanzo, kujenga na kupeleka maombi yetu:

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

Baada ya amri hizi, programu itatumwa, lakini haitaanza hadi tusanidi rasilimali za ujumbe tunazohitaji katika AMQ Online.

Kuweka mfumo wa ujumbe

Sasa kilichobaki ni kuweka rasilimali ambazo programu yetu inahitaji katika mfumo wa utumaji ujumbe. Ili kufanya hivyo, unahitaji kuunda: 1) nafasi ya anwani ili kuanzisha mwisho wa mfumo wa ujumbe; 2) anwani ya kusanidi anwani tunazotumia kwenye programu; 3) Mtumiaji wa ujumbe ili kuweka kitambulisho cha mteja.

Nafasi ya anwani

Kipengee cha AddressSpace katika AMQ Online ni kikundi cha anwani zinazoshiriki miisho ya muunganisho na sera za uthibitishaji na uidhinishaji. Unapounda nafasi ya anwani, unaweza kubainisha jinsi miisho ya ujumbe itafichuliwa:

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

Anwani

Anwani hutumiwa kutuma na kupokea ujumbe. Kila anwani ina aina, ambayo huamua semantiki zake, pamoja na mpango, ambao unabainisha idadi ya rasilimali zinazopaswa kuhifadhiwa. Anwani inaweza kuamua, kwa mfano, kama hii:

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

Mtumiaji wa ujumbe

Ili kuhakikisha kuwa programu zinazoaminika pekee ndizo zinazoweza kutuma na kupokea ujumbe kwa anwani zako, lazima uunde mtumiaji katika mfumo wa ujumbe. Kwa programu zinazoendeshwa kwenye kundi, wateja wanaweza kuthibitishwa kwa kutumia akaunti ya huduma ya OpenShift. Mtumiaji "akaunti ya huduma" inaweza kufafanuliwa, kwa mfano, kama hii:

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

Ruhusa za kusanidi programu

Ili AMQ Online itengeneze usanidi ambao tulitumia kupachika maelezo ya AMQP ya mwisho, Jukumu na RoleBinding lazima iwekwe:

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

Jinsi ya kutumia usanidi

Unaweza kutumia usanidi wa mfumo wa ujumbe kama hii:

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

Uthibitishaji wa programu

Ili kuhakikisha kuwa programu imeanza, kwanza kabisa, hebu tuangalie ikiwa anwani zinazolingana zimeundwa na zinatumika:

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

Kisha tuangalie URL ya njia ya programu (fungua tu anwani hii kwenye kivinjari):

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

Kivinjari kinapaswa kuonyesha kuwa tiketi zinasasishwa mara kwa mara kama ujumbe unatumwa na kupokelewa na AMQ Online.

Akihitimisha

Kwa hivyo tuliandika programu ya Quarkus inayotumia AMQP kwa ujumbe, tukasanidi programu ili kuendeshwa kwenye jukwaa la Red Hat OpenShift, na kutekeleza usanidi wake kulingana na usanidi wa AMQ Online. Kisha tukaunda faili za maelezo zinazohitajika ili kuanzisha mfumo wa kutuma ujumbe kwa programu yetu.

Hii inahitimisha mfululizo kuhusu Quarkus, lakini kuna mambo mengi mapya na ya kuvutia mbele, endelea kufuatilia!

Chanzo: mapenzi.com

Kuongeza maoni