ΠΠ΄ΡΠ°Π²ΠΎ Π½Π° ΡΠΈΡΠ΅! ΠΠ²Π΅ Π³ΠΎ - Π½Π°ΡΠ°ΡΠ° ΠΏΠΎΡΠ»Π΅Π΄Π½Π° ΠΎΠ±ΡΠ°Π²Π° Π²ΠΎ ΡΠ΅ΡΠΈΡΠ°ΡΠ° ΠΠ²Π°ΡΠΊΡΡ! (ΠΠ°ΡΠ΅ΠΌ, Π³Π»Π΅Π΄Π°ΡΡΠ΅ Π³ΠΎ Π½Π°ΡΠΈΠΎΡ Π²Π΅Π±ΠΈΠ½Π°Ρ
Π
ΠΠ΄ Π²Π΅ΡΠ·ΠΈΡΠ°ΡΠ° 0.17.0,
Π‘Π΅ ΠΏΡΠ΅ΡΠΏΠΎΡΡΠ°Π²ΡΠ²Π° Π΄Π΅ΠΊΠ° Π²Π΅ΡΠ΅ ΡΡΠ΅ Π³ΠΎ ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΠΈΠ»Π΅ AMQ Online Π½Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°ΡΠ° OpenShift (Π°ΠΊΠΎ Π½Π΅, ΡΠΎΠ³Π°Ρ Π²ΠΈΠ΄Π΅ΡΠ΅
ΠΠ° ΠΏΠΎΡΠ΅ΡΠΎΠΊ, ΡΠ΅ ΡΠΎΠ·Π΄Π°Π΄Π΅ΠΌΠ΅ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° Quarkus ΠΊΠΎΡΠ° ΡΠ΅ Π±ΠΈΠ΄Π΅ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π΅Π½ ΡΠΈΡΡΠ΅ΠΌ Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Π½Π°ΡΠ°ΡΠΊΠΈ ΡΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° ΡΠ΅Π°ΠΊΡΠΈΠ²Π½ΠΈ ΠΏΠΎΡΠ°ΠΊΠΈ. ΠΠ²Π°Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΡΠ΅ Π²ΠΊΠ»ΡΡΡΠ²Π° Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ Π½Π° Π½Π°ΡΠ°ΡΠΊΠΈ ΠΊΠΎΡ ΠΈΡΠΏΡΠ°ΡΠ° Π½Π°ΡΠ°ΡΠΊΠΈ Π΄ΠΎ ΡΠ΅Π΄ΠΎΡ Π·Π° ΠΏΠΎΡΠ°ΠΊΠΈ Π²ΠΎ ΡΠΈΠΊΡΠ΅Π½ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π», ΠΊΠ°ΠΊΠΎ ΠΈ ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π·Π° Π½Π°ΡΠ°ΡΠΊΠΈ ΠΊΠΎΡ ΡΠ΅ Π³ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠ²Π° ΠΏΠΎΡΠ°ΠΊΠΈΡΠ΅ ΠΎΠ΄ ΡΠ΅Π΄ΠΎΡ ΠΈ ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ° ΠΏΠΎΡΠ²ΡΠ΄ΠΈ ΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π²ΠΈΠ΄Π°Ρ Π²ΠΎ ΠΏΡΠ΅Π»ΠΈΡΡΡΠ²Π°ΡΠΎΡ.
ΠΡΠΊΠ°ΠΊΠΎ ΡΠ΅ ΡΠ° ΡΠΎΠ·Π΄Π°Π΄Π΅ΠΌΠ΅ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ°, ΡΠ΅ Π²ΠΈ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌΠ΅ ΠΊΠ°ΠΊΠΎ Π΄Π° ΡΠ° Π²Π³ΡΠ°Π΄ΠΈΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π½Π° ΡΠΈΡΡΠ΅ΠΌΠΎΡ Π·Π° ΠΏΠΎΡΠ°ΠΊΠΈ Π²ΠΎ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° ΠΈ Π΄Π° Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ AMQ Online Π·Π° Π΄Π° Π³ΠΈ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈΠΌΠ΅ ΡΠ΅ΡΡΡΡΠΈΡΠ΅ ΡΡΠΎ Π½ΠΈ ΡΠ΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΈ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠΎΡ.
ΠΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΠΠ²Π°ΡΠΊΡΡ
ΠΠ°ΡΠ°ΡΠ° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° Quarkus ΡΠ°Π±ΠΎΡΠΈ Π½Π° OpenShift ΠΈ Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅ΡΠ° Π²Π΅ΡΠ·ΠΈΡΠ° Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°
ΠΠ΅Π½Π΅ΡΠ°ΡΠΎΡ Π½Π° Π½Π°ΡΠ°ΡΠΊΠΈ
ΠΠ΅Π½Π΅ΡΠ°ΡΠΎΡΠΎΡ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ ΠΌΠΎΠ½ΠΎΡΠΎΠ½ΠΎ ΠΈΡΠΏΡΠ°ΡΠ° ID Π½Π° ΡΠ°ΡΡΠ΅ΡΠΊΠΈ Π½Π°ΡΠ°ΡΠΊΠΈ Π½Π° Π°Π΄ΡΠ΅ΡΠ°ΡΠ° βΠ½Π°ΡΠ°ΡΠΊΠΈβ Π½Π° ΡΠ΅ΠΊΠΎΠΈ 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, ΠΌΠΎΡΠ° Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΠ°Π²Π°Ρ 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.
Π‘ΡΠΌΠΈΡΠ°ΡΠ΅
Π’Π°ΠΊΠ°, Π½Π°ΠΏΠΈΡΠ°Π²ΠΌΠ΅ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° Quarkus ΠΊΠΎΡΠ° ΠΊΠΎΡΠΈΡΡΠΈ AMQP Π·Π° ΠΏΠΎΡΠ°ΠΊΠΈ, ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π²ΠΌΠ΅ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ Π½Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°ΡΠ° Red Hat OpenShift ΠΈ ΡΠ° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°Π²ΠΌΠ΅ Π½Π΅ΡΠ·ΠΈΠ½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° AMQ Online. ΠΠΎΡΠΎΠ° Π³ΠΈ ΠΊΡΠ΅ΠΈΡΠ°Π²ΠΌΠ΅ ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠ°ΡΠΈΠΈΡΠ΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΈ Π·Π° ΠΈΠ½ΠΈΡΠΈΡΠ°Π»ΠΈΠ·ΠΈΡΠ°ΡΠ΅ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠΎΡ Π·Π° ΠΏΠΎΡΠ°ΠΊΠΈ Π·Π° Π½Π°ΡΠ°ΡΠ° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°.
Π‘ΠΎ ΠΎΠ²Π° Π·Π°Π²ΡΡΡΠ²Π° ΡΠ΅ΡΠΈΡΠ°ΡΠ° Π·Π° Quarkus, Π½ΠΎ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³Ρ Π½ΠΎΠ²ΠΈ ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΈ ΡΠ°Π±ΠΎΡΠΈ Π½Π°ΠΏΡΠ΅Π΄, ΠΎΡΡΠ°Π½Π΅ΡΠ΅ Π²ΠΎ ΡΠ΅ΠΊ!
ΠΠ·Π²ΠΎΡ: www.habr.com