Salaam wote! Hii hapa - chapisho letu la mwisho katika safu ya Quarkus! (Kwa njia, angalia wavuti yetu
Π
Tangu toleo la 0.17.0,
Inachukuliwa kuwa tayari umetuma AMQ Online kwenye jukwaa la OpenShift (ikiwa sivyo, basi ona
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
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
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