最近上游kafka集群升级版本到kafka_2.12-2.8.1,使用SCRAM-SHA-256加密套件。golang操作kafka一般使用sarama包或者confluent包,sarama包是纯go的,不能编译成功。github.com/confluentinc/confluent-kafka-go/kafka是基于librdkafka,通过cgo封装的kafka客户端,可以使用SCRAM-SHA-256加密套件。

    还有一个问题。github.com/confluentinc/confluent-kafka-go/kafka包内置的librdkafka架构是x86_64,在arm架构下不能编译成功,解决办法:

先在arm环境安装librdkafka

然后强制删除confluent包的静态库,使用动态库

# 1. 删除 confluent-kafka-go 中的 ARM 不兼容的静态库
MOD_PATH="/root/gocode/pkg/mod/github.com/confluentinc/confluent-kafka-go@v1.9.2"
echo "移除不兼容的 x86 静态库..."
rm -f $MOD_PATH/kafka/librdkafka_vendor/*.a

# 2. 强制使用系统动态库
export CGO_ENABLED=1
export CONFLUENT_KAFKA_GO_DYNAMIC_LINK=1
export PKG_CONFIG_PATH=/usr/lib64/pkgconfig
export CGO_CFLAGS="-I/usr/local/include -I/usr/include"
export CGO_LDFLAGS="-L/usr/lib64 -Wl,-rpath,/usr/lib64 -lrdkafka -lrdkafka++"

# 3. 验证系统库
echo "验证系统 librdkafka..."
pkg-config --libs rdkafka 2>/dev/null || echo "没有找到 pkg-config 配置"
find /usr -name "*rdkafka*.so*" 2>/dev/null | head -5

# 4. 测试编译
echo "测试编译..."
cat > test_compile.go << 'EOF'
package main

/*
#cgo LDFLAGS: -lrdkafka
#include <librdkafka/rdkafka.h>
*/
import "C"
import "fmt"

func main() {
    fmt.Println("编译测试...")
    fmt.Printf("librdkafka 版本: %s\n", C.GoString(C.rd_kafka_version_str()))
}
EOF


也可以复制librdkafka的静态库到confluent的静态库
cp /usr/local/lib/librdkafka-static.a /root/gocode/pkg/mod/github.com/confluentinc/confluent-kafka-go@v1.9.2/kafka/librdkafka_vendor/librdkafka_glibc_linux.a

两个结论:

1.golang不支持SCRAM-SHA-256加密套件。
2.confluent包内置的librdkafka预编译文件是x86_64架构的。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐