Aloha kākou! Eia - kā mākou pou hope loa ma ka moʻo Quarkus! (Ma ke ala, e nānā i kā mākou webinar
В
Mai ka mana 0.17.0,
Ua manaʻo ʻia ua kau mua ʻoe iā AMQ Online ma ka OpenShift platform (inā ʻaʻole, a laila ʻike.
No ka hoʻomaka ʻana, e hana mākou i kahi noi Quarkus e lilo i ʻōnaehana hoʻonohonoho maʻalahi me ka hoʻohana ʻana i ka memo reactive. Hoʻokomo ʻia kēia palapala noi i kahi mea hoʻonohonoho kauoha e hoʻouna i nā kauoha i kahi queue memo ma kahi manawa paʻa, a me kahi mea hana kauoha e hoʻoponopono i nā memo mai ka pila a hoʻopuka i nā hōʻoia i ʻike ʻia ma ka polokalamu kele pūnaewele.
Ke hana mākou i ka noi, e hōʻike mākou iā ʻoe pehea e hoʻokomo ai i ka hoʻonohonoho ʻōnaehana memo i loko o ka noi a hoʻohana i ka AMQ Online e hoʻolako i nā kumuwaiwai a mākou e pono ai ma ka ʻōnaehana.
polokalamu Quarkus
Holo kā mākou noi Quarkus ma OpenShift a he mana i hoʻololi ʻia o ka papahana
Kauoha generator
Hoʻouna monotonically ka mea hana i nā ID kauoha e ulu nei i ka helu "kauoha" i kēlā me kēia 5 kekona.
@ApplicationScoped
public class OrderGenerator {
private int orderId = 1;
@Outgoing("orders")
public Flowable<Integer> generate() {
return Flowable.interval(5, TimeUnit.SECONDS)
.map(tick -> orderId++);
}
}
Mea Hana Kauoha
ʻOi aku ka maʻalahi o ka mea mālama kauoha, hoʻihoʻi wale ia i kahi ID hōʻoia i ka helu "hōʻoia".
@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;
}
}
Nā kumuwaiwai hōʻoia
ʻO ka punawai hōʻoia he wahi hope HTTP no ka papa inoa ʻana i nā hōʻoia i hana ʻia e kā mākou noi.
@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;
}
}
hoʻoponopono
No ka hoʻopili ʻana iā AMQ Online, pono kā mākou noi i kekahi ʻikepili hoʻonohonoho, ʻo ia hoʻi: Quarkus connector configuration, AMQP endpoint information and client credentials. ʻOi aku ka maikaʻi o ka mālama ʻana i nā ʻikepili hoʻonohonoho āpau ma kahi hoʻokahi, akā e hoʻokaʻawale mākou iā lākou e hōʻike i nā koho kūpono no ka hoʻonohonoho ʻana i ka noi Quarkus.
Nā mea hoʻohui
Hiki ke hāʻawi ʻia ka hoʻonohonoho hoʻohui i ka manawa hōʻuluʻulu me ka hoʻohana ʻana i kahi faila waiwai noi:
mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp
No ka maʻalahi o nā mea, e hoʻohana wale mākou i ka laina leka no ka helu "kauoha". A ʻo ka helu "hōʻoia" i kā mākou noi e hoʻohana i kahi pila i ka hoʻomanaʻo.
AMQP hope
I ka manawa hōʻuluʻulu, ʻaʻole ʻike ʻia ka hostname a me ka helu port no ka AMQP endpoint, no laila pono lākou e hoʻokomo ʻia. Hiki ke hoʻonohonoho ʻia ka hopena i ka configmap i hana ʻia e AMQ Online, no laila e wehewehe mākou iā lākou ma o nā ʻano hoʻololi i ka palapala noi.
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
Palapala hōʻoia
Hiki ke hoʻohana ʻia ka hōʻailona moʻokāki lawelawe e hōʻoia i kā mākou noi iā OpenShift. No ka hana ʻana i kēia, pono ʻoe e hana i kahi ConfigSource maʻamau e heluhelu i ka hōʻailona hōʻoia mai ka ʻōnaehana faila o ka 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);
}
}
Kūkulu a hoʻolaha i ka noi
No ka mea pono e hoʻopili ʻia ka noi i kahi faila hiki ke hoʻokō ʻia, pono kahi mīkini virtual GraalVM. No nā kikoʻī e pili ana i ka hoʻonohonoho ʻana i kahi kaiapuni no kēia, e ʻike i nā ʻōlelo kuhikuhi i loko
A laila, ma hope o nā ʻōlelo aʻoaʻo i hāʻawi ʻia ma laila, pono ʻoe e hoʻoiho i ke kumu, kūkulu a kau i kā mākou noi:
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
Ma hope o kēia mau kauoha, e kau ʻia ka palapala noi, akā ʻaʻole e hoʻomaka a hiki i ka hoʻonohonoho ʻana i nā kumuwaiwai e pono ai mākou ma AMQ Online.
Hoʻonohonoho i ka ʻōnaehana memo
I kēia manawa, ʻo ka hoʻonohonoho ʻana i nā kumuwaiwai e pono ai kā mākou noi ma ka ʻōnaehana memo. No ka hana ʻana i kēia, pono ʻoe e hana: 1) kahi wahi kikoʻī e hoʻomaka ai i ka hopena o ka ʻōnaehana memo; 2) ʻōlelo e hoʻonohonoho i nā ʻōlelo a mākou e hoʻohana ai i ka noi; 3) Mea hoʻohana e hoʻonohonoho i nā hōʻoia o ka mea kūʻai aku.
Helu wahi
ʻO kahi mea AddressSpace ma AMQ Online he pūʻulu o nā ʻōlelo e kaʻana like i nā hopena pili a me nā kulekele hōʻoia a me ka ʻae. Ke hana ʻoe i wahi kikoʻī, hiki iā ʻoe ke kuhikuhi i ke ʻano o ka ʻike ʻia ʻana o nā wahi hopena memo:
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
Helu wahi
Hoʻohana ʻia nā helu wahi e hoʻouna a loaʻa i nā leka. Loaʻa i kēlā me kēia helu wahi kahi ʻano, kahi e hoʻoholo ai i kāna mau semantics, a me kahi hoʻolālā, e kuhikuhi ana i ka helu o nā kumuwaiwai e mālama ʻia. Hiki ke hoʻoholo ʻia ka helu wahi, no ka laʻana, e like me kēia:
apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
name: quarkus-example.orders
spec:
address: orders
type: queue
plan: brokered-queue
Mea hoʻohana leka uila
No ka hōʻoia ʻana i hiki i nā noi hilinaʻi ke hoʻouna a loaʻa i nā leka i kāu mau helu wahi, pono ʻoe e hana i mea hoʻohana ma ka ʻōnaehana memo. No nā noi e holo ana ma kahi hui, hiki ke hōʻoia ʻia nā mea kūʻai me ka hoʻohana ʻana i kahi moʻokāki lawelawe OpenShift. Hiki ke wehewehe ʻia ka mea hoʻohana "serviceaccount", no ka laʻana, penei:
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"]
Nā ʻae e hoʻonohonoho i ka noi
I mea e hana ai ʻo AMQ Online i ka configmap a mākou i hoʻohana ai e hoʻokomo i ka ʻike hope AMQP, pono e hoʻonohonoho ʻia ka Role a me 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
Pehea e hoʻopili ai i nā hoʻonohonoho
Hiki iā ʻoe ke hoʻohana i ka hoʻonohonoho ʻōnaehana memo e like me kēia:
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
Hōʻoia noi
No ka hōʻoia ʻana ua hoʻomaka ka noi, ʻo ka mea mua, e nānā inā ua hana ʻia nā ʻōlelo kūpono a ua hana ʻia:
until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Not yet ready"; sleep 5; done
A laila e nānā kākou i ka URL ala noi (e wehe wale i kēia helu wahi ma ka polokalamu kele pūnaewele):
echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"
Pono ka polokalamu kele pūnaewele e hōʻano hou i kēlā me kēia manawa ke hoʻouna ʻia nā memo a loaʻa iā AMQ Online.
Loaʻa i luna
No laila ua kākau mākou i kahi noi Quarkus e hoʻohana ana i ka AMQP no ka leka uila, hoʻonohonoho i ka noi e holo ma ka Red Hat OpenShift platform, a hoʻokō i kāna hoʻonohonoho e pili ana i ka hoʻonohonoho AMQ Online. A laila hana mākou i nā hōʻike e pono ai e hoʻomaka i ka ʻōnaehana memo no kā mākou noi.
Hoʻopau kēia i ka moʻolelo e pili ana iā Quarkus, akā he nui nā mea hou a hoihoi i mua, e hoʻomau!
Source: www.habr.com