sample-quarkus-serverless-kafka
sample-quarkus-serverless-kafka copied to clipboard
Demo illustrating how to run Quarkus application on Knative Eventing with Kafka and Funqy modules
Serverless with Knative Eventing and Quarkus
Getting Started
Currently, you may find here some examples of microservices implementation using different projects from Quarkus. All the examples are divided into the branches and described in a separated articles on my blog. Here's a full list of available examples:
- Using Knative Serving and Eventing components with Quarkus and Kafka to build event-driven microservices architecture in declarative way. The example is available in the branch master. A detailed guide may be found in the following article: Knative Eventing with Kafka and Quarkus
- Update to the Knative Eventing focusing on
KafkaSink
, OpenShift and REST client interaction with event-mesh. A detailed guide may be found in the following article: Serverless on OpenShift with Knative, Quarkus and Kafka
Usage
Architecture
Run with Quarkus
- Login to OpenShift Dashboard and create the
demo-eventing
project (oc new-project demo-eventing
) - Create the Knative
Broker
with thekn broker create default
- Build the and deploy to OpenShift by activating the already defined
openshift
Maven profile:mvn clean package -Popenshift
Test on OpenShift
!!! For those who don't want to deploy using Quarkus Kubernetes extension and Maven.
- Login to OpenShift Dashboard https://console-openshift-console.apps.qyt1tahi.eastus.aroapp.io/
- Create your project
- Create Knative
Broker
apiVersion: eventing.knative.dev/v1
kind: Broker
metadata:
annotations:
eventing.knative.dev/broker.class: MTChannelBasedBroker
name: default
spec:
config:
apiVersion: v1
kind: ConfigMap
name: config-br-default-channel
namespace: knative-eventing
- Deploy applications
order-service
-> quay.io/pminkows/order-service. Set env KAFKA_TOPIC
, TICK_TIMEOUT
stock-service
-> quay.io/pminkows/stock-service. Set env KAFKA_TOPIC
payment-service
-> quay.io/pminkows/payment-service. Set env KAFKA_TOPIC
- Create
KafkaBinding
for each application to inject Kafka address (only older versions of Kafka)
For stock-service
:
apiVersion: bindings.knative.dev/v1beta1
kind: KafkaBinding
metadata:
name: kafka-binding-stock
spec:
subject:
apiVersion: serving.knative.dev/v1
kind: Service
name: stock-service
bootstrapServers:
- my-cluster-kafka-bootstrap.kafka:9092
For payment-service
:
apiVersion: bindings.knative.dev/v1beta1
kind: KafkaBinding
metadata:
name: kafka-binding-payment
spec:
subject:
apiVersion: serving.knative.dev/v1
kind: Service
name: payment-service
bootstrapServers:
- my-cluster-kafka-bootstrap.kafka:9092
For order-service
:
apiVersion: bindings.knative.dev/v1beta1
kind: KafkaBinding
metadata:
name: kafka-binding-order
spec:
subject:
apiVersion: serving.knative.dev/v1
kind: Service
name: order-service
bootstrapServers:
- my-cluster-kafka-bootstrap.kafka:9092
- Create
KafkaSource
to get messages from Kafka and send them to the KnativeBroker
apiVersion: sources.knative.dev/v1beta1
kind: KafkaSource
metadata:
name: kafka-source-to-broker
spec:
bootstrapServers:
- my-cluster-kafka-bootstrap.kafka:9092
topics:
- <your-order-events-topic>
- <your-reserve-events-topic>
sink:
ref:
apiVersion: eventing.knative.dev/v1
kind: Broker
name: default
- Create Knative
Trigger
for applications
For stock-service
:
apiVersion: eventing.knative.dev/v1
kind: Trigger
metadata:
name: stock-trigger
spec:
broker: default
filter:
attributes:
source: /apis/v1/namespaces/<your-namespace>/kafkasources/kafka-source-to-broker#<your-topic>
type: dev.knative.kafka.event
subscriber:
ref:
apiVersion: serving.knative.dev/v1
kind: Service
name: stock-service
uri: /reserve
For payment-service
:
apiVersion: eventing.knative.dev/v1
kind: Trigger
metadata:
name: payment-trigger
spec:
broker: default
filter:
attributes:
source: /apis/v1/namespaces/<your-namespace>/kafkasources/kafka-source-to-broker#<your-topic>
type: dev.knative.kafka.event
subscriber:
ref:
apiVersion: serving.knative.dev/v1
kind: Service
name: payment-service
uri: /reserve
For order-service
:
apiVersion: eventing.knative.dev/v1
kind: Trigger
metadata:
name: order-trigger
spec:
broker: default
filter:
attributes:
source: /apis/v1/namespaces/<your-namespace>/kafkasources/kafka-source-to-broker#<your-topic>
type: dev.knative.kafka.event
subscriber:
ref:
apiVersion: serving.knative.dev/v1
kind: Service
name: order-service
uri: /confirm
- Configure autoscaling for
payment-service
andstock-service
Edit Knative Service
YAML and add the following annotations:
annotations:
autoscaling.knative.dev/target: "50"
autoscaling.knative.dev/metric: "rps"
- Change timeout for
order-service
Edit Knative Service
YAML and change TICK_TIMEOUT
env