Quarkus рд░ AMQ рдЕрдирд▓рд╛рдЗрди рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ Red Hat OpenShift рдкреНрд▓реЗрдЯрдлрд░реНрдордорд╛ рдХреНрд▓рд╛рдЙрдб-рдиреЗрдЯрд┐рдн рд╕рдиреНрджреЗрд╢

рдирдорд╕реНрддреЗ рд╕рдмреИ! рдпреЛ рдпрд╣рд╛рдБ рдЫ - рдХреНрд╡рд╛рд░реНрдХрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдорд╛ рд╣рд╛рдореНрд░реЛ рдЕрдиреНрддрд┐рдо рдкреЛрд╕реНрдЯ! (рд╡реИрд╕реЗ, рд╣рд╛рдореНрд░реЛ рд╡реЗрдмрд┐рдирд╛рд░ рд╣реЗрд░реНрдиреБрд╣реЛрд╕реН "рдпреЛ рдХреНрд╡рд╛рд░реНрдХрд╕ рд╣реЛ - рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдиреЗрдЯрд┐рдн рдЬрд╛рднрд╛ рдлреНрд░реЗрдорд╡рд░реНрдХ"ред рд╣рд╛рдореА рддрдкрд╛рдИрдВрд▓рд╛рдИ рдХрд╕рд░реА рд╕реНрдХреНрд░реНрдпрд╛рдЪрдмрд╛рдЯ рд╕реБрд░реБ рдЧрд░реНрдиреЗ рд╡рд╛ рддрдпрд╛рд░ рд╕рдорд╛рдзрд╛рдирд╣рд░реВ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрдиреЗ рднрдиреЗрд░ рджреЗрдЦрд╛рдЙрдиреЗрдЫреМрдВ)

Quarkus рд░ AMQ рдЕрдирд▓рд╛рдЗрди рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ Red Hat OpenShift рдкреНрд▓реЗрдЯрдлрд░реНрдордорд╛ рдХреНрд▓рд╛рдЙрдб-рдиреЗрдЯрд┐рдн рд╕рдиреНрджреЗрд╢

╨Т рдЕрдШрд┐рд▓реНрд▓реЛ рдпрд╕ рдкреЛрд╖реНрдЯрдорд╛, рд╣рд╛рдореАрд▓реЗ рд╕рд╛рдиреНрджрд░реНрднрд┐рдХ рдЙрдкрдХрд░рдгрд╣рд░реВ рд╣реЗрд░реНрдпреМрдВ рдЬреБрди рдЬрд╛рднрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВрдХреЛ рдЖрдзреБрдирд┐рдХреАрдХрд░рдгрдХреЛ рдкрд░рд┐рдгрд╛рдордХреЛ рд░реВрдкрдорд╛ рдкреНрд░рд╛рдкреНрдд рд╕реБрдзрд╛рд░рд╣рд░реВрдХреЛ рдкрд░рд┐рдорд╛рдг рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред

рд╕рдВрд╕реНрдХрд░рдг реж.резрен.реж рджреЗрдЦрд┐, рдХреНрд╡рд╛рд░реНрдХрд╕ Advanced Message Quueing Protocol рдХреЛ рдкреНрд░рдпреЛрдЧрд▓рд╛рдИ рд╕рдорд░реНрдерди рдЧрд░реНрджрдЫ (AMQP), рдЬреБрди рдПрдкреНрд▓рд┐рдХреЗрд╕рди рд╡рд╛ рд╕рдВрд╕реНрдерд╛рд╣рд░реВ рдмреАрдЪ рд╡реНрдпрд╛рдкрд╛рд░ рд╕рдиреНрджреЗрд╢рд╣рд░реВ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдЦреБрд▓рд╛ рдорд╛рдирдХ рд╣реЛред

Red Hat AMQ рдЕрдирд▓рд╛рдЗрди рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рдЖрдзрд╛рд░рдорд╛ рдирд┐рд░реНрдорд┐рдд рд╕реЗрд╡рд╛ рд╣реЛ EnMasse рд░ рдкреНрд▓реЗрдЯрдлрд░реНрдо-рдЖрдзрд╛рд░рд┐рдд рд╕рдиреНрджреЗрд╢ рд╕рдВрдпрдиреНрддреНрд░ рд▓рд╛рдЧреВ рдЧрд░реНрджреИ рд░реЗрдб рд╣реНрдпрд╛рдЯ рдУрдкрдирд╢рд┐рдлреНрдЯред рдпрд╕рд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ рднрдиреНрдиреЗ рдмрд╛рд░реЗ рдердк рд╡рд┐рд╡рд░рдгрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐, рд╣реЗрд░реНрдиреБрд╣реЛрд╕реН рдпрд╣рд╛рдБ (EN)ред рдЖрдЬ рд╣рд╛рдореА рддрдкрд╛рдИрдВрд▓рд╛рдИ рджреБрдИ рдирдпрд╛рдБ рд╕рдиреНрджреЗрд╢ рдкреНрд░рд╡рд┐рдзрд┐рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЖрдзреБрдирд┐рдХ OpenShift-рдЖрдзрд╛рд░рд┐рдд рд╕рдиреНрджреЗрд╢ рдкреНрд░рдгрд╛рд▓реА рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди AMQ рдЕрдирд▓рд╛рдЗрди рд░ рдХреНрд╡рд╛рд░реНрдХрд╕рд▓рд╛рдИ рдХрд╕рд░реА рд╕рдВрдпреЛрдЬрди рдЧрд░реНрдиреЗ рднрдиреЗрд░ рджреЗрдЦрд╛рдЙрдиреЗрдЫреМрдВред

рдпреЛ рдорд╛рдирд┐рдиреНрдЫ рдХрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдУрдкрдирд╢рд┐рдлреНрдЯ рдкреНрд▓реЗрдЯрдлрд░реНрдордорд╛ AMQ рдЕрдирд▓рд╛рдЗрди рдбрд┐рдкреНрд▓реЛрдЗ рдЧрд░рд┐рд╕рдХреНрдиреБрднрдПрдХреЛ рдЫ (рдпрджрд┐ рд╣реЛрдЗрди рднрдиреЗ, рддреНрдпрд╕рдкрдЫрд┐ рд╣реЗрд░реНрдиреБрд╣реЛрд╕реНред рд╕реНрдерд╛рдкрдирд╛ рдЧрд╛рдЗрдб).

рд╕реБрд░реБ рдЧрд░реНрди, рд╣рд╛рдореА Quarkus рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗрдЫреМрдВ рдЬреБрди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд╕рдиреНрджреЗрд╢ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЕрд░реНрдбрд░ рдкреНрд░рд╢реЛрдзрди рдкреНрд░рдгрд╛рд▓реА рд╣реБрдиреЗрдЫред рдпреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд▓реЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдиреНрддрд░рд╛рд▓рдорд╛ рд╕рдиреНрджреЗрд╢ рд▓рд╛рдордорд╛ рдЕрд░реНрдбрд░ рдкрдард╛рдЙрдиреЗ рдЕрд░реНрдбрд░ рдЬрдирд░реЗрдЯрд░ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ, рд╕рд╛рдереИ рдПрдХ рдЕрд░реНрдбрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЬрд╕рд▓реЗ рд▓рд╛рдордмрд╛рдЯ рд╕рдиреНрджреЗрд╢рд╣рд░реВ рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрджрдЫ рд░ рдмреНрд░рд╛рдЙрдЬрд░рдорд╛ рджреЗрдЦреНрди рд╕рдХрд┐рдиреЗ рдкреБрд╖реНрдЯрд┐рдХрд░рдгрд╣рд░реВ рдЙрддреНрдкрдиреНрди рдЧрд░реНрджрдЫред

рдПрдХрдкрдЯрдХ рд╣рд╛рдореАрд▓реЗ рдПрдкреНрд▓рд┐рдХреЗрд╕рди рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рд╕рдХреЗрдкрдЫрд┐, рд╣рд╛рдореА рддрдкрд╛рдИрдВрд▓рд╛рдИ рдореЗрд╕реЗрдЬрд┐рдЩ рд╕рд┐рд╕реНрдЯрдо рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирд▓рд╛рдИ рдХрд╕рд░реА рдПрдкреНрд▓рд┐рдХреЗрд╕рдирдорд╛ рдЗрдореНрдмреЗрдб рдЧрд░реНрдиреЗ рд░ рдкреНрд░рдгрд╛рд▓реАрдорд╛ рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрдиреЗ рд╕реНрд░реЛрддрд╣рд░реВ рдЙрдкрд▓рдмреНрдз рдЧрд░рд╛рдЙрди AMQ рдЕрдирд▓рд╛рдЗрди рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рднрдиреЗрд░ рджреЗрдЦрд╛рдЙрдиреЗрдЫреМрдВред

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

рд╣рд╛рдореНрд░реЛ рдХреНрд╡рд╛рд░реНрдХрд╕ рдПрдк 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++);
    }
}

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

рдЕрд░реНрдбрд░ рд╣реНрдпрд╛рдиреНрдбрд▓рд░ рдЕрдЭ рд╕рд░рд▓ рдЫ, рдпрд╕рд▓реЗ рдХреЗрд╡рд▓ "рдкреБрд╖реНрдЯрд┐рд╣рд░реВ" рдареЗрдЧрд╛рдирд╛рдорд╛ рдкреБрд╖реНрдЯрд┐рдХрд░рдг ID рдлрд░реНрдХрд╛рдЙрдБрдЫред

@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 рдЕрдирд▓рд╛рдЗрдирдорд╛ рдЬрдбрд╛рди рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореНрд░реЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд▓рд╛рдИ рдХреЗрд╣реА рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдбреЗрдЯрд╛ рдЪрд╛рд╣рд┐рдиреНрдЫ, рдЬрд╕реНрддреИ: рдХреНрд╡рд╛рд░реНрдХрд╕ рдХрдиреЗрдХреНрдЯрд░ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди, 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 Online рдорд╛ 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 рдЕрдирд▓рд╛рдЗрди рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдорд╛ рдЖрдзрд╛рд░рд┐рдд рдпрд╕рдХреЛ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рд▓рд╛рдЧреВ рдЧрд░реНтАНрдпреМрдВред рд╣рд╛рдореАрд▓реЗ рддреНрдпрд╕рдкрдЫрд┐ рд╣рд╛рдореНрд░реЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдиреНрджреЗрд╢ рдкреНрд░рдгрд╛рд▓реА рд╕реБрд░реБ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ manifests рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдпреМрдВред

рдпрд╕рд▓реЗ рдХреНрд╡рд╛рд░реНрдХрд╕рдХреЛ рдмрд╛рд░реЗрдорд╛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕рдорд╛рдкреНрдд рдЧрд░реНрджрдЫ, рддрд░ рддреНрдпрд╣рд╛рдБ рдзреЗрд░реИ рдирдпрд╛рдБ рд░ рдЪрд╛рдЦрд▓рд╛рдЧреНрджреЛ рдЪреАрдЬрд╣рд░реВ рдЫрдиреН, рд╕рд╛рде рд░рд╣рдиреБрд╣реЛрд╕реН!

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди