เช•เซเชตเชพเชฐเซเช•เชธ เช…เชจเซ‡ AMQ เช“เชจเชฒเชพเชˆเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ Red Hat OpenShift เชชเซเชฒเซ‡เชŸเชซเซ‹เชฐเซเชฎ เชชเชฐ เช•เซเชฒเชพเช‰เชก-เช†เชงเชพเชฐเชฟเชค เชฎเซ‡เชธเซ‡เชœเชฟเช‚เช—

เช•เซ‡เชฎ เช›เซ‹ เชฌเชงเชพ! เชคเซ‡ เช…เชนเซ€เช‚ เช›เซ‡ - เช•เซเชตเชพเชฐเซเช•เชธ เชถเซเชฐเซ‡เชฃเซ€เชฎเชพเช‚ เช…เชฎเชพเชฐเซ€ เช…เช‚เชคเชฟเชฎ เชชเซ‹เชธเซเชŸ! (เชฎเชพเชฐเซเช— เชฆเซเชตเชพเชฐเชพ, เช…เชฎเชพเชฐเซ€ เชตเซ‡เชฌเชฟเชจเชพเชฐ เชœเซเช“ "เช† เช•เซเชตเชพเชฐเซเช•เชธ เช›เซ‡ - เช•เซเชฌเชฐเชจเซ‡เชŸเซ€เชธ เชฎเซ‚เชณ เชœเชพเชตเชพ เชซเซเชฐเซ‡เชฎเชตเชฐเซเช•". เช…เชฎเซ‡ เชคเชฎเชจเซ‡ เชฌเชคเชพเชตเซ€เชถเซเช‚ เช•เซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชถเชฐเซ‚เช†เชคเชฅเซ€ เชถเชฐเซ‚เช†เชค เช•เชฐเชตเซ€ เช…เชฅเชตเชพ เชคเซˆเชฏเชพเชฐ เชธเซ‹เชฒเซเชฏเซเชถเชจ เชŸเซเชฐเชพเชจเซเชธเชซเชฐ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเชตเซเช‚)

เช•เซเชตเชพเชฐเซเช•เชธ เช…เชจเซ‡ AMQ เช“เชจเชฒเชพเชˆเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ Red Hat OpenShift เชชเซเชฒเซ‡เชŸเชซเซ‹เชฐเซเชฎ เชชเชฐ เช•เซเชฒเชพเช‰เชก-เช†เชงเชพเชฐเชฟเชค เชฎเซ‡เชธเซ‡เชœเชฟเช‚เช—

ะ’ เช…เช—เชพเช‰เชจเชพ เช† เชชเซ‹เชธเซเชŸเชฎเชพเช‚, เช…เชฎเซ‡ เชœเชพเชตเชพ เชเชชเซเชฒเซ€เช•เซ‡เชถเชจเชจเชพ เช†เชงเซเชจเชฟเช•เซ€เช•เชฐเชฃเชจเชพ เชชเชฐเชฟเชฃเชพเชฎเซ‡ เชฎเซ‡เชณเชตเซ‡เชฒเชพ เชธเซเชงเชพเชฐเชพเช“เชจเซ‡ เชฎเชพเชชเชตเชพ เชฎเชพเชŸเซ‡ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชฒเชˆ เชถเช•เชพเชฏ เชคเซ‡เชตเชพ เชธเช‚เชฌเช‚เชงเชฟเชค เชธเชพเชงเชจเซ‹ เชชเชฐ เชงเซเชฏเชพเชจ เช†เชชเซเชฏเซเช‚.

เช†เชตเซƒเชคเซเชคเชฟ 0.17.0 เชฅเซ€, เช•เซเชตเชพเชฐเซเช•เชธ เชเชกเชตเชพเชจเซเชธเซเชก เชฎเซ‡เชธเซ‡เชœ เช•เซเชฏเซเช‡เช‚เช— เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ (AMQP), เชœเซ‡ เชเชชเซเชฒเซ€เช•เซ‡เชถเชจ เช…เชฅเชตเชพ เชธเช‚เชธเซเชฅเชพเช“ เชตเชšเซเชšเซ‡ เชตเซเชฏเชตเชธเชพเชฏเชฟเช• เชธเช‚เชฆเซ‡เชถเชพเช“เชจเซ‡ เชธเซเชฅเชพเชจเชพเช‚เชคเชฐเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซเช‚ เชเช• เช–เซเชฒเซเชฒเซเช‚ เชงเซ‹เชฐเชฃ เช›เซ‡.

Red Hat AMQ เช“เชจเชฒเชพเช‡เชจ เช“เชชเชจ เชธเซ‹เชฐเซเชธ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเชพ เช†เชงเชพเชฐเซ‡ เชฌเชจเซ‡เชฒ เชธเซ‡เชตเชพ เช›เซ‡ เชเชจเชฎเชพเชธเซ‡ เช…เชจเซ‡ เชชเซเชฒเซ‡เชŸเชซเซ‹เชฐเซเชฎ-เช†เชงเชพเชฐเชฟเชค เชฎเซ‡เชธเซ‡เชœเชฟเช‚เช— เชฎเชฟเช•เซ‡เชจเชฟเชเชฎเชจเซ‹ เช…เชฎเชฒ เช•เชฐเชตเซ‹ เชฐเซ‡เชก Hat เช“เชชเชจเชถเซ€เชซเซเชŸ. เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡เชจเชพ เชชเชฐ เชตเชงเซ เชตเชฟเช—เชคเซ‹ เชฎเชพเชŸเซ‡, เชœเซเช“ เช…เชนเซ€เช‚ (EN). เช†เชœเซ‡ เช…เชฎเซ‡ เชคเชฎเชจเซ‡ เชฌเชคเชพเชตเซ€เชถเซเช‚ เช•เซ‡ เชฌเซ‡ เชจเชตเซ€ เชฎเซ‡เชธเซ‡เชœเชฟเช‚เช— เชŸเซ‡เช•เซเชจเซ‹เชฒเซ‹เชœเซ€เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช†เชงเซเชจเชฟเช• OpenShift-เช†เชงเชพเชฐเชฟเชค เชฎเซ‡เชธเซ‡เชœเชฟเช‚เช— เชธเชฟเชธเซเชŸเชฎ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ AMQ Online เช…เชจเซ‡ Quarkus เชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชœเซ‹เชกเชตเซเช‚.

เชเชตเซเช‚ เชฎเชพเชจเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช•เซ‡ เชคเชฎเซ‡ เช“เชชเชจเชถเชฟเชซเซเชŸ เชชเซเชฒเซ‡เชŸเชซเซ‹เชฐเซเชฎ เชชเชฐ AMQ เช“เชจเชฒเชพเชˆเชจ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชœเชฎเชพเชตเซเชฏเซเช‚ เช›เซ‡ (เชœเซ‹ เชจเชนเซ€เช‚, เชคเซ‹ เชชเช›เซ€ เชœเซเช“ เชธเซเชฅเชพเชชเชจ เชฎเชพเชฐเซเช—เชฆเชฐเซเชถเชฟเช•เชพ).

เชถเชฐเซ‚ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เช…เชฎเซ‡ เช•เซเชตเชพเชฐเซเช•เชธ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฌเชจเชพเชตเซ€เชถเซเช‚ เชœเซ‡ เชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพเชถเซ€เชฒ เชฎเซ‡เชธเซ‡เชœเชฟเช‚เช—เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชเช• เชธเชฐเชณ เช“เชฐเซเชกเชฐ เชชเซเชฐเซ‹เชธเซ‡เชธเชฟเช‚เช— เชธเชฟเชธเซเชŸเชฎ เชนเชถเซ‡. เช† เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชฎเชพเช‚ เช“เชฐเซเชกเชฐ เชœเชจเชฐเซ‡เชŸเชฐ เชถเชพเชฎเซ‡เชฒ เชนเชถเซ‡ เชœเซ‡ เชเช• เชจเชฟเชถเซเชšเชฟเชค เช…เช‚เชคเชฐเชพเชฒ เชชเชฐ เชธเช‚เชฆเซ‡เชถ เช•เชคเชพเชฐเชฎเชพเช‚ เช“เชฐเซเชกเชฐ เชฎเซ‹เช•เชฒเซ‡ เช›เซ‡, เชคเซ‡เชฎเชœ เช“เชฐเซเชกเชฐ เชชเซเชฐเซ‹เชธเซ‡เชธเชฐ เช•เซ‡ เชœเซ‡ เช•เชคเชพเชฐเชฎเชพเช‚เชฅเซ€ เชธเช‚เชฆเซ‡เชถเชพเช“ เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชถเซ‡ เช…เชจเซ‡ เชฌเซเชฐเชพเช‰เชเชฐเชฎเชพเช‚ เชœเซ‹เชˆ เชถเช•เชพเชฏ เชคเซ‡เชตเชพ เชชเซเชทเซเชŸเชฟเช•เชฐเชฃเซ‹ เชœเชจเชฐเซ‡เชŸ เช•เชฐเชถเซ‡.

เชเช•เชตเชพเชฐ เช…เชฎเซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฌเชจเชพเชตเซ€ เชฒเซ€เชงเชพ เชชเช›เซ€, เช…เชฎเซ‡ เชคเชฎเชจเซ‡ เชฌเชคเชพเชตเซ€เชถเซเช‚ เช•เซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชฎเชพเช‚ เชฎเซ‡เชธเซ‡เชœเชฟเช‚เช— เชธเชฟเชธเซเชŸเชฎ เช—เซ‹เช เชตเชฃเซ€ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชเชฎเซเชฌเซ‡เชก เช•เชฐเชตเซ€ เช…เชจเซ‡ เชธเชฟเชธเซเชŸเชฎ เชชเชฐ เช…เชฎเชจเซ‡ เชœเชฐเซ‚เชฐเซ€ เชธเช‚เชธเชพเชงเชจเซ‹เชจเซ€ เชœเซ‹เช—เชตเชพเชˆ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ AMQ เช‘เชจเชฒเชพเช‡เชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹.

เช•เซเชตเชพเชฐเซเช•เชธ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ

เช…เชฎเชพเชฐเซ€ เช•เซเชตเชพเชฐเซเช•เชธ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ OpenShift เชชเชฐ เชšเชพเชฒเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซเช‚ เชธเซเชงเชพเชฐเซ‡เชฒเซเช‚ เชธเช‚เชธเซเช•เชฐเชฃ เช›เซ‡ amqp-เช•เซเชตเชฟเช•เชธเซเชŸเชพเชฐเซเชŸ. เช•เซเชฒเชพเชฏเชจเซเชŸ เชฌเชพเชœเซเชจเซเช‚ เชธเช‚เชชเซ‚เชฐเซเชฃ เช‰เชฆเชพเชนเชฐเชฃ เชฎเชณเซ€ เชถเช•เซ‡ เช›เซ‡ เช…เชนเซ€เช‚.

เช“เชฐเซเชกเชฐ เชœเชจเชฐเซ‡เชŸเชฐ

เชœเชจเชฐเซ‡เชŸเชฐ เชซเช•เซเชค เชเช•เชตเชฟเชง เชฐเซ€เชคเซ‡ เชตเชงเชคเชพ เช“เชฐเซเชกเชฐ ID เชจเซ‡ เชฆเชฐ 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 เช“เชจเชฒเชพเช‡เชจเชฎเชพเช‚ 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"]

เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ‡ เช—เซ‹เช เชตเชตเชพเชจเซ€ เชชเชฐเชตเชพเชจเช—เซ€เช“

เช…เชฎเซ‡ AMQP เชเชจเซเชกเชชเซ‹เช‡เชจเซเชŸ เชฎเชพเชนเชฟเชคเซ€เชจเซ‡ เชเชฎเซเชฌเซ‡เชก เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชฒเซ€เชงเซ‡เชฒเชพ เชฐเซ‚เชชเชฐเซ‡เช–เชพ เชฎเซ‡เชช เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ AMQ Online เชฎเชพเชŸเซ‡, เชญเซ‚เชฎเชฟเช•เชพ เช…เชจเซ‡ เชฐเซ‹เชฒเชฌเชพเช‡เชจเซเชกเชฟเช‚เช— เชธเซ‡เชŸ เช•เชฐเชตเซเช‚ เช†เชตเชถเซเชฏเช• เช›เซ‡:

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

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹