Ola a todos! Aquí está a nosa publicación final da serie Quarkus! (Por certo, mira o noso webinar
В
Desde a versión 0.17.0,
Suponse que xa implantou AMQ Online na plataforma OpenShift (se non, consulte
Para comezar, crearemos unha aplicación Quarkus que será un simple sistema de procesamento de pedidos mediante mensaxería reactiva. Esta aplicación incluirá un xerador de pedidos que envía pedidos a unha cola de mensaxes nun intervalo fixo, así como un procesador de pedidos que procesará as mensaxes da cola e xerará confirmacións visibles no navegador.
Unha vez que creamos a aplicación, mostrarémosche como inserir a configuración do sistema de mensaxería na aplicación e usar AMQ Online para proporcionar os recursos que necesitamos no sistema.
Aplicacion Quarkus
A nosa aplicación Quarkus execútase en OpenShift e é unha versión modificada do programa
Xerador de pedidos
O xerador simplemente envía monótonamente ID de pedidos crecentes ao enderezo de "pedidos" cada 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++);
}
}
Procesador de pedidos
O controlador de pedidos é aínda máis sinxelo, só devolve un ID de confirmación ao enderezo de "confirmacións".
@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ón
O recurso de confirmación é un punto final HTTP para listar as confirmacións xeradas pola nosa aplicación.
@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;
}
}
axuste
Para conectarse a AMQ Online, a nosa aplicación necesitará algúns datos de configuración, a saber: configuración do conector Quarkus, información do punto final de AMQP e credenciais do cliente. Por suposto, é mellor manter todos os datos de configuración nun só lugar, pero separarémolos deliberadamente para mostrar as posibles opcións para configurar a aplicación Quarkus.
Conectores
A configuración do conector pódese proporcionar no momento da compilación mediante un ficheiro de propiedades da aplicación:
mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp
Para simplificar as cousas, só usaremos unha fila de mensaxes para o enderezo de "pedidos". E o enderezo de "confirmacións" da nosa aplicación utilizará unha cola na memoria.
Punto final de AMQP
No momento da compilación, o nome de host e o número de porto para o punto final AMQP son descoñecidos, polo que deben ser inxectados. O punto final pódese establecer no mapa de configuración creado por AMQ Online, polo que os definiremos mediante variables de ambiente no manifesto da aplicación:
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
Credenciais
O token da conta de servizo pódese usar para autenticar a nosa aplicación en OpenShift. Para iso, primeiro debes crear un ConfigSource personalizado que lerá o token de autenticación do sistema de ficheiros do 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);
}
}
Construír e implementar a aplicación
Dado que a aplicación debe compilarse nun ficheiro executable, é necesaria unha máquina virtual GraalVM. Para obter máis información sobre como configurar un ambiente para iso, consulte as instrucións correspondentes en
Despois, seguindo as instrucións indicadas alí, cómpre descargar a fonte, construír e implementar a nosa aplicación:
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
Despois destes comandos, a aplicación despregarase, pero non se iniciará ata que configuremos os recursos de mensaxería que necesitamos en AMQ Online.
Configurar o sistema de mensaxería
Agora só queda configurar os recursos que precisa a nosa aplicación no sistema de mensaxería. Para iso, cómpre crear: 1) un espazo de enderezos para inicializar o punto final do sistema de mensaxería; 2) enderezo para configurar os enderezos que usamos na aplicación; 3) Usuario de mensaxería para establecer as credenciais do cliente.
Espazo de enderezos
Un obxecto AddressSpace en AMQ Online é un grupo de enderezos que comparten puntos finais de conexión e políticas de autenticación e autorización. Cando creas un espazo de enderezos, podes especificar como se expoñerán os puntos finais de mensaxería:
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
Direccións
Os enderezos utilízanse para enviar e recibir mensaxes. Cada enderezo ten un tipo, que determina a súa semántica, así como un plan, que especifica o número de recursos a reservar. O enderezo pódese determinar, por exemplo, así:
apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
name: quarkus-example.orders
spec:
address: orders
type: queue
plan: brokered-queue
Usuario de mensaxería
Para garantir que só as aplicacións de confianza poidan enviar e recibir mensaxes aos teus enderezos, debes crear un usuario no sistema de mensaxería. Para as aplicacións que se executan nun clúster, os clientes pódense autenticar mediante unha conta de servizo OpenShift. A "conta de servizo" do usuario pódese definir, por exemplo, así:
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 para configurar a aplicación
Para que AMQ Online cree o mapa de configuración que utilizamos para incorporar a información do punto final de AMQP, debe establecerse o Role e 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
Como aplicar as configuracións
Podes aplicar a configuración do sistema de mensaxería deste xeito:
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ón da aplicación
Para asegurarnos de que a aplicación se iniciou, comprobamos, en primeiro lugar, se os enderezos correspondentes foron creados e están activos:
until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Not yet ready"; sleep 5; done
A continuación, comprobemos o URL da ruta da aplicación (só abre este enderezo no navegador):
echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"
O navegador debería mostrar que os tickets se actualizan periodicamente a medida que AMQ Online envía e recibe mensaxes.
Resumindo
Entón, escribimos unha aplicación Quarkus que usa AMQP para a mensaxería, configuramos a aplicación para que se executase na plataforma Red Hat OpenShift e implementamos a súa configuración baseada na configuración de AMQ Online. Despois creamos os manifestos necesarios para inicializar o sistema de mensaxería para a nosa aplicación.
Así remata a serie sobre Quarkus, pero hai moitas cousas novas e interesantes por diante, estade atentos!
Fonte: www.habr.com