Red Hat OpenShift рдХреНрд▓рд╛рдЙрдб-рдЖрдзрд╛рд░рд┐рдд рдореИрд╕реЗрдЬрд┐рдВрдЧ рдХреНрд╡рд╛рд░реНрдХрд╕ рдФрд░ AMQ рдСрдирд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ

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



рдПрдХ рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ рд╣рдордиреЗ рдЙрди рдЙрдкрдпреБрдХреНрдд рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рджреЗрдЦрд╛ рдЬрд┐рдирдХреЗ рд╕рд╛рде рдЖрдк рдЬрд╛рд╡рд╛ рдЖрдзреБрдирд┐рдХреАрдХрд░рдг рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХрд┐рдП рдЧрдП рд╕реБрдзрд╛рд░реЛрдВ рдХреА рдорд╛рддреНрд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдиреБрдкреНрд░рдпреЛрдЧред

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

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

рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА OpenShift рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ AMQ рдСрдирд▓рд╛рдЗрди рддреИрдирд╛рдд рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ (рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдЧрд╛рдЗрдб рджреЗрдЦреЗрдВ )ред

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

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдпрд╣ рджрд┐рдЦрд╛рдПрдВрдЧреЗ рдХрд┐ рдЗрд╕рдореЗрдВ рдореИрд╕реЗрдЬрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдЗрд╕ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП AMQ рдСрдирд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

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


рд╣рдорд╛рд░рд╛ рдХреНрд╡рд╛рд░реНрдХрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдУрдкрдирд╢рд┐рдлреНрдЯ рдкрд░ рдЪрд▓рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдПрдордХреНрдпреВрдкреА-рдХреНрд╡рд┐рдХрд╕реНрдЯрд╛рд░реНрдЯ рдХрд╛ рд╕рдВрд╢реЛрдзрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИ ред рдЧреНрд░рд╛рд╣рдХ рдкрдХреНрд╖ рдХрд╛ рдПрдХ рдкреВрд░рд╛ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдЖрджреЗрд╢ рдЬрдирд░реЗрдЯрд░


рд╣рд░ 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 рдСрдирд▓рд╛рдЗрди рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХреБрдЫ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдбреЗрдЯрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЕрд░реНрдерд╛рддреН: рдХреНрд╡рд╛рд░реНрдХрд╕ рдХрдиреЗрдХреНрдЯрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди, рдПрдПрдордХреНрдпреВрдкреА рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреА рдЬрд╛рдирдХрд╛рд░реА, рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐ рд╕рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рд╕реНрдерд╛рди рдкрд░ рд░рдЦрд╛ рдЬрд╛рдП, рд▓реЗрдХрд┐рди рд╣рдо рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреНрд╡рд╛рд░реНрдХрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдк рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рдХрд░реЗрдВрдЧреЗред

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


рдХрдиреЗрдХреНрдЯрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЧреБрдг рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

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

рдЗрд╕реЗ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЗрд╡рд▓ "рдЖрджреЗрд╢" рдкрддреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрджреЗрд╢ рдХрддрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдФрд░ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ "рдкреБрд╖реНрдЯрд┐" рдкрддрд╛ рд╕реНрдореГрддрд┐ рдореЗрдВ рдХрддрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред

рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдПрдПрдордХреНрдпреВрдкреА


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

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

рдЗрди рдЖрджреЗрд╢реЛрдВ рдХреЗ рдмрд╛рдж, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рддрдм рддрдХ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рд╣рдо рдПрдПрдордХреНрдпреВ рдСрдирд▓рд╛рдЗрди рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрджреЗрд╢ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рд╕рдВрджреЗрд╢ рд╕реЗрдЯрдЕрдк


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

рдкрддрд╛ рд╕реНрдерд╛рди


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

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

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрддрд┐рдпрд╛рдВ


рдПрдПрдордХреНрдпреВ рдСрдирд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдПрдордХреНрдпреВрдкреА рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рдирдореИрдк рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рднреВрдорд┐рдХрд╛ рдФрд░ рд░реЛрд▓ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ (рднреВрдорд┐рдХрд╛ рдФрд░ рд░реЛрд▓рдмрд╛рдЗрдВрдбрд┐рдВрдЧ) рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

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

рдпрд╣ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЯрд┐рдХрдЯ рд╕рдордп-рд╕рдордп рдкрд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрджреЗрд╢ рдПрдПрдордХреНрдпреВ рдСрдирд▓рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рднреЗрдЬреЗ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ


рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдПрдХ рдХреНрд╡рд╛рд░реНрдХрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрд╛ рдЬреЛ рд╕рдВрджреЗрд╢ рдХреЗ рд▓рд┐рдП AMQP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ Red Hat OpenShift рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд┐рдпрд╛, рдФрд░ AMQ рдСрдирд▓рд╛рдЗрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрд╕рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред рдлрд┐рд░ рд╣рдордиреЗ рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдореИрд╕реЗрдЬрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ рдХреЛ рдЖрд╡рд╢реНрдпрдХ рдмрдирд╛рдпрд╛ред

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

All Articles