ΠžΠ±Π»Π°Ρ‡Π½Π° комуникация Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Red Hat OpenShift с ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Quarkus ΠΈ AMQ Online

Π—Π΄Ρ€Π°Π²Π΅ΠΉΡ‚Π΅ Π½Π° всички! Π•Ρ‚ΠΎ Π³ΠΎ – Π½Π°ΡˆΠΈΡΡ‚ Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π΅Π½ пост ΠΎΡ‚ сСрията Π·Π° Quarkus! (ΠœΠ΅ΠΆΠ΄Ρƒ Π΄Ρ€ΡƒΠ³ΠΎΡ‚ΠΎ, Π²ΠΈΠΆΡ‚Π΅ нашия ΡƒΠ΅Π±ΠΈΠ½Π°Ρ€ Β«Π’ΠΎΠ²Π° Π΅ Quarkus – Kubernetes native Java Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΒ». Π©Π΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ ΠΊΠ°ΠΊ Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅Ρ‚Π΅ Β«ΠΎΡ‚ Π½ΡƒΠ»Π°Ρ‚Π°Β» ΠΈΠ»ΠΈ Π΄Π° ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»ΠΈΡ‚Π΅ Π³ΠΎΡ‚ΠΎΠ²ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ)

ΠžΠ±Π»Π°Ρ‡Π½Π° комуникация Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Red Hat OpenShift с ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Quarkus ΠΈ AMQ Online

Π’ ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈΡ пост Ρ€Π°Π·Π³Π»Π΅Π΄Π°Ρ…ΠΌΠ΅ ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π°Ρ‰ΠΈΡ‚Π΅ инструмСнти, с ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ количСствСно Π΄Π° ΠΎΡ†Π΅Π½ΠΈΡ‚Π΅ подобрСнията, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈ Π² Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° модСрнизацията Π½Π° Java прилоТСния.

Π—Π°ΠΏΠΎΡ‡Π²Π°ΠΉΠΊΠΈ ΠΎΡ‚ вСрсия 0.17.0, Quarkus ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Advanced Message Queuing Protocol (AMQP), ΠΊΠΎΠΉΡ‚ΠΎ Π΅ ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ стандарт Π·Π° ΠΏΡ€Π΅Π΄Π°Π²Π°Π½Π΅ Π½Π° бизнСс ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρƒ прилоТСния ΠΈΠ»ΠΈ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Red Hat AMQ Online Π΅ услуга, ΠΈΠ·Π³Ρ€Π°Π΄Π΅Π½Π° Π½Π° Π±Π°Π·Π°Ρ‚Π° Π½Π° отворСния ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ EnMasse ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ Π·Π° ΠΎΠ±ΠΌΠ΅Π½ Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ Π½Π° Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Red Hat OpenShift. ΠŸΠΎΠ²Π΅Ρ‡Π΅ информация Π·Π° Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊ Π΅ структуриран, Π²ΠΈΠΆΡ‚Π΅ Ρ‚ΡƒΠΊ (EN). ДнСс Ρ‰Π΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ ΠΊΠ°ΠΊ Π΄Π° ΡΠ²ΡŠΡ€ΠΆΠ΅ΠΌ AMQ Online ΠΈ Quarkus, Π·Π° Π΄Π° ΠΈΠ·Π³Ρ€Π°Π΄ΠΈΠΌ ΠΌΠΎΠ΄Π΅Ρ€Π½Π° систСма Π·Π° ΠΎΠ±ΠΌΠ΅Π½ Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ Π½Π° Π±Π°Π·Π°Ρ‚Π° Π½Π° OpenShift, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Π΄Π²Π΅ Π½ΠΎΠ²ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ, ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ с ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π° Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π° сС, Ρ‡Π΅ Π²Π΅Ρ‡Π΅ стС Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠΈΠ»ΠΈ AMQ Online Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° OpenShift (Π°ΠΊΠΎ Π½Π΅, Π²ΠΈΠΆΡ‚Π΅ Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎΡ‚ΠΎ Π·Π° инсталиранС).

ΠŸΡŠΡ€Π²ΠΎ Ρ‰Π΅ създадСм прилоТСния Quarkus, ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‰Π΅ прСдставлява проста систСма Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° заявки, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‰Π° Ρ€Π΅Π°ΠΊΡ‚ΠΈΠ²Π΅Π½ ΠΎΠ±ΠΌΠ΅Π½ Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ. Π’ΠΎΠ²Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‰Π΅ Π²ΠΊΠ»ΡŽΡ‡Π²Π° Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π° заявки, ΠΊΠΎΠΉΡ‚ΠΎ ΠΈΠ·ΠΏΡ€Π°Ρ‰Π° заявки Π² опашка Π·Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ Π½Π° фиксиран ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π½Π° заявки, ΠΊΠΎΠΉΡ‚ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ ΠΎΡ‚ ΠΎΠΏΠ°ΡˆΠΊΠ°Ρ‚Π° ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° ΠΏΠΎΡ‚Π²ΡŠΡ€ΠΆΠ΄Π΅Π½ΠΈΡ, Π΄ΠΎΡΡ‚ΡŠΠΏΠ½ΠΈ Π·Π° ΠΏΡ€Π΅Π³Π»Π΅Π΄ Π² Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π°.

Π‘Π»Π΅Π΄ ΡΡŠΠ·Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Ρ‰Π΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ ΠΊΠ°ΠΊ Π΄Π° Π²Π½Π΅Π΄Ρ€ΠΈΡ‚Π΅ конфигурацията Π½Π° систСмата Π·Π° ΠΎΠ±ΠΌΠ΅Π½ Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ ΠΈ Ρ‰Π΅ задСйствамС AMQ Online, Π·Π° Π΄Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈΡ‚Π΅ рСсурси.

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Quarkus

ΠΠ°ΡˆΠ΅Ρ‚ΠΎ Quarkus ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ Π½Π° OpenShift ΠΈ прСдставлява ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½Π° вСрсия Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° amqp-quickstart. ПълСн ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° клиСнтската част ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Ρ‚ΡƒΠΊ.

Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π° заявки

Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΡŠΡ‚ Π½Π° заявки просто ΠΈΠ·ΠΏΡ€Π°Ρ‰Π° растящи ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΈ Π½Π° заявки Π½Π° адрСса Β«ordersΒ» Π½Π° всСки 5 сСкунди.

@ApplicationScoped
public class OrderGenerator {
 
    private int orderId = 1;
 
    @Outgoing("orders")
    public Flowable generate() {
        return Flowable.interval(5, TimeUnit.SECONDS)
        .map(tick -> orderId++);
    }
}

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π½Π° заявки

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡŠΡ‚ Π½Π° заявки Π΅ Π΄ΠΎΡ€ΠΈ ΠΏΠΎ-лСсСн, просто Π²Ρ€ΡŠΡ‰Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° Π½Π° ΠΏΠΎΡ‚Π²ΡŠΡ€ΠΆΠ΄Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° адрСса Β«confirmationsΒ».

@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;
    }
}

РСсурси Π·Π° ΠΏΠΎΡ‚Π²ΡŠΡ€ΠΆΠ΄Π΅Π½ΠΈΠ΅

Π Π΅ΡΡƒΡ€ΡΡŠΡ‚ Π·Π° ΠΏΠΎΡ‚Π²ΡŠΡ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π΅ ΠΊΡ€Π°ΠΉΠ½Π° Ρ‚ΠΎΡ‡ΠΊΠ° HTTP Π·Π° изброяванС Π½Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½ΠΈΡ‚Π΅ ΠΎΡ‚ Π½Π°ΡˆΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚Π²ΡŠΡ€ΠΆΠ΄Π΅Π½ΠΈΡ.

@Path("/confirmations")
public class ConfirmationResource {
 
    @Inject
    @Stream("confirmations") Publisher orders;
 
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return "hello";
    }
 
 
    @GET
    @Path("/stream")
    @Produces(MediaType.SERVER_SENT_EVENTS)
    public Publisher stream() {
        return orders;
    }
}

Настройка

Π—Π° ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅ с AMQ Online, Π½Π°ΡˆΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‰Π΅ изисква ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ Π΄Π°Π½Π½ΠΈ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ: конфигурация Π½Π° Quarkus ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€Π°, информация Π·Π° ΠΊΡ€Π°ΠΉΠ½Π°Ρ‚Π° Ρ‚ΠΎΡ‡ΠΊΠ° AMQP ΠΈ клиСнтски ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½ΠΈ Π΄Π°Π½Π½ΠΈ. Най-Π΄ΠΎΠ±Ρ€Π΅ Π΅, Ρ€Π°Π·Π±ΠΈΡ€Π° сС, Π΄Π° Π΄ΡŠΡ€ΠΆΠΈΡ‚Π΅ всичкитС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ Π΄Π°Π½Π½ΠΈ Π½Π° Π΅Π΄Π½ΠΎ място, Π½ΠΎ Π½ΠΈΠ΅ Ρ‰Π΅ Π³ΠΈ Ρ€Π°Π·Π΄Π΅Π»ΠΈΠΌ, Π·Π° Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈΡ‚Π΅ Π·Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Quarkus.

ΠšΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΠΈ

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡΡ‚Π° Π½Π° ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€Π° ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС прСдоставСна Π½Π° Π΅Ρ‚Π°ΠΏ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π΅ Ρ‡Ρ€Π΅Π· Ρ„Π°ΠΉΠ» с прилоТСния свойства:

mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp

Π—Π° Π΄Π° Π½Π΅ услоТнявамС ситуацията, Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ опашка Π·Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ само Π·Π° адрСса "orders". ΠΠ΄Ρ€Π΅ΡΡŠΡ‚ "confirmations" Π² Π½Π°ΡˆΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° опашка Π² ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π°.

ΠšΡ€Π°ΠΉΠ½Π° Ρ‚ΠΎΡ‡ΠΊΠ° AMQP

На Π΅Ρ‚Π°ΠΏ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π΅ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° хоста ΠΈ Π½ΠΎΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° ΠΏΠΎΡ€Ρ‚Π° Π·Π° ΠΊΡ€Π°ΠΉΠ½Π°Ρ‚Π° Ρ‚ΠΎΡ‡ΠΊΠ° AMQP са нСизвСстни, Π·Π°Ρ‚ΠΎΠ²Π° трябва Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΈΠ½ΠΆΠ΅ΠΊΡ‚ΠΈΡ€Π°Π½ΠΈ. ΠšΡ€Π°ΠΉΠ½Π°Ρ‚Π° Ρ‚ΠΎΡ‡ΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Π·Π°Π΄Π°Π΄Π΅Π½Π° Π² configmap, ΠΊΠΎΠΉΡ‚ΠΎ сС създава ΠΎΡ‚ AMQ Online, Π·Π°Ρ‚ΠΎΠ²Π° Ρ‰Π΅ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°ΠΌΠ΅ тях Ρ‡Ρ€Π΅Π· ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° срСдата Π² манифСста Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ:

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

Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½ΠΈ Π΄Π°Π½Π½ΠΈ

ΠœΠ°Ρ€ΠΊΠ΅Ρ€ΡŠΡ‚ Π½Π° слуТСбната смСтка ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ Π·Π° удостовСряванС Π½Π° Π½Π°ΡˆΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² OpenShift. Π—Π° Ρ†Π΅Π»Ρ‚Π° ΠΏΡŠΡ€Π²ΠΎ трябва Π΄Π° ΡΡŠΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ потрСбитСлски ConfigSource, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π° ΠΌΠ°Ρ€ΠΊΠ΅Ρ€Π° Π·Π° удостовСряванС ΠΎΡ‚ Ρ„Π°ΠΉΠ»ΠΎΠ²Π°Ρ‚Π° систСма Π½Π° pod-Π°:

ΠΏΡƒΠ±Π»ΠΈΡ‡Π΅Π½ клас MessagingCredentialsConfigSource Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π° ConfigSource {
    частСн статичСн Ρ„ΠΈΠ½Π°Π» Set propertyNames;
 
    статичСн {
        propertyNames = Π½ΠΎΠ² HashSet();
        propertyNames.add("amqp-username");
        propertyNames.add("amqp-password");
    }
 
    @Override
    ΠΏΡƒΠ±Π»ΠΈΡ‡Π΅Π½ Set getPropertyNames() {
        Π²ΡŠΡ€Π½ΠΈ propertyNames;
    }
 
    @Override
    ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Π° Map getProperties() {
        ΠΎΠΏΠΈΡ‚Π°ΠΉ {
            Map properties = Π½ΠΎΠ² HashMap();
            properties.put("amqp-username", "@@serviceaccount@@");
            properties.put("amqp-password", readTokenFromFile());
            Π²ΡŠΡ€Π½ΠΈ properties;
        } Ρ…Π²Π°Ρ‰Π°ΠΌ (IOException e) {
            Ρ…Π²ΡŠΡ€Π»ΠΈ Π½ΠΎΠ² UncheckedIOException(e);
        }
    }
 
    @Override
    ΠΏΡƒΠ±Π»ΠΈΡ‡Π΅Π½ String getValue(String key) {
        Π°ΠΊΠΎ ("amqp-username".equals(key)) {
            Π²ΡŠΡ€Π½ΠΈ "@@serviceaccount@@";
        }
        Π°ΠΊΠΎ ("amqp-password".equals(key)) {
            ΠΎΠΏΠΈΡ‚Π°ΠΉ {
                Π²ΡŠΡ€Π½ΠΈ readTokenFromFile();
            } Ρ…Π²Π°Ρ‰Π°ΠΌ (IOException e) {
                Ρ…Π²ΡŠΡ€Π»ΠΈ Π½ΠΎΠ² UncheckedIOException(e);
            }
        }
        Π²ΡŠΡ€Π½ΠΈ null;
    }
 
    @Override
    ΠΏΡƒΠ±Π»ΠΈΡ‡Π΅Π½ String getName() {
        Π²ΡŠΡ€Π½ΠΈ "messaging-credentials-config";
    }
 
    частСн статичСн String readTokenFromFile() Ρ…Π²ΡŠΡ€Π»Ρ IOException {
        Π²ΡŠΡ€Π½ΠΈ Π½ΠΎΠ² String(Files.readAllBytes(Paths.get("/var/run/secrets/kubernetes.io/serviceaccount/token")), StandardCharsets.UTF_8);
    }
}

БглобяванС ΠΈ Ρ€Π°Π·Π³Ρ€ΡŠΡ‰Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ

Въй ΠΊΠ°Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ трябва Π΄Π° бъдС скомпилирано Π² изпълнима ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°, Ρ‰Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° машина GraalVM. ΠŸΠΎΠ²Π΅Ρ‡Π΅ информация Π·Π° настройванС Π½Π° срСда ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π² ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΈΡ‚Π΅ инструкции Π² Π ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎ Π½Π° Quarkus.

Π‘Π»Π΅Π΄Π²Π°ΠΉΠΊΠΈ инструкциитС Ρ‚Π°ΠΌ, трябва Π΄Π° свалитС сорс ΠΊΠΎΠ΄Π°, Π΄Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠΈΡ‚Π΅ сглобяванС ΠΈ Π΄Π° Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅ Π½Π°ΡˆΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:

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

Π‘Π»Π΅Π΄ Ρ‚Π΅Π·ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Ρ‰Π΅ бъдС Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΎ, Π½ΠΎ няма Π΄Π° сС стартира, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ Π½Π΅ настроим Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈΡ‚Π΅ рСсурси Π·Π° ΠΎΠ±ΠΌΠ΅Π½ Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ Π² AMQ Online.

Настройка Π½Π° систСмата Π·Π° ΠΎΠ±ΠΌΠ΅Π½ Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ

Π‘Π΅Π³Π° остава Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΠΌ Π² систСмата Π·Π° ΠΎΠ±ΠΌΠ΅Π½ Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ рСсурситС, ΠΎΡ‚ ΠΊΠΎΠΈΡ‚ΠΎ сС Π½ΡƒΠΆΠ΄Π°Π΅ Π½Π°ΡˆΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π—Π° Ρ‚ΠΎΠ²Π° Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° създадСм: 1) адрСсно пространство, Π·Π° Π΄Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ ΠΊΡ€Π°ΠΉΠ½Π°Ρ‚Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° систСмата Π·Π° ΠΎΠ±ΠΌΠ΅Π½ Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ; 2) адрСс, Π·Π° Π΄Π° настроим адрСситС, ΠΊΠΎΠΈΡ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ; 3) ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» Π½Π° систСмата Π·Π° ΠΎΠ±ΠΌΠ΅Π½ Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ, Π·Π° Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.

АдрСсно пространство

ΠžΠ±Π΅ΠΊΡ‚ΡŠΡ‚ AddressSpace Π² AMQ Online прСдставлява Π³Ρ€ΡƒΠΏΠ° адрСси, ΠΊΠΎΠΈΡ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ ΡΡŠΠ²ΠΌΠ΅ΡΡ‚Π½ΠΎ ΠΊΡ€Π°ΠΉΠ½ΠΈΡ‚Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ Π½Π° ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Π·Π° удостовСряванС ΠΈ авторизация. ΠŸΡ€ΠΈ ΡΡŠΠ·Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° адрСсно пространство ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π·Π°Π΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠ°ΠΊ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ прСдоставСни ΠΊΡ€Π°ΠΉΠ½ΠΈΡ‚Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ Π½Π° систСмата Π·Π° ΠΎΠ±ΠΌΠ΅Π½ Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ:

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

АдрСс

АдрСситС сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π·Π° ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Π½Π΅ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ. ВсСки адрСс ΠΈΠΌΠ° Ρ‚ΠΈΠΏ, ΠΊΠΎΠΉΡ‚ΠΎ опрСдСля сСмантиката ΠΌΡƒ, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ ΠΏΠ»Π°Π½, ΠΊΠΎΠΉΡ‚ΠΎ Π·Π°Π΄Π°Π²Π° количСството Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€Π°Π½ΠΈ рСсурси. АдрСс ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎ слСдния Π½Π°Ρ‡ΠΈΠ½:

apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
  name: quarkus-example.orders
spec:
  address: orders
  type: queue
  plan: brokered-queue

ΠŸΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» Π½Π° систСмата Π·Π° ΠΎΠ±ΠΌΠ΅Π½ Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ

Π—Π° Π΄Π° ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Ρ‚Π΅ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Ρ‚Π΅ ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ Π½Π° Π²Π°ΡˆΠΈΡ‚Π΅ адрСси само Ρ‡Ρ€Π΅Π· Π΄ΠΎΠ²Π΅Ρ€Π΅Π½ΠΈ прилоТСния, Π² систСмата Π·Π° ΠΎΠ±ΠΌΠ΅Π½ Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΡŠΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π». Π—Π° прилоТСния, Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰ΠΈ Π² кластСра, ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΈΡ‚Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ удостовСрСни с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Π°ΠΊΠ°ΡƒΠ½Ρ‚Π° Π·Π° услуги Π½Π° OpenShift. ΠŸΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡΡ‚ Β«serviceaccountΒ» ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎ слСдния Π½Π°Ρ‡ΠΈΠ½:

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"]

Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ

Π—Π° Π΄Π° ΠΌΠΎΠΆΠ΅ AMQ Online Π΄Π° създадС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ‚ΠΎΡ€, ΠΊΠΎΠΉΡ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ…ΠΌΠ΅ Π·Π° внСдряванС Π½Π° свСдСния Π·Π° ΠΊΡ€Π°ΠΉΠ½Π°Ρ‚Π° Ρ‚ΠΎΡ‡ΠΊΠ° AMQP, Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° Π·Π°Π΄Π°Π΄Π΅Ρ‚Π΅ роля ΠΈ ΠΏΡ€ΠΈΠ²ΡŠΡ€Π·Π²Π°Π½Π΅ Π½Π° роля (Role ΠΈ 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

Как Π΄Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈΡ‚Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡΡ‚Π° Π½Π° систСмата Π·Π° ΠΎΠ±ΠΌΠ΅Π½ Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½Π° ΠΏΠΎ слСдния Π½Π°Ρ‡ΠΈΠ½:

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

ВСрификация Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ

Π—Π° Π΄Π° сС ΡƒΠ²Π΅Ρ€ΠΈΠΌ, Ρ‡Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π΅ стартирано, ΠΏΡŠΡ€Π²ΠΎ Ρ‰Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ Π΄Π°Π»ΠΈ ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΈΡ‚Π΅ адрСси са създадСни ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΈ:

until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Not yet ready"; sleep 5; done

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Ρ‰Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ URL адрСса Π½Π° ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Π° Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ (просто Ρ‰Π΅ ΠΎΡ‚Π²ΠΎΡ€ΠΈΠΌ Ρ‚ΠΎΠ·ΠΈ адрСс Π² Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π°):

echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"

Π’ Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π° трябва Π΄Π° сС Π²ΠΈΠΆΠ΄Π°, Ρ‡Π΅ Π±ΠΈΠ»Π΅Ρ‚ΠΈΡ‚Π΅ сС Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π½ΠΎ, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡΡ‚Π° сС ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Ρ‚ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Ρ‚ ΠΎΡ‚ AMQ Online.

ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅

И Ρ‚Π°ΠΊΠ°, написахмС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Quarkus, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° AMQP Π·Π° ΠΎΠ±ΠΌΠ΅Π½ Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ, настроихмС Ρ‚ΠΎΠ²Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Red Hat OpenShift, ΠΈ ΡΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° Π²Π½Π΅Π΄Ρ€ΠΈΡ…ΠΌΠ΅ конфигурацията ΠΌΡƒ Π½Π° Π±Π°Π·Π°Ρ‚Π° Π½Π° конфигурацията AMQ Online. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° ΡΡŠΠ·Π΄Π°Π΄ΠΎΡ…ΠΌΠ΅ манифСсти, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° систСмата Π·Π° ΠΎΠ±ΠΌΠ΅Π½ Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ Π·Π° Π½Π°ΡˆΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

Π‘ Ρ‚ΠΎΠ²Π° Π·Π°Π²ΡŠΡ€ΡˆΠ²Π°ΠΌΠ΅ сСрията Π·Π° Quarkus, Π½ΠΎ Π² Π±ΡŠΠ΄Π΅Ρ‰Π΅ прСдстоят ΠΌΠ½ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΈ ΠΈ интСрСсни Π½Π΅Ρ‰Π°, оставайтС с нас!

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster