Kumusta tanan! Ania na - ang among katapusang post sa serye sa Quarkus! (By the way, tan-awa ang among webinar
Π
Sukad sa bersyon 0.17.0,
Gituohan nga na-deploy na nimo ang AMQ Online sa OpenShift nga plataporma (kung dili, unya tan-awa
Sa pagsugod, maghimo kami og Quarkus nga aplikasyon nga usa ka yano nga sistema sa pagproseso sa order gamit ang reaktibo nga pagmemensahe. Kini nga aplikasyon maglakip sa usa ka order generator nga nagpadala sa mga order sa usa ka mensahe nga pila sa usa ka piho nga agwat, ingon man usa ka order processor nga magproseso sa mga mensahe gikan sa pila ug makamugna og mga kumpirmasyon nga makita sa browser.
Kung nahimo na namo ang aplikasyon, ipakita namo kanimo kung unsaon pag-embed sa configuration sa sistema sa pagmemensahe sa aplikasyon ug gamiton ang AMQ Online aron mahatag ang mga kapanguhaan nga among gikinahanglan sa sistema.
Quarkus app
Ang among Quarkus nga aplikasyon nagdagan sa OpenShift ug usa ka giusab nga bersyon sa programa
Order generator
Ang generator yano ra nga nagpadala sa nagtubo nga mga order ID sa "mga order" nga adres matag 5 segundos.
@ApplicationScoped
public class OrderGenerator {
private int orderId = 1;
@Outgoing("orders")
public Flowable<Integer> generate() {
return Flowable.interval(5, TimeUnit.SECONDS)
.map(tick -> orderId++);
}
}
Order Processor
Mas simple pa ang order handler, ibalik lang ang confirmation ID sa "confirmations" address.
@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;
}
}
Mga Kapanguhaan sa Pagkumpirma
Ang kapanguhaan sa pagkumpirma kay usa ka HTTP endpoint para sa paglista sa mga kumpirmasyon nga namugna sa among aplikasyon.
@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;
}
}
kausaban
Aron makonektar sa AMQ Online, ang among aplikasyon nanginahanglan pipila nga datos sa pag-configure, nga mao ang: Quarkus connector configuration, AMQP endpoint nga impormasyon ug mga kredensyal sa kliyente. Siyempre, mas maayo nga itago ang tanan nga datos sa pagsumpo sa usa ka lugar, apan tinuyo namon nga ibulag sila aron ipakita ang posible nga mga kapilian sa pag-configure sa aplikasyon sa Quarkus.
Mga konektor
Ang configuration sa connector mahimong mahatag sa oras sa pag-compile gamit ang application properties file:
mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp
Aron mapasimple ang mga butang, mogamit lang kami usa ka pila nga mensahe alang sa adres nga "mga order". Ug ang adres sa "pagkumpirma" sa among aplikasyon mogamit usa ka pila sa memorya.
AMQP endpoint
Sa oras sa pag-compile, ang hostname ug numero sa port alang sa AMQP endpoint wala mahibal-an, busa kinahanglan kini nga i-inject. Ang katapusan nga punto mahimong itakda sa configmap nga gihimo sa AMQ Online, mao nga among ipasabut kini pinaagi sa mga variable sa palibot sa aplikasyon nga gipakita:
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
Mga kredensyal
Ang token sa account sa serbisyo mahimong magamit aron mapamatud-an ang among aplikasyon sa OpenShift. Aron mahimo kini, kinahanglang maghimo ka ug custom ConfigSource nga mobasa sa authentication token gikan sa file system sa 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);
}
}
Paghimo ug I-deploy ang Aplikasyon
Tungod kay ang aplikasyon kinahanglan nga i-compile sa usa ka executable file, usa ka GraalVM virtual machine ang gikinahanglan. Alang sa mga detalye kung giunsa ang pag-set up sa usa ka palibot alang niini, tan-awa ang katugbang nga mga panudlo sa
Pagkahuman, pagsunod sa mga panudlo nga gihatag didto, kinahanglan nimo nga i-download ang gigikanan, paghimo ug i-deploy ang among aplikasyon:
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
Pagkahuman niini nga mga mando, ang aplikasyon i-deploy, apan dili magsugod hangtod nga ma-configure namon ang mga kapanguhaan sa pagmemensahe nga kinahanglan namon sa AMQ Online.
Pag-set up sa sistema sa pagmemensahe
Karon ang nahabilin mao ang pagtakda sa mga kapanguhaan nga gikinahanglan sa among aplikasyon sa sistema sa pagmemensahe. Aron mahimo kini, kinahanglang maghimo ka: 1) usa ka luna sa address aron masugdan ang endpoint sa sistema sa pagmemensahe; 2) adres aron ma-configure ang mga adres nga among gigamit sa aplikasyon; 3) Gumagamit sa pagmemensahe aron itakda ang mga kredensyal sa kliyente.
Lugar sa address
Ang usa ka butang nga AddressSpace sa AMQ Online usa ka grupo sa mga adres nga nag-ambit sa mga endpoint sa koneksyon ug mga palisiya sa pag-authenticate ug pagtugot. Kung maghimo ka usa ka espasyo sa adres, mahimo nimong ipiho kung giunsa ang pagpadayag sa mga endpoint sa pagmemensahe:
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
Mga pakigpulong
Ang mga adres gigamit sa pagpadala ug pagdawat sa mga mensahe. Ang matag adres adunay usa ka tipo, nga nagtino sa mga semantiko niini, ingon man usa ka plano, nga nagtino sa gidaghanon sa mga kapanguhaan nga ireserba. Ang adres mahimong matino, pananglitan, sama niini:
apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
name: quarkus-example.orders
spec:
address: orders
type: queue
plan: brokered-queue
Gumagamit sa pagmemensahe
Aron masiguro nga ang kasaligan nga mga aplikasyon lamang ang makapadala ug makadawat mga mensahe sa imong mga adres, kinahanglan ka maghimo usa ka tiggamit sa sistema sa pagmemensahe. Para sa mga aplikasyon nga nagdagan sa usa ka cluster, ang mga kliyente mahimong ma-authenticate gamit ang OpenShift service account. Ang user "serviceaccount" mahimong ipasabut, pananglitan, sama niini:
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"]
Mga pagtugot sa pag-configure sa aplikasyon
Aron ang AMQ Online makahimo sa configmap nga among gigamit sa pag-embed sa AMQP endpoint nga impormasyon, ang Role ug RoleBinding kinahanglang itakda:
---
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
Giunsa paggamit ang mga pag-configure
Mahimo nimong i-apply ang configuration sa sistema sa pagmemensa sama niini:
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
Pagpamatuod sa aplikasyon
Aron masiguro nga ang aplikasyon nagsugod na, una sa tanan, atong susihon kung ang katugbang nga mga adres nahimo ug aktibo ba:
until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Not yet ready"; sleep 5; done
Dayon atong susihon ang URL sa ruta sa aplikasyon (ablihi lang kini nga adres sa browser):
echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"
Kinahanglang ipakita sa browser nga ang mga tiket gi-update matag karon ug unya samtang ang mga mensahe gipadala ug nadawat sa AMQ Online.
Pagsumada
Mao nga nagsulat kami usa ka aplikasyon sa Quarkus nga naggamit sa AMQP alang sa pagmemensahe, gi-configure ang aplikasyon nga modagan sa plataporma sa Red Hat OpenShift, ug gipatuman ang pag-configure niini base sa pagsumpo sa AMQ Online. Gibuhat dayon namo ang mga manifesto nga gikinahanglan aron masugdan ang sistema sa pagmemensahe para sa among aplikasyon.
Gitapos niini ang serye bahin sa Quarkus, apan adunay daghang bag-o ug makapaikag nga mga butang sa unahan, padayon nga tun-an!
Source: www.habr.com