پیام‌رسانی بومی ابری در پلتفرم Red Hat OpenShift با استفاده از Quarkus و AMQ Online

سلام به همه! اینجاست - آخرین پست ما در سری Quarkus! (به هر حال، وبینار ما را تماشا کنید "این چارچوب جاوا کوارکوس - Kubernetes بومی است". ما به شما نشان خواهیم داد که چگونه از صفر شروع کنید یا راه حل های آماده را انتقال دهید)

پیام‌رسانی بومی ابری در پلتفرم Red Hat OpenShift با استفاده از Quarkus و AMQ Online

В قبلی در این پست، ابزارهای مربوطه را بررسی کردیم که می توان از آنها برای تعیین کمیت پیشرفت های به دست آمده در نتیجه مدرن کردن برنامه های جاوا استفاده کرد.

از نسخه 0.17.0، کوارکوس از استفاده از پروتکل صف بندی پیشرفته پیام (AMQP) که یک استاندارد باز برای انتقال پیام های تجاری بین برنامه ها یا سازمان ها است.

Red Hat AMQ Online سرویسی است که بر اساس یک پروژه منبع باز ساخته شده است EnMasse و پیاده سازی مکانیزم پیام رسانی مبتنی بر پلت فرم سرخپوش OpenShift. برای جزئیات بیشتر در مورد نحوه کار، نگاه کنید اینجا (EN). امروز به شما نشان خواهیم داد که چگونه AMQ Online و Quarkus را برای ایجاد یک سیستم پیام رسانی مدرن مبتنی بر OpenShift با استفاده از دو فناوری پیام رسانی جدید ترکیب کنید.

فرض بر این است که شما قبلاً AMQ Online را در پلتفرم OpenShift مستقر کرده اید (اگر نه، پس ببینید راهنمای نصب).

برای شروع، ما یک برنامه Quarkus ایجاد می کنیم که یک سیستم پردازش سفارش ساده با استفاده از پیام های واکنشی خواهد بود. این برنامه شامل یک تولید کننده سفارش است که سفارش ها را در یک بازه زمانی ثابت به صف پیام ارسال می کند، و همچنین یک پردازشگر سفارش که پیام ها را از صف پردازش می کند و تأییدیه های قابل مشاهده در مرورگر را ایجاد می کند.

هنگامی که برنامه را ایجاد کردیم، به شما نشان خواهیم داد که چگونه پیکربندی سیستم پیام رسانی را در برنامه جاسازی کنید و از AMQ Online برای تهیه منابع مورد نیاز در سیستم استفاده کنید.

اپلیکیشن کوارکوس

برنامه Quarkus ما روی OpenShift اجرا می شود و یک نسخه اصلاح شده از برنامه است amqp-quickstart. یک مثال کامل از سمت مشتری را می توان یافت اینجا.

مولد سفارش

مولد به سادگی هر 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 Online، برنامه ما به برخی از داده های پیکربندی نیاز دارد، یعنی: پیکربندی اتصال دهنده Quarkus، اطلاعات نقطه پایانی AMQP و اعتبار مشتری. البته بهتر است تمام داده های پیکربندی را در یک مکان نگه دارید، اما ما عمدا آنها را از هم جدا می کنیم تا گزینه های ممکن برای پیکربندی برنامه Quarkus را نشان دهیم.

اتصال دهنده ها

پیکربندی رابط را می توان در زمان کامپایل با استفاده از فایل ویژگی های برنامه ارائه کرد:

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

برای ساده نگه داشتن همه چیز، ما فقط از یک صف پیام برای آدرس "سفارش ها" استفاده می کنیم. و آدرس "تأییدات" در برنامه ما از یک صف در حافظه استفاده می کند.

نقطه پایانی AMQP

در زمان کامپایل، نام میزبان و شماره پورت برای نقطه پایانی AMQP ناشناخته است، بنابراین آنها باید تزریق شوند. نقطه پایانی را می توان در configmap که توسط AMQ Online ایجاد می شود تنظیم کرد، بنابراین ما آنها را از طریق متغیرهای محیطی در مانیفست برنامه تعریف می کنیم:

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) پیام رسانی به کاربر برای تنظیم اعتبار مشتری.

فضای آدرس

یک شی AddressSpace در AMQ Online گروهی از آدرس‌ها است که نقاط پایانی اتصال و سیاست‌های احراز هویت و مجوز را به اشتراک می‌گذارند. هنگامی که یک فضای آدرس ایجاد می‌کنید، می‌توانید نحوه نمایش نقاط پایانی پیام را مشخص کنید:

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 استفاده کردیم، 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 ارسال و دریافت می شوند.

جمعبندی

بنابراین ما یک برنامه Quarkus نوشتیم که از AMQP برای پیام رسانی استفاده می کند، برنامه را برای اجرا بر روی پلتفرم Red Hat OpenShift پیکربندی کردیم و پیکربندی آن را بر اساس پیکربندی AMQ Online پیاده سازی کردیم. سپس مانیفست های مورد نیاز برای مقداردهی اولیه سیستم پیام رسانی را برای برنامه خود ایجاد کردیم.

این سریال در مورد کوارکوس به پایان می رسد، اما چیزهای جدید و جالب زیادی در پیش است، با ما همراه باشید!

منبع: www.habr.com

اضافه کردن نظر