Hi kollha! Hawn hu - l-aħħar post tagħna fis-serje Quarkus! (Mill-mod, ara l-webinar tagħna
В
Mill-verżjoni 0.17.0,
Huwa preżunt li diġà skjerajt AMQ Online fuq il-pjattaforma OpenShift (jekk le, allura ara
Biex tibda, aħna ser noħolqu applikazzjoni Quarkus li se tkun sistema sempliċi ta 'pproċessar ta' ordnijiet bl-użu ta 'messaġġi reattivi. Din l-applikazzjoni se tinkludi ġeneratur tal-ordnijiet li jibgħat ordnijiet lil kju tal-messaġġi f'intervall fiss, kif ukoll proċessur tal-ordnijiet li jipproċessa messaġġi mill-kju u jiġġenera konfermi li jistgħu jidhru fil-browser.
Ladarba ħloqna l-applikazzjoni, aħna ser nuruk kif tiddaħħal il-konfigurazzjoni tas-sistema tal-messaġġi fl-applikazzjoni u nużaw AMQ Online biex nipprovdu r-riżorsi li neħtieġu fis-sistema.
App Quarkus
L-applikazzjoni Quarkus tagħna taħdem fuq OpenShift u hija verżjoni modifikata tal-programm
Ordni ġeneratur
Il-ġeneratur sempliċement jibgħat b'mod monotoniku IDs tal-ordnijiet li qed jikbru lill-indirizz ta '"ordnijiet" kull 5 sekondi.
@ApplicationScoped
public class OrderGenerator {
private int orderId = 1;
@Outgoing("orders")
public Flowable<Integer> generate() {
return Flowable.interval(5, TimeUnit.SECONDS)
.map(tick -> orderId++);
}
}
Proċessur tal-Ordni
Il-handler tal-ordnijiet huwa saħansitra aktar sempliċi, huwa biss jirritorna ID ta 'konferma lill-indirizz tal-"konfermi".
@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;
}
}
Riżorsi ta' Konferma
Ir-riżorsa ta' konferma hija punt ta' tmiem HTTP għall-elenkar tal-konfermi ġġenerati mill-applikazzjoni tagħna.
@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;
}
}
aġġustament
Biex tikkonnettja ma 'AMQ Online, l-applikazzjoni tagħna se teħtieġ xi dejta ta' konfigurazzjoni, jiġifieri: konfigurazzjoni tal-konnettur Quarkus, informazzjoni tal-endpoint AMQP u kredenzjali tal-klijent. Huwa, ovvjament, aħjar li nżommu d-dejta tal-konfigurazzjoni kollha f'post wieħed, iżda aħna se nisseparawhom apposta biex nuru l-għażliet possibbli għall-konfigurazzjoni tal-applikazzjoni Quarkus.
Konnetturi
Il-konfigurazzjoni tal-konnettur tista' tiġi pprovduta fil-ħin tal-kompilazzjoni bl-użu ta' fajl tal-proprjetajiet tal-applikazzjoni:
mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp
Biex inżommu l-affarijiet sempliċi, aħna ser nużaw biss kju tal-messaġġi għall-indirizz "ordnijiet". U l-indirizz tal-"konfermi" fl-applikazzjoni tagħna se juża kju fil-memorja.
Endpoint AMQP
Fiż-żmien tal-kompilazzjoni, l-isem tal-host u n-numru tal-port għall-endpoint AMQP mhumiex magħrufa, għalhekk għandhom jiġu injettati. L-endpoint jista 'jiġi stabbilit fil-konfigurazzjoni li hija maħluqa minn AMQ Online, għalhekk aħna ser niddefinixxuhom permezz ta' varjabbli ambjentali fil-manifest tal-applikazzjoni:
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
Kredenzjali
It-token tal-kont tas-servizz jista' jintuża biex jawtentika l-applikazzjoni tagħna għal OpenShift. Biex tagħmel dan, l-ewwel trid toħloq ConfigSource tad-dwana li jaqra t-token tal-awtentikazzjoni mis-sistema tal-fajls tal-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);
}
}
Ibni u Użu l-Applikazzjoni
Peress li l-applikazzjoni trid tiġi kkompilata f'fajl eżekutibbli, hija meħtieġa magna virtwali GraalVM. Għal dettalji dwar kif twaqqaf ambjent għal dan, ara l-istruzzjonijiet korrispondenti f'
Imbagħad, wara l-istruzzjonijiet mogħtija hemmhekk, trid tniżżel is-sors, tibni u tuża l-applikazzjoni tagħna:
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
Wara dawn il-kmandi, l-applikazzjoni tiġi skjerata, iżda mhux se tibda qabel ma nikkonfiguraw ir-riżorsi tal-messaġġi li għandna bżonn f'AMQ Online.
Twaqqif tas-sistema tal-messaġġi
Issa dak kollu li jibqa 'huwa li jiġu stabbiliti r-riżorsi li l-applikazzjoni tagħna teħtieġ fis-sistema tal-messaġġi. Biex tagħmel dan, għandek bżonn toħloq: 1) spazju għall-indirizzi biex inizjalizza l-endpoint tas-sistema tal-messaġġi; 2) indirizz biex tikkonfigura l-indirizzi li nużaw fl-applikazzjoni; 3) Utent tal-messaġġi biex jistabbilixxi l-kredenzjali tal-klijent.
Spazju tal-indirizz
Oġġett AddressSpace f'AMQ Online huwa grupp ta' indirizzi li jaqsmu punti ta' tmiem tal-konnessjoni u politiki ta' awtentikazzjoni u awtorizzazzjoni. Meta toħloq spazju għall-indirizzi, tista' tispeċifika kif se jkunu esposti l-endpoints tal-messaġġi:
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
Indirizz
L-indirizzi jintużaw biex jintbagħtu u jirċievu messaġġi. Kull indirizz għandu tip, li jiddetermina s-semantika tiegħu, kif ukoll pjan, li jispeċifika n-numru ta 'riżorsi li għandhom jiġu riżervati. L-indirizz jista 'jiġi determinat, pereżempju, bħal dan:
apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
name: quarkus-example.orders
spec:
address: orders
type: queue
plan: brokered-queue
Utent tal-messaġġi
Biex tiżgura li applikazzjonijiet ta' fiduċja biss jistgħu jibagħtu u jirċievu messaġġi fl-indirizzi tiegħek, trid toħloq utent fis-sistema tal-messaġġi. Għal applikazzjonijiet li jaħdmu fuq cluster, il-klijenti jistgħu jiġu awtentikati bl-użu ta' kont tas-servizz OpenShift. L-utent "serviceaccount" jista 'jiġi definit, pereżempju, bħal dan:
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"]
Permessi biex jiġi kkonfigurat l-applikazzjoni
Sabiex AMQ Online toħloq il-konfigurazzjoni li użajna biex inkorporaw l-informazzjoni tal-endpoint AMQP, ir-Rwol u l-Irbit tar-Rwol iridu jiġu stabbiliti:
---
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
Kif tapplika konfigurazzjonijiet
Tista' tapplika l-konfigurazzjoni tas-sistema tal-messaġġi bħal din:
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
Verifika tal-applikazzjoni
Biex niżguraw li l-applikazzjoni bdiet, l-ewwelnett, ejja niċċekkjaw jekk l-indirizzi korrispondenti inħolqux u humiex attivi:
until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Not yet ready"; sleep 5; done
Imbagħad ejja niċċekkja l-URL tar-rotta tal-applikazzjoni (iftaħ dan l-indirizz fil-browser):
echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"
Il-browser għandu juri li l-biljetti jiġu aġġornati perjodikament hekk kif il-messaġġi jintbagħtu u jirċievu minn AMQ Online.
Bħala sinteżi
Allura ktibna applikazzjoni Quarkus li tuża AMQP għall-messaġġi, kkonfigurajna l-applikazzjoni biex taħdem fuq il-pjattaforma Red Hat OpenShift, u implimentajna l-konfigurazzjoni tagħha bbażata fuq il-konfigurazzjoni AMQ Online. Imbagħad ħloqna l-manifesti meħtieġa biex inizjalizzaw is-sistema tal-messaġġi għall-applikazzjoni tagħna.
Dan jikkonkludi s-serje dwar Quarkus, iżda hemm ħafna affarijiet ġodda u interessanti quddiem, ibqa' sintonizzat!
Sors: www.habr.com