Паёмнависии абрӣ дар платформаи Red Hat OpenShift бо истифода аз Quarkus ва AMQ Online

Салом ба ҳама! Ин аст - паёми ниҳоии мо дар силсилаи Quarkus! (Дар омади гап, вебинари моро тамошо кунед "Ин чаҳорчӯбаи аслии Java Quarkus - Kubernetes аст". Мо ба шумо нишон медиҳем, ки чӣ гуна аз сифр оғоз кардан ё интиқол додани қарорҳои тайёр)

Паёмнависии абрӣ дар платформаи Red Hat OpenShift бо истифода аз Quarkus ва AMQ Online

В гузашта Дар ин паём, мо асбобҳои мувофиқро дида баромадем, ки метавонанд барои муайян кардани беҳбудиҳо дар натиҷаи навсозии барномаҳои Java истифода шаванд.

Аз версияи 0.17.0, Кваркус истифодаи Протоколи Advanced Message Queuing -ро дастгирӣ мекунад (AMQP), ки стандарти кушода барои интиқоли паёмҳои корӣ байни барномаҳо ё созмонҳо мебошад.

Red Hat AMQ онлайн хидматест, ки дар асоси лоиҳаи кушодаасос сохта шудааст EnMasse ва татбиқи механизми паёмнависии платформа RedHat OpenShift. Барои тафсилоти бештар дар бораи он, ки он чӣ гуна кор мекунад, нигаред ин ҷо (EN). Имрӯз мо ба шумо нишон медиҳем, ки чӣ тавр якҷоя кардани AMQ Online ва Quarkus барои сохтани системаи муосири паёмнависии дар асоси OpenShift бо истифода аз ду технологияи нави паёмнависӣ.

Тахмин меравад, ки шумо аллакай AMQ Online-ро дар платформаи OpenShift ҷойгир кардаед (агар не, пас нигаред. дастури насб).

Барои оғоз, мо як барномаи Quarkus эҷод мекунем, ки системаи оддии коркарди фармоиш бо истифода аз паёмнависии реактивӣ хоҳад буд. Ин барнома як тавлидкунандаи фармоишро дар бар мегирад, ки фармоишҳоро ба навбати паём дар фосилаи муқарраршуда мефиристад ва инчунин протсессори фармоиш, ки паёмҳоро аз навбат коркард мекунад ва тасдиқи дар браузер дидашаванда тавлид мекунад.

Пас аз он ки мо барномаро эҷод кардем, мо ба шумо нишон медиҳем, ки чӣ тавр конфигуратсияи системаи паёмнависиро ба барнома ворид кардан мумкин аст ва AMQ Online-ро барои таъмини захираҳои лозима дар система истифода баред.

Барномаи Quarkus

Замимаи 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 номаълум аст, бинобар ин онҳо бояд ворид карда шаванд. Нуқтаи ниҳоӣ метавонад дар конфигуратсияе, ки аз ҷониби 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 истифода мебурдем, Нақш ва Нақш бояд муқаррар карда шаванд:

---
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 амалӣ кардем. Пас аз он мо манифестҳоеро сохтем, ки барои ба кор андохтани системаи паёмнависӣ барои замимаи мо заруранд.

Бо ин силсила дар бораи Кваркус ба охир мерасад, аммо дар пеш чизҳои нав ва ҷолиб дар пеш аст, бохабар бошед!

Манбаъ: will.com

Илова Эзоҳ