Quarkus рдЖрдгрд┐ AMQ рдСрдирд▓рд╛рдЗрди рд╡рд╛рдкрд░реВрди Red Hat OpenShift рдкреНрд▓реЕрдЯрдлреЙрд░реНрдорд╡рд░ рдХреНрд▓рд╛рдЙрдб-рдиреЗрдЯрд┐рд╡реНрд╣ рдореЗрд╕реЗрдЬрд┐рдВрдЧ

рд╕рд░реНрд╡рд╛рдВрдирд╛ рдирдорд╕реНрдХрд╛рд░! рд╣реЗ рдЖрд╣реЗ - рдХреНрд╡рд╛рд░реНрдХрд╕ рдорд╛рд▓рд┐рдХреЗрддреАрд▓ рдЖрдордЪреА рдЕрдВрддрд┐рдо рдкреЛрд╕реНрдЯ! (рддрд╕реЗ, рдЖрдордЪрд╛ рд╡реЗрдмрд┐рдирд╛рд░ рдкрд╣рд╛ "рд╣рд╛ рдХреНрд╡рд╛рд░реНрдХрд╕ рдЖрд╣реЗ - рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдиреЗрдЯрд┐рд╡реНрд╣ рдЬрд╛рд╡рд╛ рдлреНрд░реЗрдорд╡рд░реНрдХ". рд╕реБрд░рд╡рд╛рддреАрдкрд╛рд╕реВрди рд╕реБрд░реБрд╡рд╛рдд рдХрд╢реА рдХрд░рд╛рд╡реА рдХрд┐рдВрд╡рд╛ рддрдпрд╛рд░ рд╕реЛрд▓реНрдпреВрд╢рдиреНрд╕ рдХрд╕реЗ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░рд╛рдпрдЪреЗ рддреЗ рдЖрдореНрд╣реА рддреБрдореНрд╣рд╛рд▓рд╛ рджрд╛рдЦрд╡реВ)

Quarkus рдЖрдгрд┐ AMQ рдСрдирд▓рд╛рдЗрди рд╡рд╛рдкрд░реВрди Red Hat OpenShift рдкреНрд▓реЕрдЯрдлреЙрд░реНрдорд╡рд░ рдХреНрд▓рд╛рдЙрдб-рдиреЗрдЯрд┐рд╡реНрд╣ рдореЗрд╕реЗрдЬрд┐рдВрдЧ

╨Т рдорд╛рдЧреАрд▓ рдпрд╛ рдкреЛрд╕реНрдЯрдордзреНрдпреЗ, рдЖрдореНрд╣реА рдЬрд╛рд╡рд╛ рдНрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕рдЪреНрдпрд╛ рдЖрдзреБрдирд┐рдХреАрдХрд░рдгрд╛рдЪреНрдпрд╛ рдкрд░рд┐рдгрд╛рдореА рдкреНрд░рд╛рдкреНрдд рдЭрд╛рд▓реЗрд▓реНрдпрд╛ рд╕реБрдзрд╛рд░рдгрд╛рдВрдЪреЗ рдкреНрд░рдорд╛рдг рдореЛрдЬрдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓реНрдпрд╛ рдЬрд╛рдгрд╛рд░реНтАНрдпрд╛ рд╕рдВрдмрдВрдзрд┐рдд рд╕рд╛рдзрдирд╛рдВрдХрдбреЗ рдкрд╛рд╣рд┐рд▓реЗ.

рдЖрд╡реГрддреНрддреА 0.17.0 рдкрд╛рд╕реВрди, рдХреНрд╡рд╛рд░реНрдХрд╕ рдкреНрд░рдЧрдд рд╕рдВрджреЗрд╢ рдХреНрдпреВрдЗрдВрдЧ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ (рдПрдордХреНрдпреВрдкреА), рдЬреЗ рдНрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕ рдХрд┐рдВрд╡рд╛ рд╕рдВрд╕реНрдерд╛рдВрдордзреАрд▓ рд╡реНрдпрд╡рд╕рд╛рдп рд╕рдВрджреЗрд╢ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЦреБрд▓реЗ рдорд╛рдирдХ рдЖрд╣реЗ.

Red Hat AMQ рдСрдирд▓рд╛рдЗрди рдУрдкрди рд╕реЛрд░реНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯрдЪреНрдпрд╛ рдЖрдзрд╛рд░реЗ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реА рд╕реЗрд╡рд╛ рдЖрд╣реЗ EnMasse рдЖрдгрд┐ рдкреНрд▓реЕрдЯрдлреЙрд░реНрдо-рдЖрдзрд╛рд░рд┐рдд рдореЗрд╕реЗрдЬрд┐рдВрдЧ рдпрдВрддреНрд░рдгрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдгреЗ рд░реЗрдб рд╣реЕрдЯ рдУрдкрдирд╢рд┐рдлреНрдЯ. рддреЗ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ рдпрд╛рдмрджреНрджрд▓ рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓рд╛рдВрд╕рд╛рдареА, рдкрд╣рд╛ рдпреЗрдереЗ (EN). рдЖрдЬ рдЖрдореНтАНрд╣реА рддреБрдореНтАНрд╣рд╛рд▓рд╛ рджреЛрди рдирд╡реАрди рдореЗрд╕реЗрдЬрд┐рдВрдЧ рддрдВрддреНрд░рдЬреНрдЮрд╛рди рд╡рд╛рдкрд░реВрди рдЖрдзреБрдирд┐рдХ OpenShift-рдЖрдзрд╛рд░рд┐рдд рдореЗрд╕реЗрдЬрд┐рдВрдЧ рд╕рд┐рд╕реНтАНрдЯрдо рддрдпрд╛рд░ рдХрд░рдгреНтАНрдпрд╛рд╕рд╛рдареА AMQ рдСрдирд▓рд╛рдЗрди рдЖрдгрд┐ Quarkus рдХрд╕реЗ рдПрдХрддреНрд░ рдХрд░рд╛рдпрдЪреЗ рддреЗ рджрд╛рдЦрд╡реВ.

рдЕрд╕реЗ рдЧреГрд╣реАрдд рдзрд░рд▓реЗ рдЬрд╛рддреЗ рдХреА рддреБрдореНрд╣реА рдЖрдзреАрдЪ рдУрдкрдирд╢рд┐рдлреНрдЯ рдкреНрд▓реЕрдЯрдлреЙрд░реНрдорд╡рд░ AMQ рдСрдирд▓рд╛рдЗрди рддреИрдирд╛рдд рдХреЗрд▓реЗ рдЖрд╣реЗ (рдЬрд░ рдирд╕реЗрд▓, рддрд░ рдкрд╣рд╛ рд╕реНрдерд╛рдкрдирд╛ рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ).

рдкреНрд░рд╛рд░рдВрдн рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣реА рдПрдХ рдХреНрд╡рд╛рд░реНрдХрд╕ рдНрдкреНрд▓рд┐рдХреЗрд╢рди рддрдпрд╛рд░ рдХрд░реВ рдЬреЛ рд░рд┐рдНрдХреНрдЯрд┐рд╡реНрд╣ рдореЗрд╕реЗрдЬрд┐рдВрдЧ рд╡рд╛рдкрд░реВрди рдПрдХ рд╕реЛрдкреА рдСрд░реНрдбрд░ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдЕрд╕реЗрд▓. рдпрд╛ рдНрдкреНрд▓рд┐рдХреЗрд╢рдирдордзреНрдпреЗ рдСрд░реНрдбрд░ рдЬрдирд░реЗрдЯрд░рдЪрд╛ рд╕рдорд╛рд╡реЗрд╢ рдЕрд╕реЗрд▓ рдЬреЛ рдПрдХрд╛ рдард░рд╛рд╡рд┐рдХ рдЕрдВрддрд░рд╛рдиреЗ рд╕рдВрджреЗрд╢ рд░рд╛рдВрдЧреЗрдд рдСрд░реНрдбрд░ рдкрд╛рдард╡рддреЛ, рддрд╕реЗрдЪ рдСрд░реНрдбрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЬреЛ рд░рд╛рдВрдЧреЗрддреАрд▓ рд╕рдВрджреЗрд╢рд╛рдВрд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрд▓ рдЖрдгрд┐ рдмреНрд░рд╛рдЙрдЭрд░рдордзреНрдпреЗ рдкрд╛рд╣рдгреНрдпрд╛рдпреЛрдЧреНрдп рдкреБрд╖реНрдЯреАрдХрд░рдгреЗ рдЬрдирд░реЗрдЯ рдХрд░реЗрд▓.

рдПрдХрджрд╛ рдЖрдореНтАНрд╣реА рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рди рддрдпрд╛рд░ рдХреЗрд▓реНтАНрдпрд╛рд╡рд░, рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рдирдордзреНтАНрдпреЗ рдореЗрд╕реЗрдЬрд┐рдВрдЧ рд╕рд┐рд╕реНтАНрдЯрдо рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдХрд╕реЗ рдПрдореНтАНрдмреЗрдб рдХрд░рд╛рдпрдЪреЗ рдЖрдгрд┐ рдЖрдореНтАНрд╣рд╛рд▓рд╛ рд╕рд┐рд╕реНтАНрдЯреАрдорд╡рд░ рдЖрд╡рд╢реНтАНрдпрдХ рд╕рдВрд╕рд╛рдзрдирд╛рдВрдЪреА рддрд░рддреВрдж рдХрд░рдгреНтАНрдпрд╛рд╕рд╛рдареА AMQ рдСрдирд▓рд╛рдЗрди рдХрд╕реЗ рд╡рд╛рдкрд░рд╛рдпрдЪреЗ рддреЗ рдЖрдореНтАНрд╣реА рджрд╛рдЦрд╡реВ.

рдХреНрд╡рд╛рд░реНрдХрд╕ рдЕреЕрдк

рдЖрдордЪрд╛ Quarkus рдНрдкреНрд▓рд┐рдХреЗрд╢рди OpenShift рд╡рд░ рдЪрд╛рд▓рддреЛ рдЖрдгрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдордЪреА рд╕реБрдзрд╛рд░рд┐рдд рдЖрд╡реГрддреНрддреА рдЖрд╣реЗ amqp-рдХреНрд╡рд┐рдХрд╕реНрдЯрд╛рд░реНрдЯ. рдХреНрд▓рд╛рдпрдВрдЯрдЪреНрдпрд╛ рдмрд╛рдЬреВрдЪреЗ рд╕рдВрдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг рдЖрдврд│реВ рд╢рдХрддреЗ рдпреЗрдереЗ.

рдСрд░реНрдбрд░ рдЬрдирд░реЗрдЯрд░

рдЬрдирд░реЗрдЯрд░ рджрд░ 5 рд╕реЗрдХрдВрджрд╛рдВрдиреА рд╡рд╛рдврддреНрдпрд╛ рдСрд░реНрдбрд░ рдЖрдпрдбреАрдВрдирд╛ "рдСрд░реНрдбрд░реНрд╕" рдкрддреНрддреНрдпрд╛рд╡рд░ рд╕рд╣рдЬрдкрдгреЗ рдкрд╛рдард╡рддреЛ.

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

рдСрд░реНрдбрд░ рдкреНрд░реЛрд╕реЗрд╕рд░

рдСрд░реНрдбрд░ рд╣рдБрдбрд▓рд░ рдЖрдгрдЦреА рд╕реЛрдкрд╛ рдЖрд╣реЗ, рддреЛ рдлрдХреНрдд "рдкреБрд╖реНрдЯреАрдХрд░рдг" рдкрддреНрддреНрдпрд╛рд╡рд░ рдПрдХ рдкреБрд╖реНрдЯреАрдХрд░рдг рдЖрдпрдбреА рдкрд░рдд рдХрд░рддреЛ.

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

рд╕рдорд╛рдпреЛрдЬрди

AMQ рдСрдирд▓рд╛рдЗрдирд╢реА рдХрдиреЗрдХреНрдЯ рд╣реЛрдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдордЪреНрдпрд╛ рдНрдкреНрд▓рд┐рдХреЗрд╢рдирд▓рд╛ рдХрд╛рд╣реА рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдбреЗрдЯрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕реЗрд▓, рдореНрд╣рдгрдЬреЗ: Quarkus рдХрдиреЗрдХреНрдЯрд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди, AMQP рдПрдВрдбрдкреЙрдЗрдВрдЯ рдорд╛рд╣рд┐рддреА рдЖрдгрд┐ рдХреНрд▓рд╛рдпрдВрдЯ рдХреНрд░реЗрдбреЗрдиреНрд╢рд┐рдпрд▓. рдЕрд░реНрдерд╛рддрдЪ, рд╕рд░реНрд╡ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдбреЗрдЯрд╛ рдПрдХрд╛рдЪ рдард┐рдХрд╛рдгреА рдареЗрд╡рдгреЗ рдЪрд╛рдВрдЧрд▓реЗ рдЖрд╣реЗ, рдкрд░рдВрддреБ рдХреНрд╡рд╛рд░реНрдХрд╕ рдНрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рдВрднрд╛рд╡реНрдп рдкрд░реНрдпрд╛рдп рджрд░реНрд╢рд╡рд┐рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣реА рддреЗ рдореБрджреНрджрд╛рдо рд╡реЗрдЧрд│реЗ рдХрд░реВ.

рдХрдиреЗрдХреНрдЯрд░реНрд╕

рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЧреБрдгрдзрд░реНрдо рдлрд╛рдЗрд▓ рд╡рд╛рдкрд░реВрди рд╕рдВрдХрд▓рд┐рдд рд╡реЗрд│реА рдХрдиреЗрдХреНрдЯрд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдкреНрд░рджрд╛рди рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ:

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

рдЧреЛрд╖реНрдЯреА рд╕реЛрдкреНрдпрд╛ рдареЗрд╡рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣реА рдлрдХреНрдд "рдСрд░реНрдбрд░" рдкрддреНрддреНрдпрд╛рд╕рд╛рдареА рд╕рдВрджреЗрд╢ рд░рд╛рдВрдЧ рд╡рд╛рдкрд░реВ. рдЖрдгрд┐ рдЖрдордЪреНрдпрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рддреАрд▓ "рдкреБрд╖реНрдЯреАрдХрд░рдг" рдкрддреНрддрд╛ рдореЗрдорд░реАрдордзреНрдпреЗ рд░рд╛рдВрдЧ рд╡рд╛рдкрд░реЗрд▓.

AMQP рдПрдВрдбрдкреЙрдЗрдВрдЯ

рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛рдирд╛, AMQP рдПрдВрдбрдкреЙрдЗрдВрдЯрд╕рд╛рдареА рд╣реЛрд╕реНрдЯрдирд╛рд╡ рдЖрдгрд┐ рдкреЛрд░реНрдЯ рдХреНрд░рдорд╛рдВрдХ рдЕрдЬреНрдЮрд╛рдд рдЖрд╣реЗ, рдореНрд╣рдгреВрди рддреЗ рдЗрдВрдЬреЗрдХреНрдЯ рдХреЗрд▓реЗ рдЬрд╛рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. AMQ рдСрдирд▓рд╛рдЗрди рджреНрд╡рд╛рд░реЗ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдХреЙрдиреНрдлрд┐рдЧрдореЕрдкрдордзреНрдпреЗ рдПрдВрдбрдкреЙрдЗрдВрдЯ рд╕реЗрдЯ рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ, рдореНрд╣рдгреВрди рдЖрдореНрд╣реА рддреНрдпрд╛рдВрдирд╛ рдНрдкреНрд▓рд┐рдХреЗрд╢рди рдореЕрдирд┐рдлреЗрд╕реНрдЯрдордзреАрд▓ рдкрд░реНрдпрд╛рд╡рд░рдгреАрдп рдЪрд▓рд╛рдВрджреНрд╡рд╛рд░реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реВ:

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 рд╡рд░ рдЖрдордЪрд╛ рдЕрд░реНрдЬ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ. рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣реА рдкреНрд░рдердо рдПрдХ рд╕рд╛рдиреБрдХреВрд▓ рдХреЙрдиреНрдлрд┐рдЧрд╕реЛрд░реНрд╕ рддрдпрд╛рд░ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдЬреЗ рдкреЙрдбрдЪреНрдпрд╛ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдордордзреВрди рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЯреЛрдХрди рд╡рд╛рдЪреЗрд▓:

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

рдЕрдиреБрдкреНрд░рдпреЛрдЧ рддрдпрд╛рд░ рдХрд░рд╛ рдЖрдгрд┐ рдЙрдкрдпреЛрдЬрд┐рдд рдХрд░рд╛

рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдПрдХреНрдЭрд┐рдХреНрдпреБрдЯреЗрдмрд▓ рдлрд╛рдЗрд▓рдордзреНрдпреЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реНрдпрд╛рдиреЗ, GraalVM рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрди рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдпрд╛рд╕рд╛рдареА рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╕реЗ рд╕реЗрдЯ рдХрд░рд╛рдпрдЪреЗ рдпрд╛рдЪреНрдпрд╛ рддрдкрд╢реАрд▓рд╛рдВрд╕рд╛рдареА, рдордзреАрд▓ рд╕рдВрдмрдВрдзрд┐рдд рд╕реВрдЪрдирд╛ рдкрд╣рд╛ рдХреНрд╡рд╛рд░реНрдХрд╕ рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ.

рддреНрдпрд╛рдирдВрддрд░, рддреЗрдереЗ рджрд┐рд▓реЗрд▓реНрдпрд╛ рд╕реВрдЪрдирд╛рдВрдЪреЗ рдЕрдиреБрд╕рд░рдг рдХрд░реВрди, рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рд╕реНрддреНрд░реЛрдд рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдгреЗ, рдЖрдордЪрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рддрдпрд╛рд░ рдХрд░рдгреЗ рдЖрдгрд┐ рддреИрдирд╛рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ:

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 рдСрдирд▓рд╛рдЗрди рдордзреНрдпреЗ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрджреЗрд╢ рд╕рдВрд╕рд╛рдзрдиреЗ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рдд рдирд╛рд╣реА рддреЛрдкрд░реНрдпрдВрдд рддреЗ рд╕реБрд░реВ рд╣реЛрдгрд╛рд░ рдирд╛рд╣реА.

рдореЗрд╕реЗрдЬрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╕реЗрдЯ рдХрд░рдд рдЖрд╣реЗ

рдЖрддрд╛ рдлрдХреНрдд рдЖрдордЪреНрдпрд╛ рдНрдкреНрд▓рд┐рдХреЗрд╢рдирд▓рд╛ рдореЗрд╕реЗрдЬрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдордордзреНрдпреЗ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓реА рд╕рдВрд╕рд╛рдзрдиреЗ рд╕реЗрдЯ рдХрд░рдгреЗ рдмрд╛рдХреА рдЖрд╣реЗ. рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ рддрдпрд╛рд░ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ: 1) рдореЗрд╕реЗрдЬрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдПрдВрдбрдкреЙрдЗрдВрдЯ рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЕреЕрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕; 2) рдЖрдореНрд╣реА рдНрдкреНрд▓рд┐рдХреЗрд╢рдирдордзреНрдпреЗ рд╡рд╛рдкрд░рдд рдЕрд╕рд▓реЗрд▓реЗ рдкрддреНрддреЗ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкрддреНрддрд╛; 3) рдореЗрд╕реЗрдЬрд┐рдВрдЧ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдХреНрд▓рд╛рдпрдВрдЯ рдХреНрд░реЗрдбреЗрдиреНрд╢рд┐рдпрд▓ рд╕реЗрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА.

рдкрддреНрддреНрдпрд╛рдЪреА рдЬрд╛рдЧрд╛

AMQ рдСрдирд▓рд╛рдЗрди рдордзреАрд▓ AddressSpace рдСрдмреНрдЬреЗрдХреНрдЯ рд╣рд╛ рдкрддреНрддреНрдпрд╛рдВрдЪрд╛ рдПрдХ рд╕рдореВрд╣ рдЖрд╣реЗ рдЬреЛ рдХрдиреЗрдХреНрд╢рди рдПрдВрдбрдкреЙрдЗрдВрдЯ рдЖрдгрд┐ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЖрдгрд┐ рдЕрдзрд┐рдХреГрддрддрд╛ рдзреЛрд░рдгреЗ рд╕рд╛рдорд╛рдпрд┐рдХ рдХрд░рддреЛ. рддреБрдореНрд╣реА рдЕреЕрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕ рддрдпрд╛рд░ рдХрд░рддрд╛ рддреЗрд╡реНрд╣рд╛, рдореЗрд╕реЗрдЬрд┐рдВрдЧ рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ рдХрд╕реЗ рдЙрдШрдб рдХреЗрд▓реЗ рдЬрд╛рддреАрд▓ рддреЗ рддреБрдореНрд╣реА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реВ рд╢рдХрддрд╛:

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 рд╕реЗрд╡рд╛ рдЦрд╛рддреЗ рд╡рд╛рдкрд░реВрди рдкреНрд░рдорд╛рдгреАрдХреГрдд рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ. рд╡рд╛рдкрд░рдХрд░реНрддрд╛ "рд╕реЗрд╡рд╛ рдЦрд╛рддреЗ" рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдпрд╛рдкреНрд░рдорд╛рдгреЗ:

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 рдПрдВрдбрдкреЙрдЗрдВрдЯ рдорд╛рд╣рд┐рддреА рдПрдореНрдмреЗрдб рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓реЗрд▓рд╛ рдХреЙрдиреНрдлрд┐рдЧрдореЕрдк рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рд░реЛрд▓ рдЖрдгрд┐ рд░реЛрд▓рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╕реЗрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ:

---
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 рдСрдирд▓рд╛рдЗрдирджреНрд╡рд╛рд░реЗ рд╕рдВрджреЗрд╢ рдкрд╛рдард╡рд▓реЗ рдЖрдгрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдд рдЕрд╕рд▓реНрдпрд╛рдиреЗ рддрд┐рдХрд┐рдЯреЗ рд╡реЗрд│реЛрд╡реЗрд│реА рдЕрдкрдбреЗрдЯ рдХреЗрд▓реА рдЬрд╛рддрд╛рдд.

рдЧреЛрд│рд╛ рдХрд░реАрдд рдЖрд╣реЗ

рдореНрд╣рдгреВрди рдЖрдореНрд╣реА рдореЗрд╕реЗрдЬрд┐рдВрдЧрд╕рд╛рдареА AMQP рд╡рд╛рдкрд░рдгрд╛рд░рд╛ рдХреНрд╡рд╛рд░реНрдХрд╕ рдНрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рд╣рд┐рд▓реЗ, рдНрдкреНрд▓рд┐рдХреЗрд╢рдирд▓рд╛ Red Hat OpenShift рдкреНрд▓реЕрдЯрдлреЙрд░реНрдорд╡рд░ рдЪрд╛рд▓рд╡рдгреНрдпрд╛рд╕рд╛рдареА рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЗрд▓реЗ рдЖрдгрд┐ AMQ рдСрдирд▓рд╛рдЗрди рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирд╡рд░ рдЖрдзрд╛рд░рд┐рдд рддреНрдпрд╛рдЪреЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд▓рд╛рдЧреВ рдХреЗрд▓реЗ. рддреНрдпрд╛рдирдВрддрд░ рдЖрдореНрд╣реА рдЖрдордЪреНрдпрд╛ рдНрдкреНрд▓рд┐рдХреЗрд╢рдирд╕рд╛рдареА рдореЗрд╕реЗрдЬрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдореЕрдирд┐рдлреЗрд╕реНрдЯ рддрдпрд╛рд░ рдХреЗрд▓реЗ.

рдпрд╛рдореБрд│реЗ рдХреНрд╡рд╛рд░реНрдХрд╕ рдмрджреНрджрд▓рдЪреА рдорд╛рд▓рд┐рдХрд╛ рд╕рдВрдкрддреЗ, рдкрдг рдкреБрдвреЗ рдЦреВрдк рдирд╡реАрди рдЖрдгрд┐ рдордиреЛрд░рдВрдЬрдХ рдЧреЛрд╖реНрдЯреА рдЖрд╣реЗрдд, рдЯреНрдпреВрди рд░рд╛рд╣рд╛!

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛