kafka使用笔记-librdkafka支持sasl认证

由于业务需要,需要在librdkafka开源库的基础上增加SASL认证。相关的资料又比较少,特此记录,以便后用。本此librdkafka的使用时在windows平台,。

一、版本和准备工作

1、librdkafka
由于之前一直使用的是librdkafka0.9版本,编译之后死活认证失败,最后拉取最新版本,测试可用。点击此处 下载最新librdkafka源码
2、openssl
由于librdkafka编译时是需要ssl的,因此需要OpenSSL的库支持。可以根据自己的情况选择自己编译或者直接下载已经在各平台编译好的库,此处下载openssl源码,我这里选择已经编译好的库及头文件,点击此处下载openssl库,提取码:gf4h
3.sasl
sasl的库在编译librdkafka时不是必须的,但是我们要支持sasl认证,所以也是需要该库文件的。同OpenSSL一样,sasl也是开源的,此处下载cyrus-sasl源码,大家根据自己的情况自己编译或者下载相应的文件,我这里同样使用的是下载好的文件,点击此处下载windows平台sasl安装包,提取码:0tnc
下载 完cyrus-sasl 之后,根据自己需要安装x86或者x64的版本,安装时默认下一步,我这边安装结构如下:
kafka使用笔记-librdkafka支持sasl认证_第1张图片
根据自己需要使用dll或者lib库,我选择了lib库文件,留着待用,后续编译时会使用到。
kafka使用笔记-librdkafka支持sasl认证_第2张图片

二、编译

1、准备工作
解压并打开已经下载的librdkafka目录,选择win32目录。打开.sln文件,准备编译,我这边使用的VS2015社区版,其他的windows编译器理论上是能够编译的(除vc6),如下结构:
kafka使用笔记-librdkafka支持sasl认证_第3张图片
工程结构,根据自己需要编译,一般只需要编译librdkafka工程即可。由于项目中使用到了librdkafkacpp的dll,所以我编译了红色框内的所有工程。
kafka使用笔记-librdkafka支持sasl认证_第4张图片
2、工程设置
根据自己需要选择dll或者lib文件,后面我选择的都是lib库。添加openssl的头文件和lib文件,添加cyrus-sasl 的库文件(前面安装得到的lib文件),如图示:
1)添加openssl的头文件
kafka使用笔记-librdkafka支持sasl认证_第5张图片
2)添加openssl和sasl的lib库文件
kafka使用笔记-librdkafka支持sasl认证_第6张图片
kafka使用笔记-librdkafka支持sasl认证_第7张图片

3、编译librdkafka之后,根据需要再编译其他的即可

到此,windows平台下支持sasl认证的librdkafka库编译完成了。

三、题外

由于项目中使用到了librdkafka中自带的dll再次封装库librdkafkacpp,查看了一下封装,对于使用的人来感觉说并不是很友好,需要拿到封装后的细节。测试demo:

#include "rdkafkacpp.h"
#include 
#include 

using namespace std;

int consumer()
{
	std::string strErr;
	std::string strBootstrp = "172.20.36.103:9092";
	std::string strProtocol = "sasl_plaintext";
	std::string strMechanisms = "PLAIN";
	std::string strUsername = "alice";
	std::string strPassword = "geting";
	std::string strTopic = "test";
	std::string strGrouId = "group2";
	std::string strApiVersion = "true";
	std::string strOffset = "earliest";

	vector vectTopics;
	vectTopics.push_back(strTopic);

	//创建一个配置
	RdKafka::Conf* pConf = RdKafka::Conf::create(RdKafka::Conf::CONF_GLOBAL);
	if (RdKafka::Conf::CONF_OK != pConf->set("bootstrap.servers", strBootstrp, strErr))
	{
		cout << "bootstrap.servers 初始化失败" << endl;
	}
	if (RdKafka::Conf::CONF_OK != pConf->set("security.protocol", strProtocol, strErr))
	{
		cout << "security.protocol 初始化失败" << endl;
	}
	if (RdKafka::Conf::CONF_OK != pConf->set("sasl.mechanisms", strMechanisms, strErr))
	{
		cout << "sasl.mechanisms 初始化失败" << endl;
	}
	if (RdKafka::Conf::CONF_OK != pConf->set("sasl.username", strUsername, strErr))
	{
		cout << "sasl.username 初始化失败" << endl;
	}
	if (RdKafka::Conf::CONF_OK != pConf->set("sasl.password", strPassword, strErr))
	{
		cout << "sasl.password 初始化失败" << endl;
	}
	if (RdKafka::Conf::CONF_OK != pConf->set("group.id", strGrouId, strErr))
	{
		cout << "group.id 初始化失败" << endl;
	}
	if (RdKafka::Conf::CONF_OK != pConf->set("api.version.request", strApiVersion, strErr))
	{
		cout << "api.version.request 初始化失败" << endl;
	}
	if (RdKafka::Conf::CONF_OK != pConf->set("auto.offset.reset", strOffset, strErr))
	{
		cout << "auto.offset.reset 初始化失败" << endl;
	}


	RdKafka::KafkaConsumer* pConsumer = RdKafka::KafkaConsumer::create(pConf, strErr);
	if (nullptr == pConsumer)
	{
		cout << "消费对象初始化失败,错误信息:" << strErr << endl;
		return -1;
	}

	RdKafka::ErrorCode err = pConsumer->subscribe(vectTopics);
	if (RdKafka::ErrorCode::ERR_NO_ERROR != err)
	{
		cout << "订阅主题失败,错误码:" << err << endl;
		return -1;
	}
	while (true)
	{
		RdKafka::Message *msg = pConsumer->consume(1000);
		if (RdKafka::ErrorCode::ERR_NO_ERROR != msg->err())
		{
			if (RdKafka::ErrorCode::ERR__TIMED_OUT != msg->err())
			{
				cout << "消费超时,错误码:" << msg->err() << ", " << msg->errstr() << endl;
			}
			this_thread::sleep_for(chrono::milliseconds(5));
			continue;
		}
		cout << "\nkey:" << msg->key()
			<< "\nkey_len:" << msg->key_len()
			<< "\nmsg_len:" << msg->len()
			<< "\noffset:" << msg->offset()
			<< "\npayload:" << msg->payload()
			<< "\ntopic_name:" << msg->topic_name()
			<< "\npartion::" << msg->partition() << endl;

		this_thread::sleep_for(chrono::seconds(1));
	}
}
int main()
{
	//消费
	consumer();
	system("pause");
	return 0;
}

推荐另一个同样是开源的,并且在librdkafka开源例子中推荐的一个封装,此处获取源码,从例子上看比较友好。
kafka使用笔记-librdkafka支持sasl认证_第8张图片

你可能感兴趣的:(消息中间件)