Nhắn tin dựa trên đám mây trên nền tảng Red Hat OpenShift bằng Quarkus và AMQ Online

Chào mọi người! Đây rồi - bài đăng cuối cùng của chúng tôi trong loạt bài Quarkus! (Nhân tiện, hãy xem hội thảo trên web của chúng tôi “Đây là Quarkus – framework Java gốc của Kubernetes”. Chúng tôi sẽ chỉ cho bạn cách bắt đầu lại từ đầu hoặc chuyển giao các giải pháp làm sẵn)

Nhắn tin dựa trên đám mây trên nền tảng Red Hat OpenShift bằng Quarkus và AMQ Online

В Trước Trong bài đăng này, chúng tôi đã xem xét các công cụ liên quan có thể được sử dụng để định lượng những cải tiến đạt được nhờ hiện đại hóa các ứng dụng Java.

Kể từ phiên bản 0.17.0, quarkus hỗ trợ việc sử dụng Giao thức xếp hàng tin nhắn nâng cao (AMQP), đây là một tiêu chuẩn mở để truyền tải các thông điệp kinh doanh giữa các ứng dụng hoặc tổ chức.

Red Hat AMQ trực tuyến là một dịch vụ được xây dựng trên cơ sở một dự án nguồn mở EnMasse và triển khai cơ chế nhắn tin dựa trên nền tảng Red Hat OpenShift. Để biết thêm chi tiết về cách thức hoạt động, hãy xem ở đây (EN). Hôm nay chúng tôi sẽ hướng dẫn bạn cách kết hợp AMQ Online và Quarkus để xây dựng hệ thống nhắn tin dựa trên OpenShift hiện đại bằng hai công nghệ nhắn tin mới.

Giả sử rằng bạn đã triển khai AMQ Online trên nền tảng OpenShift (nếu chưa, hãy xem hướng dẫn cài đặt).

Để bắt đầu, chúng tôi sẽ tạo một ứng dụng Quarkus, đây sẽ là một hệ thống xử lý đơn hàng đơn giản bằng cách sử dụng tính năng nhắn tin phản hồi. Ứng dụng này sẽ bao gồm một trình tạo đơn hàng gửi đơn đặt hàng đến hàng đợi tin nhắn theo một khoảng thời gian cố định, cũng như một bộ xử lý đơn hàng sẽ xử lý các tin nhắn từ hàng đợi và tạo các xác nhận có thể xem được trong trình duyệt.

Sau khi tạo xong ứng dụng, chúng tôi sẽ hướng dẫn bạn cách nhúng cấu hình hệ thống nhắn tin vào ứng dụng và sử dụng AMQ Online để cung cấp các tài nguyên chúng tôi cần trên hệ thống.

ứng dụng Quarkus

Ứng dụng Quarkus của chúng tôi chạy trên OpenShift và là phiên bản sửa đổi của chương trình amqp-khởi động nhanh. Một ví dụ đầy đủ về phía khách hàng có thể được tìm thấy đây.

Trình tạo đơn hàng

Trình tạo chỉ đơn giản gửi ID đơn đặt hàng ngày càng tăng đến địa chỉ “đơn đặt hàng” cứ sau 5 giây.

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

Bộ xử lý đơn hàng

Trình xử lý đơn hàng thậm chí còn đơn giản hơn, nó chỉ trả về ID xác nhận đến địa chỉ "xác nhận".

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

Tài nguyên xác nhận

Tài nguyên xác nhận là điểm cuối HTTP để liệt kê các xác nhận do ứng dụng của chúng tôi tạo ra.

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

điều chỉnh

Để kết nối với AMQ Online, ứng dụng của chúng tôi sẽ cần một số dữ liệu cấu hình, cụ thể là: cấu hình trình kết nối Quarkus, thông tin điểm cuối AMQP và thông tin xác thực ứng dụng khách. Tất nhiên, tốt hơn là giữ tất cả dữ liệu cấu hình ở một nơi, nhưng chúng tôi sẽ cố tình tách chúng ra để hiển thị các tùy chọn có thể có để định cấu hình ứng dụng Quarkus.

Kết nối

Cấu hình trình kết nối có thể được cung cấp tại thời điểm biên dịch bằng tệp thuộc tính ứng dụng:

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

Để đơn giản, chúng tôi sẽ chỉ sử dụng hàng đợi tin nhắn cho địa chỉ "đơn đặt hàng". Và địa chỉ “xác nhận” trong ứng dụng của chúng ta sẽ sử dụng hàng đợi trong bộ nhớ.

Điểm cuối AMQP

Tại thời điểm biên dịch, tên máy chủ và số cổng cho điểm cuối AMQP không xác định nên chúng phải được đưa vào. Điểm cuối có thể được đặt trong sơ đồ cấu hình do AMQ Online tạo, vì vậy chúng tôi sẽ xác định chúng thông qua các biến môi trường trong bảng kê khai ứng dụng:

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

Thông tin xác thực

Mã thông báo tài khoản dịch vụ có thể được sử dụng để xác thực ứng dụng của chúng tôi với OpenShift. Để thực hiện việc này, trước tiên bạn phải tạo ConfigSource tùy chỉnh sẽ đọc mã thông báo xác thực từ hệ thống tệp của nhóm:

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

Xây dựng và triển khai ứng dụng

Vì ứng dụng phải được biên dịch thành tệp thực thi nên cần có máy ảo GraalVM. Để biết chi tiết về cách thiết lập môi trường cho việc này, hãy xem hướng dẫn tương ứng trong Hướng dẫn quarkus.

Sau đó, làm theo hướng dẫn ở đó, bạn cần tải xuống nguồn, xây dựng và triển khai ứng dụng của chúng tôi:

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

Sau các lệnh này, ứng dụng sẽ được triển khai nhưng sẽ không khởi động cho đến khi chúng tôi định cấu hình tài nguyên nhắn tin mà chúng tôi cần trong AMQ Online.

Thiết lập hệ thống nhắn tin

Bây giờ tất cả những gì còn lại là thiết lập các tài nguyên mà ứng dụng của chúng tôi cần trong hệ thống nhắn tin. Để thực hiện việc này, bạn cần tạo: 1) vùng địa chỉ để khởi tạo điểm cuối của hệ thống nhắn tin; 2) địa chỉ để định cấu hình các địa chỉ chúng tôi sử dụng trong ứng dụng; 3) Nhắn tin cho người dùng để đặt thông tin xác thực của khách hàng.

Không gian địa chỉ

Đối tượng Không gian địa chỉ trong AMQ Online là một nhóm địa chỉ chia sẻ điểm cuối kết nối cũng như các chính sách xác thực và ủy quyền. Khi tạo không gian địa chỉ, bạn có thể chỉ định cách hiển thị các điểm cuối nhắn tin:

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

Địa chỉ

Địa chỉ được sử dụng để gửi và nhận tin nhắn. Mỗi địa chỉ có một loại xác định ngữ nghĩa của nó cũng như một gói chỉ định số lượng tài nguyên được dự trữ. Địa chỉ có thể được xác định, ví dụ như thế này:

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

Người dùng nhắn tin

Để đảm bảo rằng chỉ những ứng dụng đáng tin cậy mới có thể gửi và nhận tin nhắn đến địa chỉ của bạn, bạn phải tạo người dùng trong hệ thống nhắn tin. Đối với các ứng dụng chạy trên một cụm, máy khách có thể được xác thực bằng tài khoản dịch vụ OpenShift. Ví dụ: "serviceaccount" người dùng có thể được xác định như thế này:

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

Quyền cấu hình ứng dụng

Để AMQ Online tạo sơ đồ cấu hình mà chúng tôi đã sử dụng để nhúng thông tin điểm cuối AMQP, Vai trò và Ràng buộc vai trò phải được đặt:

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

Cách áp dụng cấu hình

Bạn có thể áp dụng cấu hình hệ thống nhắn tin như thế này:

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

Xác minh ứng dụng

Để đảm bảo rằng ứng dụng đã khởi động, trước hết hãy kiểm tra xem các địa chỉ tương ứng đã được tạo và đang hoạt động chưa:

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

Sau đó, hãy kiểm tra URL tuyến ứng dụng (chỉ cần mở địa chỉ này trong trình duyệt):

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

Trình duyệt sẽ hiển thị rằng vé được cập nhật định kỳ khi AMQ Online gửi và nhận tin nhắn.

Tổng hợp

Vì vậy, chúng tôi đã viết một ứng dụng Quarkus sử dụng AMQP để nhắn tin, định cấu hình ứng dụng để chạy trên nền tảng Red Hat OpenShift và triển khai cấu hình của nó dựa trên cấu hình AMQ Online. Sau đó, chúng tôi đã tạo các bảng kê khai cần thiết để khởi tạo hệ thống nhắn tin cho ứng dụng của mình.

Phần này kết thúc loạt bài về Quarkus, nhưng còn rất nhiều điều mới mẻ và thú vị phía trước, hãy chú ý theo dõi nhé!

Nguồn: www.habr.com

Thêm một lời nhận xét