Sveiki visiem! Šeit tas ir - mūsu pēdējais ieraksts Quarkus sērijā! (Starp citu, skatieties mūsu vebināru
В
Kopš versijas 0.17.0,
Tiek pieņemts, ka esat jau izvietojis AMQ Online platformā OpenShift (ja nē, skatiet
Lai sāktu, mēs izveidosim Quarkus lietojumprogrammu, kas būs vienkārša pasūtījumu apstrādes sistēma, izmantojot reaktīvo ziņojumapmaiņu. Šajā lietojumprogrammā būs iekļauts pasūtījumu ģenerators, kas ar noteiktu intervālu nosūta pasūtījumus uz ziņojumu rindu, kā arī pasūtījumu apstrādātājs, kas apstrādās ziņojumus no rindas un ģenerēs pārlūkprogrammā skatāmus apstiprinājumus.
Kad lietojumprogramma būs izveidota, mēs jums parādīsim, kā lietojumprogrammā iegult ziņojumapmaiņas sistēmas konfigurāciju un izmantot AMQ Online, lai nodrošinātu sistēmā mums nepieciešamos resursus.
Quarkus lietotne
Mūsu Quarkus lietojumprogramma darbojas ar OpenShift un ir modificēta programmas versija
Pasūtījumu ģenerators
Ģenerators ik pēc 5 sekundēm vienkārši monotoni nosūta pieaugošo pasūtījumu ID uz “pasūtījumu” adresi.
@ApplicationScoped
public class OrderGenerator {
private int orderId = 1;
@Outgoing("orders")
public Flowable<Integer> generate() {
return Flowable.interval(5, TimeUnit.SECONDS)
.map(tick -> orderId++);
}
}
Pasūtījumu apstrādātājs
Pasūtījumu apstrādātājs ir vēl vienkāršāks, tas tikai atgriež apstiprinājuma ID uz "apstiprinājumu" adresi.
@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;
}
}
Apstiprinājuma resursi
Apstiprinājuma resurss ir HTTP galapunkts mūsu lietojumprogrammas ģenerēto apstiprinājumu uzskaitīšanai.
@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;
}
}
koriģēšana
Lai izveidotu savienojumu ar AMQ Online, mūsu lietojumprogrammai būs nepieciešami daži konfigurācijas dati, proti: Quarkus savienotāja konfigurācija, AMQP galapunkta informācija un klienta akreditācijas dati. Labāk, protams, visus konfigurācijas datus glabāt vienuviet, taču mēs tos apzināti atdalīsim, lai parādītu iespējamās iespējas Quarkus aplikācijas konfigurēšanai.
Savienotāji
Savienotāja konfigurāciju var nodrošināt kompilēšanas laikā, izmantojot lietojumprogrammas rekvizītu failu:
mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp
Lai lietas būtu vienkāršas, mēs izmantosim tikai ziņojumu rindu "pasūtījumu" adresei. Un “apstiprinājumu” adrese mūsu lietojumprogrammā izmantos rindu atmiņā.
AMQP galapunkts
Kompilēšanas laikā AMQP galapunkta resursdatora nosaukums un porta numurs nav zināmi, tāpēc tie ir jāievada. Gala punktu var iestatīt AMQ Online izveidotajā konfigurācijas kartē, tāpēc mēs tos definēsim, izmantojot vides mainīgos lietojumprogrammas manifestā:
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
Akreditācijas dati
Pakalpojuma konta pilnvaru var izmantot, lai autentificētu mūsu lietojumprogrammu OpenShift. Lai to izdarītu, vispirms ir jāizveido pielāgots ConfigSource, kas nolasīs autentifikācijas pilnvaru no pod failu sistēmas:
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);
}
}
Izveidojiet un izvietojiet lietojumprogrammu
Tā kā lietojumprogramma ir jāapkopo izpildāmā failā, ir nepieciešama GraalVM virtuālā mašīna. Sīkāku informāciju par vides iestatīšanu skatiet attiecīgajās instrukcijās
Pēc tam, izpildot tur sniegtos norādījumus, jums ir jālejupielādē avots, jāizveido un jāizvieto mūsu lietojumprogramma:
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ēc šīm komandām lietojumprogramma tiks izvietota, taču tā netiks startēta, kamēr mēs nekonfigurēsim nepieciešamos ziņojumapmaiņas resursus pakalpojumā AMQ Online.
Ziņojumapmaiņas sistēmas iestatīšana
Tagad atliek tikai iestatīt mūsu lietojumprogrammai nepieciešamos resursus ziņojumapmaiņas sistēmā. Lai to izdarītu, ir jāizveido: 1) adrešu telpa ziņojumapmaiņas sistēmas galapunkta inicializācijai; 2) adrese, lai konfigurētu adreses, kuras izmantojam aplikācijā; 3) Ziņojumapmaiņas lietotājs, lai iestatītu klienta akreditācijas datus.
Adreses telpa
AddressSpace objekts pakalpojumā AMQ Online ir adrešu grupa, kas koplieto savienojuma galapunktus un autentifikācijas un autorizācijas politikas. Kad veidojat adrešu telpu, varat norādīt, kā tiks parādīti ziņojumapmaiņas galapunkti.
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
Adreses
Adreses tiek izmantotas, lai nosūtītu un saņemtu ziņas. Katrai adresei ir tips, kas nosaka tās semantiku, kā arī plāns, kurā norādīts rezervējamo resursu skaits. Adresi var noteikt, piemēram, šādi:
apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
name: quarkus-example.orders
spec:
address: orders
type: queue
plan: brokered-queue
Ziņapmaiņas lietotājs
Lai nodrošinātu, ka tikai uzticamas programmas var nosūtīt un saņemt ziņojumus uz jūsu adresēm, jums ir jāizveido lietotājs ziņojumapmaiņas sistēmā. Programmām, kas darbojas klasterī, klientus var autentificēt, izmantojot OpenShift pakalpojuma kontu. Lietotāju "servisa konts" var definēt, piemēram, šādi:
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"]
Atļaujas lietojumprogrammas konfigurēšanai
Lai AMQ Online izveidotu konfigurācijas karti, ko izmantojām AMQP galapunkta informācijas iegulšanai, ir jāiestata loma un lomu saistīšana:
---
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
Kā lietot konfigurācijas
Varat lietot ziņojumapmaiņas sistēmas konfigurāciju šādi:
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
Lietojumprogrammas pārbaude
Lai pārliecinātos, ka lietojumprogramma ir sākusies, vispirms pārbaudīsim, vai ir izveidotas un ir aktīvas atbilstošās adreses:
until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Not yet ready"; sleep 5; done
Pēc tam pārbaudīsim lietojumprogrammas maršruta URL (vienkārši atveriet šo adresi pārlūkprogrammā):
echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"
Pārlūkprogrammai ir jāparāda, ka biļetes tiek periodiski atjauninātas, kad AMQ Online nosūta un saņem ziņojumus.
Apkopojot
Tāpēc mēs uzrakstījām Quarkus lietojumprogrammu, kas ziņojumapmaiņai izmanto AMQP, konfigurējām lietojumprogrammu, lai tā darbotos Red Hat OpenShift platformā, un ieviesām tās konfigurāciju, pamatojoties uz AMQ Online konfigurāciju. Pēc tam mēs izveidojām manifestus, kas nepieciešami mūsu lietojumprogrammas ziņojumapmaiņas sistēmas inicializācijai.
Ar to sērija par Quarkus noslēdzas, taču priekšā ir daudz jauna un interesanta, sekojiet līdzi!
Avots: www.habr.com