Pozdravljeni vsi skupaj! Tukaj je - naša zadnja objava v seriji Quarkus! (Mimogrede, oglejte si naš spletni seminar
В
Od različice 0.17.0,
Predpostavlja se, da ste AMQ Online že namestili na platformo OpenShift (če niste, glejte
Za začetek bomo ustvarili aplikacijo Quarkus, ki bo preprost sistem za obdelavo naročil z uporabo reaktivnega sporočanja. Ta aplikacija bo vključevala generator naročil, ki pošilja naročila v čakalno vrsto sporočil v določenem intervalu, kot tudi procesor naročil, ki bo obdelal sporočila iz čakalne vrste in ustvaril potrditve, vidne v brskalniku.
Ko ustvarimo aplikacijo, vam bomo pokazali, kako vdelati konfiguracijo sistema za sporočanje v aplikacijo in uporabiti AMQ Online za zagotavljanje virov, ki jih potrebujemo v sistemu.
Aplikacija Quarkus
Naša aplikacija Quarkus deluje na OpenShift in je spremenjena različica programa
Generator naročil
Generator preprosto monotono pošilja naraščajoče ID-je naročil na naslov »naročila« vsakih 5 sekund.
@ApplicationScoped
public class OrderGenerator {
private int orderId = 1;
@Outgoing("orders")
public Flowable<Integer> generate() {
return Flowable.interval(5, TimeUnit.SECONDS)
.map(tick -> orderId++);
}
}
Obdelovalec naročil
Upravljavec naročil je še enostavnejši, le potrditveni ID vrne na naslov "potrditve".
@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;
}
}
Potrditveni viri
Potrditveni vir je končna točka HTTP za seznam potrditev, ki jih ustvari 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;
}
}
prilagoditev
Za povezavo z AMQ Online bo naša aplikacija potrebovala nekaj konfiguracijskih podatkov, in sicer: konfiguracijo priključka Quarkus, informacije o končni točki AMQP in poverilnice odjemalca. Vse konfiguracijske podatke je seveda bolje hraniti na enem mestu, vendar jih bomo namenoma ločili, da prikažemo možne možnosti konfiguracije aplikacije Quarkus.
Konektorji
Konfiguracijo konektorja lahko zagotovite med prevajanjem z uporabo datoteke lastnosti aplikacije:
mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp
Da bi stvari poenostavili, bomo za naslov »naročila« uporabili samo čakalno vrsto sporočil. In naslov »potrditve« v naši aplikaciji bo uporabljal čakalno vrsto v pomnilniku.
končna točka AMQP
V času prevajanja sta ime gostitelja in številka vrat za končno točko AMQP neznana, zato ju je treba vstaviti. Končno točko lahko nastavite v konfiguracijskem zemljevidu, ki ga ustvari AMQ Online, zato jih bomo definirali s spremenljivkami okolja v 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
Poverilnice
Žeton storitvenega računa se lahko uporablja za preverjanje pristnosti naše aplikacije v OpenShift. Če želite to narediti, morate najprej ustvariti ConfigSource po meri, ki bo prebral žeton za preverjanje pristnosti iz datotečnega sistema sklopa:
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);
}
}
Zgradite in namestite aplikacijo
Ker mora biti aplikacija prevedena v izvršljivo datoteko, je potreben virtualni stroj GraalVM. Za podrobnosti o tem, kako nastaviti okolje za to, glejte ustrezna navodila v
Nato morate po tam podanih navodilih prenesti izvorno kodo, zgraditi in razmestiti našo aplikacijo:
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
Po teh ukazih bo aplikacija razporejena, vendar se ne bo zagnala, dokler ne konfiguriramo virov za sporočanje, ki jih potrebujemo v AMQ Online.
Nastavitev sistema za sporočanje
Zdaj ostane le še, da nastavimo vire, ki jih naša aplikacija potrebuje v sistemu za sporočanje. Če želite to narediti, morate ustvariti: 1) naslovni prostor za inicializacijo končne točke sistema za sporočanje; 2) naslov za konfiguracijo naslovov, ki jih uporabljamo v aplikaciji; 3) Uporabnik za pošiljanje sporočil za nastavitev poverilnic odjemalca.
Naslovni prostor
Objekt AddressSpace v AMQ Online je skupina naslovov, ki si delijo končne točke povezave ter pravilnike za preverjanje pristnosti in avtorizacijo. Ko ustvarite naslovni prostor, lahko določite, kako bodo izpostavljene končne točke sporočanja:
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
Naslov
Naslovi se uporabljajo za pošiljanje in prejemanje sporočil. Vsak naslov ima vrsto, ki določa njegovo semantiko, kot tudi načrt, ki določa število virov, ki jih je treba rezervirati. Naslov je mogoče določiti na primer takole:
apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
name: quarkus-example.orders
spec:
address: orders
type: queue
plan: brokered-queue
Uporabnik sporočil
Če želite zagotoviti, da lahko samo zaupanja vredne aplikacije pošiljajo in prejemajo sporočila na vaše naslove, morate ustvariti uporabnika v sistemu za sporočanje. Za aplikacije, ki se izvajajo v gruči, je mogoče odjemalce overiti z računom storitve OpenShift. Uporabniški "serviceaccount" je mogoče definirati na primer takole:
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"]
Dovoljenja za konfiguracijo aplikacije
Da lahko AMQ Online ustvari konfiguracijski zemljevid, ki smo ga uporabili za vdelavo informacij o končni točki AMQP, morata biti nastavljeni Role in RoleBinding:
---
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 uporabiti konfiguracije
Konfiguracijo sistema za sporočanje lahko uporabite takole:
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
Preverjanje vloge
Da se prepričamo, da se je aplikacija zagnala, najprej preverimo, ali so ustrezni naslovi ustvarjeni in aktivni:
until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Not yet ready"; sleep 5; done
Nato preverimo URL poti aplikacije (samo odprite ta naslov v brskalniku):
echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"
Brskalnik mora pokazati, da se vstopnice redno posodabljajo, ko AMQ Online pošilja in prejema sporočila.
Seštejemo
Tako smo napisali aplikacijo Quarkus, ki uporablja AMQP za sporočanje, konfigurirali aplikacijo za delovanje na platformi Red Hat OpenShift in implementirali njeno konfiguracijo na podlagi konfiguracije AMQ Online. Nato smo ustvarili manifeste, potrebne za inicializacijo sporočilnega sistema za našo aplikacijo.
S tem smo zaključili serijo o Quarkusu, vendar je pred nami še veliko novega in zanimivega, spremljajte nas!
Vir: www.habr.com