Quarkus እና AMQ Onlineን በመጠቀም በ Red Hat OpenShift መድረክ ላይ የክላውድ-ቤተኛ መልእክት መላላኪያ

ሰላም ሁላችሁም! ይሄው ነው - የኳርኩስ ተከታታዮች የመጨረሻ ጽሑፋችን! (በነገራችን ላይ የእኛን ዌቢናር ይመልከቱ "ይህ ኳርኩስ - ኩበርኔትስ ቤተኛ ጃቫ ማዕቀፍ ነው". ከባዶ እንዴት እንደሚጀምሩ ወይም የተዘጋጁ መፍትሄዎችን ማስተላለፍ እንደሚችሉ እናሳይዎታለን)

Quarkus እና AMQ Onlineን በመጠቀም በ Red Hat OpenShift መድረክ ላይ የክላውድ-ቤተኛ መልእክት መላላኪያ

В ቀዳሚ በዚህ ልኡክ ጽሁፍ ላይ የጃቫ አፕሊኬሽኖችን በማዘመን የተገኙ ማሻሻያዎችን ለመለካት የሚያገለግሉ ተዛማጅ መሳሪያዎችን ተመልክተናል።

ከስሪት 0.17.0 ጀምሮ፣ ኩርኩስ የላቀ የመልእክት ወረፋ ፕሮቶኮልን ይደግፋል (AMQP) በመተግበሪያዎች ወይም በድርጅቶች መካከል የንግድ መልዕክቶችን ለማስተላለፍ ክፍት መስፈርት ነው።

ቀይ ኮፍያ AMQ በመስመር ላይ በክፍት ምንጭ ፕሮጀክት ላይ የተመሰረተ አገልግሎት ነው። ኤንማሴ እና በመድረክ ላይ የተመሰረተ የመልዕክት ዘዴን በመተግበር ላይ Red Hat OpenShift. እንዴት እንደሚሰራ ተጨማሪ ዝርዝሮችን ለማግኘት ይመልከቱ እዚህ (EN). ዛሬ ሁለት አዳዲስ የመልእክት መላላኪያ ቴክኖሎጂዎችን በመጠቀም ዘመናዊ በOpenShift ላይ የተመሰረተ የመልእክት መላላኪያ ስርዓት ለመገንባት AMQ Onlineን እና Quarkusን እንዴት ማጣመር እንደሚችሉ እናሳይዎታለን።

AMQ Onlineን በOpenShift መድረክ ላይ እንዳሰማራህ ይታሰባል (ካልሆነ ከዚያ ተመልከት የመጫኛ መመሪያ).

ለመጀመር፣ ምላሽ ሰጪ መልዕክትን በመጠቀም ቀላል የትእዛዝ ሂደት የሚሆን የኳርኩስ መተግበሪያ እንፈጥራለን። ይህ አፕሊኬሽን በተወሰነ የጊዜ ክፍተት ውስጥ ወደ መልእክት ወረፋ የሚልክ ትዕዛዝ ጄነሬተርን እንዲሁም መልእክቶችን ከወረፋው የሚያስኬድ እና በአሳሹ ውስጥ የሚታዩ ማረጋገጫዎችን የሚያመነጭ የትዕዛዝ ፕሮሰሰርን ያካትታል።

አንዴ አፕሊኬሽኑን ከፈጠርን በኋላ የመልእክት መላላኪያ ሥርዓቱን እንዴት ወደ አፕሊኬሽኑ መክተት እና AMQ Onlineን በመጠቀም በሲስተሙ ላይ የምንፈልጋቸውን ግብዓቶች እንዴት እንደሚጠቀሙ እናሳይዎታለን።

የኳርኩስ መተግበሪያ

የእኛ የኳርኩስ መተግበሪያ በ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++);
    }
}

የትዕዛዝ ፕሮሰሰር

የትዕዛዝ ተቆጣጣሪው ይበልጥ ቀላል ነው፣ የማረጋገጫ መታወቂያ ወደ "ማረጋገጫዎች" አድራሻ ብቻ ይመልሳል።

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

የማረጋገጫ መርጃዎች

የማረጋገጫ ሀብቱ በእኛ መተግበሪያ የተፈጠሩትን ማረጋገጫዎች ለመዘርዘር የኤችቲቲፒ የመጨረሻ ነጥብ ነው።

@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 ኦንላይን ጋር ለመገናኘት የኛ መተግበሪያ አንዳንድ የውቅረት ዳታ ያስፈልገዋል፡- የኳርኩስ አያያዥ ውቅር፣ AMQP የመጨረሻ ነጥብ መረጃ እና የደንበኛ ምስክርነቶች። እርግጥ ነው, ሁሉንም የማዋቀሪያ መረጃዎችን በአንድ ቦታ ላይ ማስቀመጥ የተሻለ ነው, ነገር ግን ሆን ብለን የኳርኩስ መተግበሪያን ለማዋቀር ሊሆኑ የሚችሉ አማራጮችን ለማሳየት እንለያቸዋለን.

አያያctorsች

የማገናኛ ውቅር በማጠናቀር ጊዜ የመተግበሪያ ባህሪያት ፋይልን በመጠቀም ሊቀርብ ይችላል፡-

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

ነገሮችን ቀላል ለማድረግ፣ ለ"ትዕዛዝ" አድራሻ የመልእክት ወረፋ ብቻ እንጠቀማለን። እና በእኛ መተግበሪያ ውስጥ ያለው "ማረጋገጫዎች" አድራሻ በማህደረ ትውስታ ውስጥ ወረፋ ይጠቀማል.

AMQP የመጨረሻ ነጥብ

በማጠናቀር ጊዜ፣ የ AMQP የመጨረሻ ነጥብ የአስተናጋጅ ስም እና የወደብ ቁጥር አይታወቅም፣ ስለዚህ መከተብ አለባቸው። የመጨረሻ ነጥቡ በ AMQ ኦንላይን በተፈጠረው ማዋቀር ውስጥ ሊዋቀር ይችላል፣ ስለዚህ በመተግበሪያው ዝርዝር ውስጥ በአካባቢ ተለዋዋጮች እንገልጻቸዋለን፡

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

ማመልከቻውን ይገንቡ እና ያሰራጩ

አፕሊኬሽኑ ወደ ተፈጻሚነት ያለው ፋይል መጠቅለል ስላለበት የGalVM ቨርቹዋል ማሽን ያስፈልጋል። ለዚህ አካባቢን እንዴት ማቀናበር እንደሚቻል ላይ ዝርዝሮችን ለማግኘት በ ውስጥ ያሉትን ተዛማጅ መመሪያዎች ይመልከቱ የኳርኩስ መመሪያ.

ከዚያ ፣ እዚያ የተሰጡትን መመሪያዎች በመከተል ፣ ምንጩን ማውረድ ፣ መተግበሪያችንን መገንባት እና ማሰማራት ያስፈልግዎታል ።

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 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 ኦንላይን የ 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 መልእክቶች ሲላኩ እና ሲቀበሉ ትኬቶች በየጊዜው እንደሚሻሻሉ አሳሹ ማሳየት አለበት።

ማጠቃለል

ስለዚህ AMQPን ለመልእክት የሚጠቀም የኳርኩስ አፕሊኬሽን ጽፈናል፣ አፕሊኬሽኑን በ Red Hat OpenShift መድረክ ላይ እንዲሰራ አዋቅረነው እና በ AMQ Online ውቅር ላይ በመመስረት አወቃቀሩን ተግባራዊ አደረግን። ለመተግበሪያችን የመልእክት መላላኪያ ስርዓቱን ለመጀመር የሚያስፈልጉትን መግለጫዎች ፈጠርን ።

ስለ ቋርኩስ ተከታታዩን በዚህ ያጠናቅቃል ነገር ግን ብዙ አዳዲስ እና አስደሳች ነገሮች ከፊታችን አሉና ተከታተሉት!

ምንጭ: hab.com

አስተያየት ያክሉ