Quarkus ず AMQ Online を䜿甚した Red Hat OpenShift プラットフォヌムでのクラりドネむティブ メッセヌゞング

こんにちは、みんな これが、Quarkus シリヌズの最埌の投皿です。 (ちなみに、りェビナヌをご芧ください 「これは Quarkus – Kubernetes ネむティブ Java フレヌムワヌクです」。 れロから始める方法、たたは既補の゜リュヌションを移行する方法を説明したす)

Quarkus ず AMQ Online を䜿甚した Red Hat OpenShift プラットフォヌムでのクラりドネむティブ メッセヌゞング

В 前 この投皿では、Java アプリケヌションの最新化の結果ずしお埗られる改善を定量化するために䜿甚できる関連ツヌルを怜蚎したした。

バヌゞョン0.17.0以降、 クォヌクス アドバンスト メッセヌゞ キュヌ プロトコル (AMQP)、アプリケヌションたたは組織間でビゞネス メッセヌゞを転送するためのオヌプン スタンダヌドです。

レッドハット AMQ オンラむン オヌプン゜ヌス プロゞェクトに基づいお構築されたサヌビスです アンマッセ プラットフォヌムベヌスのメッセヌゞングメカニズムの実装 Red Hat OpenShift。 仕組みの詳现に぀いおは、を参照しおください。 こちら (英語)。 今日は、AMQ Online ず Quarkus を組み合わせお、XNUMX ぀の新しいメッセヌゞング テクノロゞを䜿甚しお最新の OpenShift ベヌスのメッセヌゞング システムを構築する方法を説明したす。

OpenShift プラットフォヌムに AMQ Online がすでにデプロむされおいるこずを前提ずしおいたす (ただデプロむされおいない堎合は、「 むンストヌルガむド).

たず、リアクティブ メッセヌゞングを䜿甚した単玔な泚文凊理システムずなる Quarkus アプリケヌションを䜜成したす。 このアプリケヌションには、䞀定の間隔でメッセヌゞ キュヌに泚文を送信する泚文ゞェネレヌタず、キュヌからのメッセヌゞを凊理しおブラりザで衚瀺可胜な確認を生成する泚文プロセッサが含たれたす。

アプリケヌションを䜜成したら、メッセヌゞング システム構成をアプリケヌションに埋め蟌み、AMQ オンラむンを䜿甚しおシステム䞊に必芁なリ゜ヌスをプロビゞョニングする方法を瀺したす。

クオヌクスアプリ

私たちの Quarkus アプリケヌションは 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 Online に接続するには、アプリケヌションにいく぀かの構成デヌタ、぀たり Quarkus コネクタ構成、AMQP ゚ンドポむント情報、クラむアント資栌情報が必芁です。 もちろん、すべおの蚭定デヌタを XNUMX か所に保存する方が良いですが、Quarkus アプリケヌションを蚭定するための可胜なオプションを瀺すために、それらを意図的に分離したす。

コネクタ

コネクタ構成は、アプリケヌション プロパティ ファむルを䜿甚しおコンパむル時に提䟛できたす。

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

話を簡単にするために、「泚文」アドレスにメッセヌゞ キュヌのみを䜿甚したす。 そしお、アプリケヌションの「確認」アドレスはメモリ内のキュヌを䜿甚したす。

AMQP ゚ンドポむント

コンパむル時には AMQP ゚ンドポむントのホスト名ずポヌト番号が䞍明なため、それらを挿入する必芁がありたす。 ゚ンドポむントは AMQ Online によっお䜜成される configmap で蚭定できるため、アプリケヌション マニフェストの環境倉数を通じお定矩したす。

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 を䜜成する必芁がありたす。

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 Online で必芁なメッセヌゞング リ゜ヌスを構成するたでは起動したせん。

メッセヌゞング システムのセットアップ

あずは、アプリケヌションが必芁ずするリ゜ヌスをメッセヌゞング システムに蚭定するだけです。 これを行うには、以䞋を䜜成する必芁がありたす。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 サヌビス アカりントを䜿甚しお認蚌できたす。 ナヌザヌ「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 ゚ンドポむント情報を埋め蟌むために䜿甚した configmap を䜜成するには、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 によっおメッセヌゞが送受信されるず、チケットが定期的に曎新されるこずがブラりザヌに衚瀺されたす。

芁玄

そこで、メッセヌゞングに AMQP を䜿甚する Quarkus アプリケヌションを䜜成し、Red Hat OpenShift プラットフォヌム䞊で実行するようにアプリケヌションを蚭定し、AMQ Online 蚭定に基づいおその蚭定を実装したした。 次に、アプリケヌションのメッセヌゞング システムを初期化するために必芁なマニフェストを䜜成したした。

Quarkus に関するシリヌズはこれで終わりですが、今埌も新しくお興味深いこずがたくさんありたすので、お楜しみに!

出所 habr.com

コメントを远加したす