Hola a tots! Aquí està: la nostra publicació final de la sèrie Quarkus! (Per cert, mireu el nostre seminari web
В
Des de la versió 0.17.0,
Se suposa que ja heu implementat AMQ Online a la plataforma OpenShift (si no, consulteu
Per començar, crearem una aplicació Quarkus que serà un sistema senzill de processament de comandes mitjançant missatgeria reactiva. Aquesta aplicació inclourà un generador de comandes que envia comandes a una cua de missatges a un interval fix, així com un processador de comandes que processarà els missatges de la cua i generarà confirmacions visualitzables al navegador.
Un cop hàgim creat l'aplicació, us mostrarem com inserir la configuració del sistema de missatgeria a l'aplicació i utilitzar AMQ Online per subministrar els recursos que necessitem al sistema.
Aplicació Quarkus
La nostra aplicació Quarkus s'executa a OpenShift i és una versió modificada del programa
Generador de comandes
El generador simplement envia monòtonament identificadors de comandes creixents a l'adreça de "comandes" cada 5 segons.
@ApplicationScoped
public class OrderGenerator {
private int orderId = 1;
@Outgoing("orders")
public Flowable<Integer> generate() {
return Flowable.interval(5, TimeUnit.SECONDS)
.map(tick -> orderId++);
}
}
Processador de comandes
El gestor de comandes és encara més senzill, només retorna un identificador de confirmació a l'adreça de "confirmacions".
@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;
}
}
Recursos de confirmació
El recurs de confirmació és un punt final HTTP per llistar les confirmacions generades per la nostra aplicació.
@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;
}
}
ajust
Per connectar-se a AMQ Online, la nostra aplicació necessitarà algunes dades de configuració, a saber: configuració del connector Quarkus, informació del punt final AMQP i credencials del client. Per descomptat, és millor mantenir totes les dades de configuració en un sol lloc, però les separarem deliberadament per mostrar les possibles opcions per configurar l'aplicació Quarkus.
Connectors
La configuració del connector es pot proporcionar en temps de compilació mitjançant un fitxer de propietats de l'aplicació:
mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp
Per simplificar les coses, només utilitzarem una cua de missatges per a l'adreça de "comandes". I l'adreça de "confirmacions" de la nostra aplicació utilitzarà una cua a la memòria.
Punt final AMQP
En el moment de la compilació, el nom d'amfitrió i el número de port del punt final AMQP són desconeguts, de manera que s'han d'injectar. El punt final es pot configurar al mapa de configuració que ha creat AMQ Online, de manera que els definirem mitjançant variables d'entorn al manifest de l'aplicació:
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
Credencials
El testimoni del compte de servei es pot utilitzar per autenticar la nostra aplicació a OpenShift. Per fer-ho, primer heu de crear un ConfigSource personalitzat que llegirà el testimoni d'autenticació del sistema de fitxers del 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);
}
}
Crear i desplegar l'aplicació
Com que l'aplicació s'ha de compilar en un fitxer executable, cal una màquina virtual GraalVM. Per obtenir més informació sobre com configurar un entorn per a això, consulteu les instruccions corresponents a
A continuació, seguint les instruccions que s'hi donen, heu de descarregar la font, crear i desplegar la nostra aplicació:
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
Després d'aquestes ordres, l'aplicació es desplegarà, però no s'iniciarà fins que no configurem els recursos de missatgeria que necessitem a AMQ Online.
Configuració del sistema de missatgeria
Ara només queda configurar els recursos que necessita la nostra aplicació al sistema de missatgeria. Per fer-ho, heu de crear: 1) un espai d'adreces per inicialitzar el punt final del sistema de missatgeria; 2) adreça per configurar les adreces que utilitzem a l'aplicació; 3) Usuari de missatgeria per establir les credencials del client.
Espai d'adreces
Un objecte AddressSpace a AMQ Online és un grup d'adreces que comparteixen punts finals de connexió i polítiques d'autenticació i autorització. Quan creeu un espai d'adreces, podeu especificar com s'exposaran els punts finals de missatgeria:
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
Adreces
Les adreces s'utilitzen per enviar i rebre missatges. Cada adreça té un tipus, que en determina la semàntica, així com un pla, que especifica el nombre de recursos a reservar. L'adreça es pot determinar, per exemple, així:
apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
name: quarkus-example.orders
spec:
address: orders
type: queue
plan: brokered-queue
Usuari de missatgeria
Per assegurar-vos que només les aplicacions de confiança poden enviar i rebre missatges a les vostres adreces, heu de crear un usuari al sistema de missatgeria. Per a les aplicacions que s'executen en un clúster, els clients es poden autenticar mitjançant un compte de servei OpenShift. El "compte de servei" d'usuari es pot definir, per exemple, així:
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"]
Permisos per configurar l'aplicació
Perquè AMQ Online creï el mapa de configuració que hem utilitzat per incrustar la informació del punt final d'AMQP, s'han d'establir Role i 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
Com aplicar configuracions
Podeu aplicar la configuració del sistema de missatgeria així:
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
Verificació de l'aplicació
Per assegurar-nos que l'aplicació s'ha iniciat, en primer lloc, comprovem si les adreces corresponents s'han creat i estan actives:
until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Not yet ready"; sleep 5; done
A continuació, comprovem l'URL de la ruta de l'aplicació (només obriu aquesta adreça al navegador):
echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"
El navegador hauria de mostrar que les entrades s'actualitzen periòdicament a mesura que AMQ Online envia i rep missatges.
En resum
Així que vam escriure una aplicació Quarkus que utilitza AMQP per a la missatgeria, vam configurar l'aplicació perquè s'executi a la plataforma Red Hat OpenShift i vam implementar la seva configuració basada en la configuració d'AMQ Online. Després vam crear els manifests necessaris per inicialitzar el sistema de missatgeria per a la nostra aplicació.
Això conclou la sèrie sobre Quarkus, però hi ha moltes coses noves i interessants per endavant, estigueu atents!
Font: www.habr.com