Quarkus ve AMQ Online kullanılarak Red Hat OpenShift platformunda bulut tabanlı mesajlaşma

Herkese selam! İşte karşınızda - Quarkus serisindeki son gönderimiz! (Bu arada web seminerimizi izleyin “Bu Quarkus – Kubernetes yerel Java çerçevesi”. Size sıfırdan nasıl başlayacağınızı veya hazır çözümleri nasıl aktaracağınızı göstereceğiz)

Quarkus ve AMQ Online kullanılarak Red Hat OpenShift platformunda bulut tabanlı mesajlaşma

В önceki Bu yazıda, Java uygulamalarının modernleştirilmesi sonucunda elde edilen iyileştirmeleri ölçmek için kullanılabilecek ilgili araçlara baktık.

0.17.0 sürümünden bu yana, kuarkus Gelişmiş Mesaj Sıralama Protokolü'nün kullanımını destekler (AMQP), uygulamalar veya kuruluşlar arasında iş mesajlarının aktarımına yönelik açık bir standarttır.

Red Hat AMQ Çevrimiçi açık kaynaklı bir proje temelinde oluşturulmuş bir hizmettir EnMasse ve platform tabanlı bir mesajlaşma mekanizmasının uygulanması Kırmızı Şapka OpenShift. Nasıl çalıştığına ilişkin daha fazla ayrıntı için bkz. burada (TR). Bugün size iki yeni mesajlaşma teknolojisini kullanarak modern bir OpenShift tabanlı mesajlaşma sistemi oluşturmak için AMQ Online ve Quarkus'u nasıl birleştireceğinizi göstereceğiz.

AMQ Online'ı OpenShift platformunda zaten konuşlandırdığınız varsayılmaktadır (değilse bkz. yükleme Rehberi).

Başlangıç ​​olarak reaktif mesajlaşmayı kullanan basit bir sipariş işleme sistemi olacak bir Quarkus uygulaması oluşturacağız. Bu uygulama, siparişleri sabit aralıklarla mesaj kuyruğuna gönderen bir sipariş oluşturucunun yanı sıra kuyruktan gelen mesajları işleyecek ve tarayıcıda görüntülenebilen onaylar oluşturacak bir sipariş işlemcisini içerecektir.

Uygulamayı oluşturduktan sonra, mesajlaşma sistemi yapılandırmasını uygulamaya nasıl yerleştireceğinizi ve sistemde ihtiyacımız olan kaynakları sağlamak için AMQ Online'ı nasıl kullanacağınızı göstereceğiz.

Quarkus uygulaması

Quarkus uygulamamız OpenShift üzerinde çalışmaktadır ve programın değiştirilmiş bir versiyonudur. amqp-hızlı başlangıç. İstemci tarafının tam bir örneğini burada bulabilirsiniz burada.

Sipariş oluşturucu

Jeneratör, her 5 saniyede bir "siparişler" adresine büyüyen sipariş kimliklerini monoton bir şekilde gönderir.

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

Sipariş İşleyici

Sipariş işleyicisi daha da basittir; yalnızca "onaylar" adresine bir onay kimliği döndürür.

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

Onay Kaynakları

Onay kaynağı, uygulamamız tarafından oluşturulan onayları listeleyen bir HTTP uç noktasıdır.

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

Ayar

AMQ Online'a bağlanmak için uygulamamızın bazı yapılandırma verilerine ihtiyacı olacaktır: Quarkus bağlayıcı yapılandırması, AMQP uç nokta bilgileri ve istemci kimlik bilgileri. Elbette tüm yapılandırma verilerini tek bir yerde tutmak daha iyidir, ancak Quarkus uygulamasını yapılandırmaya yönelik olası seçenekleri göstermek için bunları bilinçli olarak ayıracağız.

Konektörler

Bağlayıcı yapılandırması, bir uygulama özellikleri dosyası kullanılarak derleme zamanında sağlanabilir:

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

İşleri basitleştirmek adına yalnızca "siparişler" adresi için bir mesaj kuyruğu kullanacağız. Uygulamamızdaki “onaylar” adresi de hafızadaki bir kuyruğu kullanacak.

AMQP uç noktası

Derleme zamanında AMQP uç noktasının ana bilgisayar adı ve bağlantı noktası numarası bilinmediğinden bunların eklenmesi gerekir. Uç nokta, AMQ Online tarafından oluşturulan yapılandırma haritasında ayarlanabilir, dolayısıyla bunları uygulama bildirimindeki ortam değişkenleri aracılığıyla tanımlayacağız:

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

kimlik bilgileri

Hizmet hesabı belirteci, uygulamamızın OpenShift'te kimliğini doğrulamak için kullanılabilir. Bunu yapmak için öncelikle bölmenin dosya sisteminden kimlik doğrulama belirtecini okuyacak özel bir ConfigSource oluşturmanız gerekir:

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

Uygulamayı Oluşturun ve Dağıtın

Uygulamanın yürütülebilir bir dosya halinde derlenmesi gerektiğinden GraalVM sanal makinesi gereklidir. Bunun için bir ortamın nasıl kurulacağı hakkında daha fazla bilgi için ilgili talimatlara bakın. Quarkus Rehberi.

Ardından, orada verilen talimatları izleyerek kaynağı indirmeniz, uygulamamızı oluşturmanız ve dağıtmanız gerekir:

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

Bu komutlardan sonra uygulama konuşlandırılacak ancak AMQ Online'da ihtiyacımız olan mesajlaşma kaynaklarını yapılandırana kadar başlamayacaktır.

Mesajlaşma sisteminin kurulması

Artık geriye kalan tek şey uygulamamızın ihtiyaç duyduğu kaynakları mesajlaşma sisteminde ayarlamaktır. Bunu yapmak için şunları oluşturmanız gerekir: 1) mesajlaşma sistemi uç noktasını başlatmak için bir adres alanı; 2) uygulamada kullandığımız adresleri yapılandırmak için adres; 3) İstemci kimlik bilgilerini ayarlamak için kullanıcıya mesaj gönderin.

Adres alanı

AMQ Online'daki birAdresSpace nesnesi, bağlantı uç noktalarını ve kimlik doğrulama ve yetkilendirme ilkelerini paylaşan bir adres grubudur. Bir adres alanı oluşturduğunuzda mesajlaşma uç noktalarının nasıl gösterileceğini belirtebilirsiniz:

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

Adres

Adresler mesaj göndermek ve almak için kullanılır. Her adresin, anlamını belirleyen bir türü ve ayrılacak kaynak sayısını belirten bir planı vardır. Adres örneğin şu şekilde belirlenebilir:

apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
  name: quarkus-example.orders
spec:
  address: orders
  type: queue
  plan: brokered-queue

Mesajlaşma kullanıcısı

Adreslerinize yalnızca güvenilir uygulamaların mesaj gönderip alabilmesini sağlamak için mesajlaşma sisteminde bir kullanıcı oluşturmanız gerekir. Bir kümede çalışan uygulamalar için istemcilerin kimlik doğrulaması bir OpenShift hizmet hesabı kullanılarak yapılabilir. "serviceaccount" kullanıcısı örneğin şu şekilde tanımlanabilir:

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

Uygulama ayarlarına ilişkin izinler

AMQ Online'ın AMQP uç nokta bilgilerini yerleştirmek için kullandığımız yapılandırma haritasını oluşturabilmesi için Rol ve RoleBinding'in ayarlanması gerekir:

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

Yapılandırmalar nasıl uygulanır?

Mesajlaşma sistemi yapılandırmasını şu şekilde uygulayabilirsiniz:

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

Uygulama doğrulama

Uygulamanın başladığından emin olmak için öncelikle ilgili adreslerin oluşturulup oluşturulmadığını ve aktif olup olmadığını kontrol edelim:

until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Not yet ready"; sleep 5; done

O halde uygulama rota URL'sini kontrol edelim (bu adresi tarayıcıda açmanız yeterli):

echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"

Tarayıcı, mesajların AMQ Online tarafından gönderilip alınmasına göre biletlerin periyodik olarak güncellendiğini göstermelidir.

Özetle

Bu nedenle mesajlaşma için AMQP'yi kullanan bir Quarkus uygulaması yazdık, uygulamayı Red Hat OpenShift platformunda çalışacak şekilde yapılandırdık ve yapılandırmasını AMQ Online yapılandırmasına göre uyguladık. Daha sonra uygulamamız için mesajlaşma sistemini başlatmak için gereken bildirimleri oluşturduk.

Bu, Quarkus hakkındaki seriyi sonlandırıyor, ancak önümüzde pek çok yeni ve ilginç şey var, bizi izlemeye devam edin!

Kaynak: habr.com

Yorum ekle