Quarkus және AMQ Online көмегімен Red Hat OpenShift платформасында бұлтты хабар алмасу

Бәріңе сәлем! Міне, біздің Quarkus сериясындағы соңғы жазбамыз! (Айтпақшы, вебинарымызды қараңыз «Бұл Quarkus - Kubernetes Java негізі». Біз сізге нөлден бастауды немесе дайын шешімдерді беруді көрсетеміз)

Quarkus және AMQ Online көмегімен Red Hat OpenShift платформасында бұлтты хабар алмасу

В алдыңғы Бұл мақалада біз Java қосымшаларын модернизациялау нәтижесінде алынған жақсартуларды сандық бағалау үшін қолдануға болатын тиісті құралдарды қарастырдық.

0.17.0 нұсқасынан бастап, Кваркус Кеңейтілген хабарлама кезегі протоколын пайдалануды қолдайды (AMQP), бұл қолданбалар немесе ұйымдар арасында іскери хабарларды тасымалдауға арналған ашық стандарт.

Red Hat AMQ онлайн ашық бастапқы жоба негізінде құрылған қызмет EnMasse және платформаға негізделген хабар алмасу механизмін енгізу Red Hat OpenShift. Оның қалай жұмыс істейтіні туралы қосымша ақпаратты қараңыз мұнда (EN). Бүгін біз екі жаңа хабар алмасу технологиясын пайдалана отырып, заманауи OpenShift негізіндегі хабар алмасу жүйесін құру үшін AMQ Online және Quarkus біріктіру жолын көрсетеміз.

Сіз OpenShift платформасында AMQ Online орнатқансыз деп болжанады (егер олай болмаса, қараңыз). орнату нұсқаулығы).

Бастау үшін біз реактивті хабар алмасу арқылы қарапайым тапсырысты өңдеу жүйесі болатын 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++);
    }
}

Тапсырыс процессоры

Тапсырыс өңдеушісі одан да қарапайым, ол жай ғана растау идентификаторын «растаулар» мекенжайына қайтарады.

@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) Клиенттің тіркелгі деректерін орнату үшін хабар алмасу пайдаланушысы.

Мекенжай кеңістігі

AMQ Online жүйесіндегі AddressSpace нысаны қосылымның соңғы нүктелерін және аутентификация мен авторизация саясаттарын ортақ пайдаланатын мекенжайлар тобы болып табылады. Мекенжай кеңістігін жасағанда, хабар алмасу соңғы нүктелерінің қалай ашылатынын көрсетуге болады:

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 арқылы хабарламалар жіберіліп, қабылданатындықтан, билеттер мерзімді түрде жаңартылып тұратынын көрсетуі керек.

Қорытындылау

Сонымен, біз хабар алмасу үшін AMQP қолданатын Quarkus қолданбасын жаздық, қолданбаны Red Hat OpenShift платформасында жұмыс істейтін етіп конфигурацияладық және оның конфигурациясын AMQ Online конфигурациясына негізделген іске асырдық. Содан кейін қолданбамыз үшін хабар алмасу жүйесін инициализациялау үшін қажетті манифесттерді жасадық.

Осымен Кваркус туралы серия аяқталады, бірақ алда көптеген жаңа және қызықты нәрселер бар, бізбен бірге болыңыз!

Ақпарат көзі: www.habr.com

пікір қалдыру