Bonjou tout moun! Men li - dènye pòs nou an nan seri Quarkus la! (Bon wout la, gade webinar nou an
В
Depi vèsyon 0.17.0,
Li sipoze ke ou te deja deplwaye AMQ Online sou platfòm OpenShift la (si se pa sa, gade
Pou kòmanse, nou pral kreye yon aplikasyon Quarkus ki pral yon senp sistèm pwosesis lòd lè l sèvi avèk mesaj reyaktif. Aplikasyon sa a pral gen ladan yon jeneratè lòd ki voye lòd nan yon keu mesaj nan yon entèval fiks, osi byen ke yon processeur lòd ki pral trete mesaj ki soti nan keu la ak jenere konfimasyon ki ka wè nan navigatè a.
Yon fwa nou fin kreye aplikasyon an, n ap montre w kouman pou w entegre konfigirasyon sistèm mesaj la nan aplikasyon an epi itilize AMQ Online pou bay resous nou bezwen sou sistèm nan.
Quarkus aplikasyon
Aplikasyon Quarkus nou an kouri sou OpenShift epi li se yon vèsyon modifye nan pwogram nan
Dèlko lòd
Dèlko a tou senpleman voye yon idantite lòd k ap grandi nan adrès "lòd" yo chak 5 segonn.
@ApplicationScoped
public class OrderGenerator {
private int orderId = 1;
@Outgoing("orders")
public Flowable<Integer> generate() {
return Flowable.interval(5, TimeUnit.SECONDS)
.map(tick -> orderId++);
}
}
Lòd processeur
Moun k ap okipe lòd la se menm pi senp, li jis retounen yon ID konfimasyon nan adrès "konfimasyon yo".
@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;
}
}
Resous Konfimasyon
Resous konfimasyon an se yon pwen final HTTP pou lis konfimasyon aplikasyon nou an te pwodwi.
@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;
}
}
ajisteman
Pou konekte ak AMQ Online, aplikasyon nou an ap bezwen kèk done konfigirasyon, sètadi: konfigirasyon konektè Quarkus, enfòmasyon AMQP pwen final ak kalifikasyon kliyan yo. Li se, nan kou, pi bon kenbe tout done yo konfigirasyon nan yon sèl kote, men nou pral fè espre separe yo montre opsyon ki posib pou konfigirasyon aplikasyon an Quarkus.
Konektè
Konfigirasyon Connector ka bay nan moman konpile lè l sèvi avèk yon dosye pwopriyete aplikasyon:
mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp
Pou kenbe bagay sa yo senp, nou pral itilize sèlman yon keu mesaj pou adrès "lòd yo". Ak adrès "konfimasyon" nan aplikasyon nou an pral sèvi ak yon keu nan memwa.
pwen final AMQP
Nan moman konpile, non host la ak nimewo pò pou pwen final AMQP la pa konnen, kidonk yo dwe sou fòm piki. Ka pwen final la dwe mete nan konfigmap ki kreye pa AMQ Online, kidonk nou pral defini yo atravè varyab anviwònman nan manifest aplikasyon an:
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
kalifikasyon yo
Ou ka itilize siy kont sèvis la pou otantifye aplikasyon nou an nan OpenShift. Pou fè sa, ou dwe premye kreye yon ConfigSource koutim ki pral li siy otantifikasyon an nan sistèm dosye gous la:
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);
}
}
Konstwi ak deplwaye aplikasyon an
Depi aplikasyon an dwe konpile nan yon dosye ègzèkutabl, yon machin vityèl GraalVM obligatwa. Pou plis detay sou fason pou mete yon anviwònman pou sa, gade enstriksyon korespondan yo nan
Lè sa a, swiv enstriksyon yo bay la, ou bezwen telechaje sous la, bati ak deplwaye aplikasyon nou an:
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
Apre kòmandman sa yo, aplikasyon an pral deplwaye, men li p ap kòmanse jiskaske nou konfigirasyon resous mesaj nou bezwen nan AMQ Online.
Mete kanpe sistèm nan messagerie
Koulye a, tout sa ki rete se mete resous aplikasyon nou an bezwen nan sistèm nan messagerie. Pou fè sa, ou bezwen kreye: 1) yon espas adrès pou inisyalize pwen final sistèm mesaj la; 2) adrès pou configured adrès nou itilize nan aplikasyon an; 3) Itilizatè mesaj pou mete kalifikasyon kliyan yo.
Adrès espas
Yon objè AddressSpace nan AMQ Online se yon gwoup adrès ki pataje pwen final koneksyon ak règleman otantifikasyon ak otorizasyon. Lè ou kreye yon espas adrès, ou ka presize kijan pwen final mesaj yo pral ekspoze:
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
Adrès
Adrès yo itilize pou voye ak resevwa mesaj. Chak adrès gen yon kalite, ki detèmine semantik li yo, osi byen ke yon plan, ki presize kantite resous yo dwe rezève. Adrès la ka detèmine, pou egzanp, tankou sa a:
apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
name: quarkus-example.orders
spec:
address: orders
type: queue
plan: brokered-queue
Itilizatè mesaj
Pou asire ke sèlman aplikasyon ou fè konfyans ka voye ak resevwa mesaj nan adrès ou, ou dwe kreye yon itilizatè nan sistèm nan messagerie. Pou aplikasyon ki kouri sou yon gwoup, kliyan yo ka otantifye lè l sèvi avèk yon kont sèvis OpenShift. Ou ka defini "serviceaccount" itilizatè a, pou egzanp, tankou sa a:
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"]
Otorizasyon pou konfigirasyon aplikasyon an
Pou AMQ Online kreye konfigmap ke nou te itilize pou entegre enfòmasyon AMQP pwen final la, yo dwe mete wòl ak 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
Ki jan yo aplike konfigirasyon yo
Ou ka aplike konfigirasyon sistèm mesaj la tankou sa a:
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
Verifikasyon aplikasyon an
Pou asire w ke aplikasyon an te kòmanse, anvan tout bagay, ann tcheke si adrès korespondan yo te kreye epi yo aktif:
until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Not yet ready"; sleep 5; done
Lè sa a, ann tcheke adrès URL aplikasyon an (jis louvri adrès sa a nan navigatè a):
echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"
Navigatè a ta dwe montre tikè yo mete ajou detanzantan pandan AMQ Online voye epi resevwa mesaj yo.
Adisyon moute
Se konsa, nou te ekri yon aplikasyon Quarkus ki sèvi ak AMQP pou messagerie, konfigirasyon aplikasyon an pou kouri sou platfòm Red Hat OpenShift, epi aplike konfigirasyon li ki baze sou konfigirasyon AMQ Online la. Lè sa a, nou te kreye manifest ki nesesè yo inisyalize sistèm nan messagerie pou aplikasyon nou an.
Sa a fini seri a sou Quarkus, men gen yon anpil nan bagay nouvo ak enteresan devan yo, rete branche!
Sous: www.habr.com