问题描述
事件中心提供 Kafka 终结点,现有的基于 Kafka 的应用程序可将该终结点用作运行你自己的 Kafka 群集的替代方案。 事件中心可与许多现有 Kafka 应用程序配合使用。在Azure官方提供的Demo中,都是针对Global Azure。以下内容通过实验来一步一步调试并在Azure中国区连接Event Hub成功。
操作步骤
- 准备好Event Hub的连接字符串,可以是Namespace级别的SAS connection string,也可以是Event Hub Instance(Topic)级的连接字符串
- Event Hub Namespace 级别的连接字符串格式为:
Endpoint=sb://
mynamespace.servicebus.chinacloudapi.cn
/;SharedAccessKeyName=XXXXXX;SharedAccessKey=XXXXXX
- Event Hub Instance 级别的连接字符串格式为:
Endpoint=sb://
mynamespace.servicebus.chinacloudapi.cn
/;SharedAccessKeyName=XXXXXX;SharedAccessKey=XXXXXX
;EntityPath=XXXXXX - 注:如果您使用的是Global Azure,Event Hub的域名地址为 *
.servicebus.windows.net
.
- 从Github中下载Java版本Demo代码:https://github.com/Azure/azure-event-hubs-for-kafka/tree/master/quickstart/java
git clone https://github.com/Azure/azure-event-hubs-for-kafka.git
cd azure-event-hubs-for-kafka/quickstart/java
在Demo代码中,有两部分代码发送消息的Producer和消费消息的Consumer. 他们的文件结构如下:
- Producer:使用Demo中的Producer项目代码,发送消息到事件中心,如果需要修改kafka的版本,可以在pom.xml文件中修改kafka依赖的版本信息。
- Consumer:使用Demo中的Consumer项目代码,从开启Kafka终结点的事件中心接受消息。如果需要修改kafka的版本,可以在pom.xml文件中修改kafka依赖的版本信息。
第一步:修改发送端的Kafka连接字符串和TOPIC名称
在producer.config文件中修改bootstrap.servers
和 sasl.jaas.config 的值。使用事件中心的kafka终结点(Event Hubs Kafka endpoint)。
bootstrap.servers=youreventhubnamespacename.servicebus.chinacloudapi.cn:9093
security.protocol=SASL_SSL
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="$ConnectionString" password="Endpoint=sb://youreventhubnamespacename.servicebus.chinacloudapi.cn/;SharedAccessKeyName=manage;SharedAccessKey=xxxxxx;EntityPath=testmessage";
同时也在TestProducer.java文件中修改TOPIC值。如这次测试中使用的是testmessage
第二步:修改消费端的Kafka连接字符串和TOPIC名称
在consumer.config文件中修改bootstrap.servers
和 sasl.jaas.config 的值。使用事件中心的kafka终结点(Event Hubs Kafka endpoint)。
bootstrap.servers=youreventhubnamespacename.servicebus.chinacloudapi.cn:9093 group.id=$Default request.timeout.ms=60000 security.protocol=SASL_SSL sasl.mechanism=PLAIN sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="$ConnectionString" password="Endpoint=sb://youreventhubnamespacename.servicebus.chinacloudapi.cn/;SharedAccessKeyName=manage;SharedAccessKey=xxxxxx;EntityPath=testmessage";
同时也在TestConsumer.java文件中修改TOPIC值。如这次测试中使用的是testmessage
第三步:调试发送端和消费端代码
在VS Code中直接调试代码,点击F5启动或者在Mian方法之上点击run or debug linkbutton。测试效果如:
错误一:Invalid SASL mechanism response, server may be expecting a different protocol / Error reading field 'sasl_auth_bytes': Bytes size -1 cannot be negative
在开始Debug Producer代码时,出现了无效的SASL响应,Event Hub服务端不支持当前使用的kafka协议错误 (Invalid SASL mechanism response, server may be expecting a different protocol)。原来是由于使用的Event Hub定价层为基本层,而Azure支持Apache Kafka协议是在标准版和专用版。所以回到Azure Event Hub的定价层页面,升级到标准版后就可以成功连接到事件中心(Event Hub)。
This error occurs when publishing to a basic plan Event Hub, as the basic plan does not support interaction via Kafka protocol.An upgrade to a standard plan should resolve this. https://azure.microsoft.com/en-au/pricing/details/event-hubs/
参考资料
Send and Receive Messages in Java using Azure Event Hubs for Apache Kafka Ecosystems: https://github.com/Azure/azure-event-hubs-for-kafka/tree/master/quickstart/java
针对 Azure 事件中心的 Apache Kafka 开发人员指南: https://docs.azure.cn/zh-cn/event-hubs/apache-kafka-developer-guide
Not able connect to EventHub via KAFKA api: https://stackoverflow.com/questions/59891094/not-able-connect-to-eventhub-via-kafka-api