本文介绍如何使用 Quarkus 开发微服务,这些微服务使用在 Kubernetes 集群中运行的 Apache Kafka。
Quarkus 支持 MicroProfile Reactive Messaging 与 Apache Kafka 进行交互。有一个很好的指南,将 Apache Kafka 与响应式消息传递一起使用,它解释了如何向 Kafka 发送和接收消息。
本指南包含有关如何使用 docker-compose 通过 Docker 在本地运行 Kafka 的说明。虽然这可能是最简单的入门方法,但对于微服务开发人员来说,下一步通常是弄清楚如何在 Kubernetes 环境或托管的 Kafka 服务中访问 Apache Kafka。
选项 1:在 Kubernetes 中运行 Apache Kafka
开源项目 Strimzi 提供了用于在 Kubernetes 和 Red Hat OpenShift 上运行 Apache Kafka 的容器镜像和运算符。在 Red Hat Developer 上有一个不错的博客系列,描述了如何使用 Strimzi。要从应用程序访问它,有几个不同的选项,例如 NodePorts、OpenShift 路由、负载均衡器和 Ingress。
有时,这些选项可能会让开发人员不知所措,尤其是当您只需要一个简单的开发环境来编写一些响应式 hello world 应用程序即可开始使用时。就我而言,我想在我的 Minikube 集群中安装一个简单的 Kafka 服务器。
有一个关于如何将 Strimzi 部署到 Minikube 的快速入门指南。不幸的是,它没有解释如何从应用程序访问它。
基于这两篇文章,我编写了一个简单的脚本,在不到 5 分钟的时间内将 Kafka 部署到 Minikube。该脚本是 cloud-native-starter 项目的一部分。运行以下命令试一试:
$ git clone https://github.com/IBM/cloud-native-starter.git
$ cd cloud-native-starter/reactive
$ sh scripts/start-minikube.sh
$ sh scripts/deploy-kafka.sh
$ sh scripts/show-urls.sh
最后一个命令的输出打印出 Kafka 引导服务器的 URL,下一步将需要该 URL。您可以在“Kafka”命名空间中找到所有资源。
要从 Quarkus 访问 Kafka,必须配置 Kafka 连接器。在与 Kafka 相同的 Kubernetes 集群中运行 Quarkus 应用程序时,请在“application.properties”中使用以下配置。“my-cluster-Kafka-external-bootstrap”是服务名称,“Kafka”是命名空间,“9094”是端口。
kafka.bootstrap.servers=my-cluster-kafka-external-bootstrap.kafka:9094
mp.messaging.incoming.new-article-created.connector=smallrye-kafka
mp.messaging.incoming.new-article-created.value.deserializer=org.apache.kafka.common.serialization.StringDeserializer
在本地开发 Quarkus 应用程序时,Minikube 中的 Kafka 是通过 NodePort 访问的。在这种情况下,请将 kafka.bootstrap.servers 配置替换为以下 URL:
$ minikubeip=$(minikube ip)
$ nodeport=$(kubectl get svc my-cluster-kafka-external-bootstrap -n kafka --ignore-not-found --output 'jsonpath={.spec.ports[*].nodePort}')
$ echo ${minikubeip}:${nodeport}
选项 2:Kafka 即服务
大多数云提供商还托管托管 Kafka 服务。例如,Event Streams 是 IBM Cloud 中的托管 Kafka 服务。有一个免费的精简计划,它提供对多租户事件流群集中单个分区的访问。您只需要一个 IBM ID,它是免费的,您不需要信用卡。
与生产中的大多数 Kafka 服务一样,事件流需要安全连接。需要再次在“application.properties”中定义此附加配置。
kafka.bootstrap.servers=broker-0-YOUR-ID.kafka.svc01.us-south.eventstreams.cloud.ibm.com:9093,broker-4-YOUR-ID.kafka.svc01.us-south.eventstreams.cloud.ibm.com:9093,...MORE-SERVERS
mp.messaging.incoming.new-article-created.connector=smallrye-kafka
mp.messaging.incoming.new-article-created.value.deserializer=org.apache.kafka.common.serialization.StringDeserializer
mp.messaging.incoming.new-article-created.sasl.mechanism=PLAIN
mp.messaging.incoming.new-article-created.security.protocol=SASL_SSL
mp.messaging.incoming.new-article-created.ssl.protocol=TLSv1.2
mp.messaging.incoming.new-article-created.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="token" password="YOUR-PASSWORD";
要输入此信息,您需要 1。Kafka 引导服务器列表和 2.事件流服务的密码。您可以在 Event Streams 服务的 Web 前端接收此信息,也可以使用 IBM Cloud CLI。
我的同事 Harald Uebele 开发了一个脚本,该脚本以编程方式创建服务并返回这两条信息。
后续步骤
本文中提到的脚本是 cloud-native-starter 项目的一部分,该项目描述了如何使用 Quarkus 开发响应式应用程序。我之前的文章描述了这个项目。