Zdravo svima! Evo ga - naš završni post u seriji Quarkus! (Usput, pogledajte naš webinar
В
Od verzije 0.17.0,
Pretpostavlja se da ste već postavili AMQ Online na OpenShift platformi (ako niste, pogledajte
Za početak ćemo kreirati Quarkus aplikaciju koja će biti jednostavan sistem za obradu narudžbi koristeći reaktivnu razmjenu poruka. Ova aplikacija će uključivati generator naloga koji šalje narudžbe u red poruka u fiksnom intervalu, kao i procesor naloga koji će obraditi poruke iz reda i generirati potvrde koje se mogu vidjeti u pretraživaču.
Nakon što kreiramo aplikaciju, pokazat ćemo vam kako da ugradite konfiguraciju sistema za razmjenu poruka u aplikaciju i koristite AMQ Online za obezbjeđivanje resursa koji su nam potrebni na sistemu.
Quarkus app
Naša Quarkus aplikacija radi na OpenShift-u i modificirana je verzija programa
Generator narudžbi
Generator jednostavno monotono šalje rastuće ID-ove naloga na adresu „narudžbi“ svakih 5 sekundi.
@ApplicationScoped
public class OrderGenerator {
private int orderId = 1;
@Outgoing("orders")
public Flowable<Integer> generate() {
return Flowable.interval(5, TimeUnit.SECONDS)
.map(tick -> orderId++);
}
}
Procesor narudžbi
Rukovalac narudžbama je još jednostavniji, samo vraća ID potvrde na adresu "potvrde".
@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;
}
}
Resursi za potvrdu
Resurs za potvrdu je HTTP krajnja točka za popis potvrda koje generiše naša aplikacija.
@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;
}
}
podešavanje
Za povezivanje na AMQ Online, našoj aplikaciji će biti potrebni neki konfiguracijski podaci, i to: konfiguracija Quarkus konektora, informacije o AMQP krajnjoj tački i vjerodajnice klijenta. Naravno, bolje je sve konfiguracijske podatke držati na jednom mjestu, ali ćemo ih namjerno razdvojiti kako bismo prikazali moguće opcije za konfiguriranje Quarkus aplikacije.
Konektori
Konfiguracija konektora se može pružiti u vrijeme kompajliranja pomoću datoteke svojstava aplikacije:
mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp
Da stvari budu jednostavne, koristit ćemo samo red poruka za adresu "porudžbina". A adresa "potvrde" u našoj aplikaciji će koristiti red u memoriji.
AMQP krajnja tačka
U vrijeme kompajliranja, ime hosta i broj porta za AMQP krajnju tačku su nepoznati, pa se moraju ubaciti. Krajnja točka se može postaviti u configmapu koju kreira AMQ Online, tako da ćemo ih definirati kroz varijable okruženja u manifestu aplikacije:
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
Akreditivi
Token računa usluge može se koristiti za autentifikaciju naše aplikacije na OpenShift. Da biste to učinili, prvo morate kreirati prilagođeni ConfigSource koji će čitati autentifikacijski token iz sistema datoteka 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);
}
}
Napravite i implementirajte aplikaciju
Budući da se aplikacija mora kompajlirati u izvršnu datoteku, potrebna je GraalVM virtuelna mašina. Za detalje o tome kako postaviti okruženje za ovo, pogledajte odgovarajuća uputstva u
Zatim, slijedeći upute date tamo, morate preuzeti izvorni izvor, izgraditi i implementirati našu aplikaciju:
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
Nakon ovih naredbi, aplikacija će biti raspoređena, ali se neće pokrenuti dok ne konfiguriramo resurse za razmjenu poruka koje su nam potrebne u AMQ Online.
Podešavanje sistema za razmenu poruka
Sada ostaje samo da se podese resursi koji su potrebni našoj aplikaciji u sistemu za razmenu poruka. Da biste to uradili, potrebno je da kreirate: 1) adresni prostor za inicijalizaciju krajnje tačke sistema za razmenu poruka; 2) adresu za konfigurisanje adresa koje koristimo u aplikaciji; 3) Korisnik za razmjenu poruka da postavi klijentske vjerodajnice.
Adresni prostor
AddressSpace objekt u AMQ Online je grupa adresa koje dijele krajnje točke veze i politike provjere autentičnosti i autorizacije. Kada kreirate adresni prostor, možete odrediti kako će krajnje točke razmjene poruka biti izložene:
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
Adrese
Adrese se koriste za slanje i primanje poruka. Svaka adresa ima tip, koji određuje njenu semantiku, kao i plan, koji specificira broj resursa koji se rezervišu. Adresa se može odrediti, na primjer, ovako:
apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
name: quarkus-example.orders
spec:
address: orders
type: queue
plan: brokered-queue
Korisnik razmjene poruka
Da biste bili sigurni da samo pouzdane aplikacije mogu slati i primati poruke na vaše adrese, morate kreirati korisnika u sistemu za razmjenu poruka. Za aplikacije koje se pokreću na klasteru, klijenti se mogu autentifikovati pomoću naloga usluge OpenShift. Korisnički "servisni račun" može se definirati, na primjer, ovako:
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"]
Dozvole za konfiguraciju aplikacije
Da bi AMQ Online kreirao konfiguracijsku mapu koju smo koristili za ugradnju informacija o krajnjoj tački AMQP, Uloga i Vezanje uloga moraju biti postavljeni:
---
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
Kako primijeniti konfiguracije
Možete primijeniti konfiguraciju sistema za razmjenu poruka na sljedeći način:
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
Verifikacija aplikacije
Da bismo bili sigurni da je aplikacija pokrenuta, prvo provjerimo da li su odgovarajuće adrese kreirane i aktivne:
until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Not yet ready"; sleep 5; done
Zatim provjerimo URL rute aplikacije (samo otvorite ovu adresu u pretraživaču):
echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"
Pretraživač bi trebao pokazati da se karte periodično ažuriraju kako AMQ Online šalje i prima poruke.
Sumiranje
Tako smo napisali Quarkus aplikaciju koja koristi AMQP za razmenu poruka, konfigurisali aplikaciju da radi na Red Hat OpenShift platformi i implementirali njenu konfiguraciju na osnovu AMQ Online konfiguracije. Zatim smo kreirali manifeste potrebne za inicijalizaciju sistema za razmenu poruka za našu aplikaciju.
Ovim je serijal o Quarkusu završen, ali pred nama je puno novih i zanimljivih stvari, ostanite sa nama!
izvor: www.habr.com