Quarkus සහ AMQ ඔන්ලයින් භාවිතා කරමින් Red Hat OpenShift වේදිකාවේ Cloud-native පණිවිඩ යැවීම

ආයුබෝවන් සියල්ලටම! මෙන්න එය - ක්වාර්කස් ලිපි මාලාවේ අපගේ අවසාන සටහන! (මාර්ගය වන විට, අපගේ webinar බලන්න "මෙය Quarkus - Kubernetes ස්වදේශික ජාවා රාමුව". අපි ඔබට මුල සිට ආරම්භ කරන ආකාරය හෝ සූදානම් කළ විසඳුම් මාරු කරන්නේ කෙසේදැයි පෙන්වන්නෙමු)

Quarkus සහ AMQ ඔන්ලයින් භාවිතා කරමින් Red Hat OpenShift වේදිකාවේ Cloud-native පණිවිඩ යැවීම

В කලින් මෙම ලිපියෙන් අපි Java යෙදුම් නවීකරණය කිරීමේ ප්‍රතිඵලයක් ලෙස ලබා ගත් වැඩිදියුණු කිරීම් ප්‍රමාණාත්මක කිරීමට භාවිතා කළ හැකි අදාළ මෙවලම් දෙස බැලුවෙමු.

0.17.0 අනුවාදයේ සිට, ක්වාර්කස් උසස් පණිවිඩ පෝලිම් ප්‍රොටෝකෝලය භාවිතා කිරීමට සහය දක්වයි (AMQP), එය යෙදුම් හෝ සංවිධාන අතර ව්‍යාපාරික පණිවිඩ මාරු කිරීම සඳහා විවෘත ප්‍රමිතියකි.

Red Hat AMQ ඔන්ලයින් විවෘත මූලාශ්‍ර ව්‍යාපෘතියක පදනම මත ගොඩනැගුණු සේවාවකි EnMasse සහ වේදිකාව මත පදනම් වූ පණිවිඩ යැවීමේ යාන්ත්‍රණයක් ක්‍රියාත්මක කිරීම RedHat OpenShift. එය ක්‍රියා කරන ආකාරය පිළිබඳ වැඩි විස්තර සඳහා, බලන්න මෙන්න (EN). අද අපි ඔබට AMQ ඔන්ලයින් සහ Quarkus ඒකාබද්ධ කර නව පණිවිඩකරණ තාක්ෂණයන් දෙකක් භාවිතා කරමින් නවීන OpenShift මත පදනම් වූ පණිවුඩකරණ පද්ධතියක් ගොඩනඟන්නේ කෙසේදැයි පෙන්වන්නෙමු.

ඔබ දැනටමත් OpenShift වේදිකාවේ AMQ ඔන්ලයින් යොදවා ඇති බව උපකල්පනය කෙරේ (එසේ නොවේ නම්, බලන්න ස්ථාපන මාර්ගෝපදේශය).

ආරම්භ කිරීමට, අපි ප්‍රතික්‍රියාශීලී පණිවිඩ යැවීම භාවිතයෙන් සරල ඇණවුම් සැකසුම් පද්ධතියක් වන Quarkus යෙදුමක් සාදන්නෙමු. මෙම යෙදුමට නියමිත කාල පරතරයකින් පණිවිඩ පෝලිමකට ඇණවුම් යවන ඇණවුම් උත්පාදක යන්ත්‍රයක් මෙන්ම පෝලිමෙන් පණිවිඩ සකසන සහ බ්‍රවුසරයේ දැකිය හැකි තහවුරු කිරීම් උත්පාදනය කරන ඇණවුම් ප්‍රොසෙසරයක් ඇතුළත් වේ.

අපි යෙදුම නිර්මාණය කළ පසු, අපි ඔබට පණිවිඩ පද්ධති වින්‍යාසය යෙදුමට කාවැද්දීම සහ පද්ධතියට අවශ්‍ය සම්පත් සැපයීමට AMQ ඔන්ලයින් භාවිතා කරන්නේ කෙසේදැයි පෙන්වන්නෙමු.

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 ඔන්ලයින් වෙත සම්බන්ධ වීමට, අපගේ යෙදුමට සමහර වින්‍යාස දත්ත අවශ්‍ය වනු ඇත, එනම්: Quarkus සම්බන්ධක වින්‍යාසය, AMQP අන්ත ලක්ෂ්‍ය තොරතුරු සහ සේවාදායක අක්තපත්‍ර. ඇත්ත වශයෙන්ම, සියලුම වින්‍යාස දත්ත එක තැනක තබා ගැනීම වඩා හොඳය, නමුත් Quarkus යෙදුම වින්‍යාස කිරීම සඳහා හැකි විකල්ප පෙන්වීමට අපි ඒවා හිතාමතාම වෙන් කරන්නෙමු.

සම්බන්ධක

යෙදුම් ගුණාංග ගොනුවක් භාවිතයෙන් සම්පාදනය කරන අවස්ථාවේදී සම්බන්ධක වින්‍යාසය සැපයිය හැක:

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 වෙත සත්‍යාපනය කිරීමට සේවා ගිණුම් ටෝකනය භාවිතා කළ හැක. මෙය සිදු කිරීම සඳහා, ඔබ පළමුව පොඩ් ගොනු පද්ධතියෙන් සත්‍යාපන ටෝකනය කියවන අභිරුචි වින්‍යාස මූලාශ්‍රයක් සෑදිය යුතුය:

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 ඔන්ලයින් හි අපට අවශ්‍ය පණිවිඩකරණ සම්පත් වින්‍යාස කරන තෙක් ආරම්භ නොවේ.

පණිවිඩ පද්ධතිය සැකසීම

දැන් ඉතිරිව ඇත්තේ අපගේ යෙදුමට අවශ්‍ය සම්පත් පණිවිඩ පද්ධතිය තුළ සැකසීමයි. මෙය සිදු කිරීම සඳහා, ඔබ විසින් නිර්මාණය කළ යුතුය: 1) පණිවුඩකරණ පද්ධතියේ අවසාන ලක්ෂ්යය ආරම්භ කිරීම සඳහා ලිපින අවකාශයක්; 2) අපි යෙදුමේ භාවිතා කරන ලිපින වින්‍යාස කිරීමට ලිපිනය; 3) සේවාදායක අක්තපත්‍ර සැකසීමට පරිශීලකයාට පණිවිඩ යැවීම.

ලිපින අවකාශය

AMQ ඔන්ලයින් හි 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 ඔන්ලයින් විසින් 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 ඔන්ලයින් මගින් පණිවිඩ යැවීම සහ ලැබීම නිසා ටිකට්පත් කාලානුරූපව යාවත්කාලීන වන බව බ්‍රවුසරය පෙන්විය යුතුය.

සාරාංශගත කිරීම

එබැවින් අපි පණිවිඩ යැවීම සඳහා AMQP භාවිතා කරන Quarkus යෙදුමක් ලියා, Red Hat OpenShift වේදිකාව මත ධාවනය කිරීමට යෙදුම වින්‍යාස කර, AMQ ඔන්ලයින් වින්‍යාසය මත පදනම්ව එහි වින්‍යාසය ක්‍රියාත්මක කළෙමු. පසුව අපි අපගේ යෙදුම සඳහා පණිවිඩ පද්ධතිය ආරම්භ කිරීමට අවශ්‍ය මැනිෆෙස්ටයන් නිර්මාණය කළෙමු.

මෙය ක්වාර්කස් පිළිබඳ ලිපි මාලාව අවසන් කරයි, නමුත් ඉදිරියට නව හා රසවත් දේවල් රාශියක් ඇත, රැඳී සිටින්න!

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න