Салом ба ҳама! Ин аст - паёми ниҳоии мо дар силсилаи Quarkus! (Дар омади гап, вебинари моро тамошо кунед
В
Аз версияи 0.17.0,
Тахмин меравад, ки шумо аллакай AMQ Online-ро дар платформаи OpenShift ҷойгир кардаед (агар не, пас нигаред.
Барои оғоз, мо як барномаи Quarkus эҷод мекунем, ки системаи оддии коркарди фармоиш бо истифода аз паёмнависии реактивӣ хоҳад буд. Ин барнома як тавлидкунандаи фармоишро дар бар мегирад, ки фармоишҳоро ба навбати паём дар фосилаи муқарраршуда мефиристад ва инчунин протсессори фармоиш, ки паёмҳоро аз навбат коркард мекунад ва тасдиқи дар браузер дидашаванда тавлид мекунад.
Пас аз он ки мо барномаро эҷод кардем, мо ба шумо нишон медиҳем, ки чӣ тавр конфигуратсияи системаи паёмнависиро ба барнома ворид кардан мумкин аст ва AMQ Online-ро барои таъмини захираҳои лозима дар система истифода баред.
Барномаи Quarkus
Замимаи Quarkus мо дар OpenShift кор мекунад ва версияи тағирёфтаи барнома мебошад
Фармоиш генератор
Генератор ба таври оддӣ ҳар 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