การส่งข้อความบนคลาวด์บนแพลตฟอร์ม Red Hat OpenShift โดยใช้ Quarkus และ AMQ Online

สวัสดีทุกคน! นี่ไง - โพสต์สุดท้ายของเราในซีรีส์ Quarkus! (ยังไงก็ตาม โปรดดูการสัมมนาผ่านเว็บของเรา “นี่คือ Quarkus – เฟรมเวิร์ก Java ดั้งเดิมของ Kubernetes”. เราจะแสดงวิธีเริ่มต้นจากศูนย์หรือถ่ายโอนโซลูชันสำเร็จรูป)

การส่งข้อความบนคลาวด์บนแพลตฟอร์ม Red Hat OpenShift โดยใช้ Quarkus และ AMQ Online

В ก่อนหน้า ในโพสต์นี้ เราได้ดูเครื่องมือที่เกี่ยวข้องซึ่งสามารถใช้เพื่อวัดปริมาณการปรับปรุงที่ได้รับอันเป็นผลมาจากการปรับปรุงแอปพลิเคชัน Java ให้ทันสมัย

ตั้งแต่เวอร์ชัน 0.17.0 ควาร์คัส รองรับการใช้โปรโตคอลการจัดคิวข้อความขั้นสูง (แอมคิวพี) ซึ่งเป็นมาตรฐานเปิดสำหรับการถ่ายโอนข้อความทางธุรกิจระหว่างแอปพลิเคชันหรือองค์กร

เรดแฮท AMQ ออนไลน์ เป็นบริการที่สร้างขึ้นบนพื้นฐานของโครงการโอเพ่นซอร์ส เอ็นแมส และการใช้กลไกการส่งข้อความตามแพลตฟอร์ม RedShift OpenShift. สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการทำงาน โปรดดู ที่นี่ (EN). วันนี้เราจะแสดงให้คุณเห็นถึงวิธีการรวม AMQ Online และ Quarkus เพื่อสร้างระบบการรับส่งข้อความแบบ OpenShift ที่ทันสมัยโดยใช้เทคโนโลยีการรับส่งข้อความใหม่สองแบบ

ถือว่าคุณได้ปรับใช้ AMQ Online บนแพลตฟอร์ม OpenShift แล้ว (หากไม่ใช่ โปรดดู คู่มือการติดตั้ง).

ในการเริ่มต้น เราจะสร้างแอปพลิเคชัน Quarkus ที่จะเป็นระบบประมวลผลคำสั่งซื้อที่เรียบง่ายโดยใช้การส่งข้อความแบบโต้ตอบ แอปพลิเคชันนี้จะรวมตัวสร้างคำสั่งซื้อที่ส่งคำสั่งซื้อไปยังคิวข้อความตามช่วงเวลาที่กำหนด เช่นเดียวกับตัวประมวลผลคำสั่งซื้อที่จะประมวลผลข้อความจากคิวและสร้างการยืนยันที่สามารถดูได้ในเบราว์เซอร์

เมื่อเราสร้างแอปพลิเคชันแล้ว เราจะแสดงวิธีฝังการกำหนดค่าระบบการส่งข้อความลงในแอปพลิเคชัน และใช้ AMQ Online เพื่อจัดเตรียมทรัพยากรที่เราต้องการบนระบบ

แอปพลิเคควาร์คัส

แอปพลิเคชัน Quarkus ของเราทำงานบน OpenShift และเป็นเวอร์ชันแก้ไขของโปรแกรม amqp-เริ่มต้นอย่างรวดเร็ว. สามารถดูตัวอย่างที่สมบูรณ์ของฝั่งไคลเอ็นต์ได้ ที่นี่.

เครื่องกำเนิดคำสั่ง

ตัวสร้างจะส่งรหัสคำสั่งซื้อที่เพิ่มขึ้นอย่างซ้ำซากจำเจไปยังที่อยู่ "คำสั่งซื้อ" ทุกๆ 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 และข้อมูลรับรองไคลเอ็นต์ แน่นอนว่าเป็นการดีกว่าที่จะเก็บข้อมูลการกำหนดค่าทั้งหมดไว้ในที่เดียว แต่เราจะจงใจแยกข้อมูลเหล่านั้นออกเพื่อแสดงตัวเลือกที่เป็นไปได้สำหรับการกำหนดค่าแอปพลิเคชัน 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 สามารถกำหนดผู้ใช้ "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 สร้าง configmap ที่เราใช้ในการฝังข้อมูลตำแหน่งข้อมูล 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 จากนั้นเราสร้างรายการที่จำเป็นในการเริ่มต้นระบบการส่งข้อความสำหรับแอปพลิเคชันของเรา

นี่เป็นการสรุปซีรีส์เกี่ยวกับ Quarkus แต่ยังมีสิ่งใหม่และน่าสนใจอีกมากมายรออยู่ข้างหน้า โปรดคอยติดตาม!

ที่มา: will.com

เพิ่มความคิดเห็น