Tere kõigile! Siin see on – meie viimane postitus Quarkuse sarjas! (Muide, vaadake meie veebiseminari
В
Alates versioonist 0.17.0
Eeldatakse, et olete AMQ Online'i juba OpenShifti platvormil juurutanud (kui mitte, siis vaadake
Alustuseks loome Quarkuse rakenduse, mis on lihtne tellimuste töötlemise süsteem, mis kasutab reaktiivset sõnumivahetust. See rakendus sisaldab tellimuste generaatorit, mis saadab tellimusi kindla intervalliga sõnumijärjekorda, samuti tellimuste töötlejat, mis töötleb järjekorras olevaid sõnumeid ja genereerib brauseris nähtavaid kinnitusi.
Kui oleme rakenduse loonud, näitame teile, kuidas manustada sõnumsidesüsteemi konfiguratsiooni rakendusse ja kasutada AMQ Online'i süsteemis vajalike ressursside varustamiseks.
Quarkuse rakendus
Meie Quarkuse rakendus töötab OpenShiftis ja on programmi muudetud versioon
Tellimuste generaator
Generaator saadab lihtsalt iga 5 sekundi järel kasvavad tellimuse ID-d "tellimuste" aadressile.
@ApplicationScoped
public class OrderGenerator {
private int orderId = 1;
@Outgoing("orders")
public Flowable<Integer> generate() {
return Flowable.interval(5, TimeUnit.SECONDS)
.map(tick -> orderId++);
}
}
Tellimuse töötleja
Tellimuste töötleja on veelgi lihtsam, see lihtsalt tagastab "kinnituste" aadressile kinnituse ID.
@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;
}
}
Kinnitusressursid
Kinnitusressurss on HTTP lõpp-punkt meie rakenduse loodud kinnituste loetlemiseks.
@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;
}
}
reguleerimine
AMQ Online'iga ühenduse loomiseks vajab meie rakendus mõningaid konfiguratsiooniandmeid, nimelt: Quarkuse konnektori konfiguratsioon, AMQP lõpp-punkti teave ja kliendi mandaadid. Loomulikult on parem hoida kõiki konfiguratsiooniandmeid ühes kohas, kuid me eraldame need teadlikult, et näidata Quarkuse rakenduse seadistamise võimalikke valikuid.
Pistikud
Konnektori konfiguratsiooni saab esitada kompileerimise ajal, kasutades rakenduse atribuutide faili:
mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp
Asjade lihtsuse huvides kasutame ainult tellimuste aadressi jaoks sõnumijärjekorda. Ja meie rakenduse „kinnituste” aadress kasutab mälus olevat järjekorda.
AMQP lõpp-punkt
Kompileerimise ajal on AMQP lõpp-punkti hostinimi ja pordi number teadmata, seega tuleb need sisestada. Lõpp-punkti saab määrata AMQ Online'i loodud konfiguratsioonikaardil, seega määratleme need keskkonnamuutujate kaudu rakenduse manifestis:
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
Volikirjad
Teenusekonto tunnust saab kasutada meie rakenduse autentimiseks OpenShiftis. Selleks peate esmalt looma kohandatud ConfigSource'i, mis loeb autentimisluba podi failisüsteemist:
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);
}
}
Rakenduse loomine ja juurutamine
Kuna rakendus tuleb kompileerida käivitatavaks failiks, on vaja GraalVM-i virtuaalmasinat. Täpsemat teavet selle kohta, kuidas selleks keskkonda seadistada, leiate vastavatest juhistest
Seejärel, järgides seal antud juhiseid, peate alla laadima allika, looma ja juurutama meie rakenduse:
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
Pärast neid käske rakendus juurutatakse, kuid see ei käivitu enne, kui konfigureerime AMQ Online'is vajalikud sõnumiressursid.
Sõnumisüsteemi seadistamine
Nüüd jääb üle vaid seadistada sõnumisüsteemis ressursid, mida meie rakendus vajab. Selleks tuleb luua: 1) aadressiruum sõnumisüsteemi lõpp-punkti lähtestamiseks; 2) aadress rakenduses kasutatavate aadresside seadistamiseks; 3) Sõnumside kasutaja määrata kliendi mandaadid.
Aadressiruum
AMQ Online'i aadressiruumi objekt on aadresside rühm, mis jagavad ühenduse lõpp-punkte ning autentimis- ja autoriseerimispoliitikaid. Aadressiruumi loomisel saate määrata, kuidas sõnumside lõpp-punktid avalikustatakse.
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
aadress
Aadresse kasutatakse sõnumite saatmiseks ja vastuvõtmiseks. Igal aadressil on tüüp, mis määrab selle semantika, samuti plaan, mis määrab reserveeritavate ressursside arvu. Aadressi saab määrata näiteks järgmiselt:
apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
name: quarkus-example.orders
spec:
address: orders
type: queue
plan: brokered-queue
Sõnumite kasutaja
Tagamaks, et ainult usaldusväärsed rakendused saaksid teie aadressidele sõnumeid saata ja vastu võtta, peate looma sõnumisüsteemis kasutaja. Klastris töötavate rakenduste puhul saab kliente autentida OpenShifti teenusekonto abil. Kasutaja "teenusekonto" saab määratleda näiteks järgmiselt:
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"]
Õigused rakenduse konfigureerimiseks
Selleks, et AMQ Online saaks luua konfiguratsioonikaardi, mida kasutasime AMQP lõpp-punkti teabe manustamiseks, tuleb määrata roll ja 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
Kuidas konfiguratsioone rakendada
Saate rakendada sõnumisüsteemi konfiguratsiooni järgmiselt:
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
Rakenduse kinnitamine
Rakenduse käivitumises veendumiseks kontrollime esmalt, kas vastavad aadressid on loodud ja aktiivsed:
until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Not yet ready"; sleep 5; done
Seejärel kontrollime rakenduse marsruudi URL-i (avage see aadress brauseris):
echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"
Brauser peaks näitama, et pileteid uuendatakse perioodiliselt, kui AMQ Online sõnumeid saadab ja vastu võtab.
Kokkuvõtteks
Nii kirjutasime Quarkuse rakenduse, mis kasutab sõnumside jaoks AMQP-d, konfigureerisime rakenduse töötama Red Hat OpenShift platvormil ja rakendasime selle konfiguratsiooni AMQ Online'i konfiguratsiooni alusel. Seejärel lõime manifestid, mis on vajalikud meie rakenduse sõnumisüsteemi lähtestamiseks.
Sellega on Quarkuse teemaline sari lõppenud, kuid palju uut ja huvitavat on ees ootamas, olge lainel!
Allikas: www.habr.com