Bok svima! Evo ga - naš posljednji post u seriji Quarkus! (Usput, pogledajte naš webinar
В
Od verzije 0.17.0,
Pretpostavlja se da ste već implementirali AMQ Online na platformi OpenShift (ako niste, pogledajte
Za početak ćemo izraditi aplikaciju Quarkus koja će biti jednostavan sustav za obradu narudžbi koji koristi reaktivne poruke. Ova će aplikacija uključivati generator narudžbi koji šalje narudžbe u red poruka u fiksnom intervalu, kao i procesor narudžbi koji će obrađivati poruke iz reda čekanja i generirati potvrde vidljive u pregledniku.
Nakon što izradimo aplikaciju, pokazat ćemo vam kako ugraditi konfiguraciju sustava za razmjenu poruka u aplikaciju i koristiti AMQ Online za osiguravanje resursa koji su nam potrebni u sustavu.
Aplikacija Quarkus
Naša aplikacija Quarkus radi na OpenShiftu i modificirana je verzija programa
Generator narudžbi
Generator jednostavno monotono šalje rastuće ID-ove narudžbi na adresu "narudžbe" 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žbe
Rukovatelj narudžbama još je 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 potvrde je HTTP krajnja točka za ispisivanje potvrda koje je generirala 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 s AMQ Online našoj će aplikaciji biti potrebni neki konfiguracijski podaci, naime: konfiguracija Quarkus konektora, informacije o krajnjoj točki AMQP-a i vjerodajnice klijenta. Naravno, bolje je sve konfiguracijske podatke držati na jednom mjestu, no mi ćemo ih namjerno odvojiti kako bismo prikazali moguće mogućnosti konfiguracije Quarkus aplikacije.
Priključci
Konfiguracija konektora može se osigurati tijekom kompajliranja pomoću datoteke svojstava aplikacije:
mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp
Kako bismo pojednostavili stvari, koristit ćemo samo red poruka za adresu "narudžbi". A adresa "potvrda" u našoj aplikaciji koristit će red čekanja u memoriji.
AMQP krajnja točka
U vrijeme kompajliranja naziv glavnog računala i broj priključka za AMQP krajnju točku su nepoznati, pa se moraju ubaciti. Krajnja točka može se postaviti u konfiguracijskoj mapi koju je izradio AMQ Online, pa ć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
vjerodajnice
Token servisnog računa može se koristiti za autentifikaciju naše aplikacije na OpenShift. Da biste to učinili, prvo morate stvoriti prilagođeni ConfigSource koji će čitati autentifikacijski token iz datotečnog sustava modula:
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);
}
}
Izradite i implementirajte aplikaciju
Budući da se aplikacija mora kompajlirati u izvršnu datoteku, potreban je GraalVM virtualni stroj. Za detalje o tome kako postaviti okruženje za to, pogledajte odgovarajuće upute u
Zatim, slijedeći tamo dane upute, morate preuzeti 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 se implementirati, ali se neće pokrenuti dok ne konfiguriramo resurse za razmjenu poruka koje su nam potrebne u AMQ Online.
Postavljanje sustava za razmjenu poruka
Sada preostaje samo postaviti resurse koje naša aplikacija treba u sustavu za razmjenu poruka. Da biste to učinili, trebate kreirati: 1) adresni prostor za inicijalizaciju krajnje točke sustava za razmjenu poruka; 2) adresa za konfiguriranje adresa koje koristimo u aplikaciji; 3) Korisnik za slanje poruka za postavljanje vjerodajnica klijenta.
Adresni prostor
Objekt AddressSpace u AMQ Online je grupa adresa koje dijele krajnje točke veze i pravila provjere autentičnosti i autorizacije. Kada stvorite adresni prostor, možete odrediti kako će krajnje točke slanja 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 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 rezerviraju. 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 za slanje poruka
Kako biste osigurali da samo pouzdane aplikacije mogu slati i primati poruke na vaše adrese, morate stvoriti korisnika u sustavu za razmjenu poruka. Za aplikacije koje se izvode na klasteru, klijenti se mogu autentificirati pomoću računa usluge OpenShift. Korisnički "serviceaccount" 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"]
Dopuštenja za konfiguriranje aplikacije
Kako bi AMQ Online stvorio konfiguracijsku mapu koju smo koristili za ugradnju informacija o krajnjoj točki AMQP-a, Role i RoleBinding 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
Konfiguraciju sustava za razmjenu poruka možete primijeniti ovako:
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
Provjera prijave
Kako bismo bili sigurni da je aplikacija pokrenuta, prije svega provjerimo jesu li 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 pregledniku):
echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"
Preglednik bi trebao pokazati da se karte povremeno ažuriraju kako AMQ Online šalje i prima poruke.
Sažimanje
Tako smo napisali Quarkus aplikaciju koja koristi AMQP za razmjenu poruka, konfigurirali aplikaciju za rad na Red Hat OpenShift platformi i implementirali njezinu konfiguraciju temeljenu na AMQ Online konfiguraciji. Zatim smo izradili manifeste potrebne za inicijalizaciju sustava za razmjenu poruka za našu aplikaciju.
Ovime završavamo serijal o Quarkusu, ali čeka nas puno toga novog i zanimljivog, pratite nas!
Izvor: www.habr.com