go操作kafka

1、创建kafka

使用Docker Compose快速搭建,windows使用dockerdesktop部署,linux使用docker部署
以linux为例:创建docker-compose.yml文件,搭建单节点zookeeper和单节点kafka环境,并且在8080端口提供kafka-ui管理界面。

docker-compose.yml
version: '2.1'

services:
  zoo1:
    image: confluentinc/cp-zookeeper:7.3.2
    hostname: zoo1
    container_name: zoo1
    ports:
      - "2181:2181"
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_SERVER_ID: 1
      ZOOKEEPER_SERVERS: zoo1:2888:3888

  kafka1:
    image: confluentinc/cp-kafka:7.3.2
    hostname: kafka1
    container_name: kafka1
    ports:
      - "9092:9092"
      - "29092:29092"
      - "9999:9999"
    environment:
      KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka1:19092,EXTERNAL://${DOCKER_HOST_IP:-192.168.xxx.xxx}:9092,DOCKER://host.docker.internal:29092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT,DOCKER:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
      KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181"
      KAFKA_BROKER_ID: 1
      KAFKA_LOG4J_LOGGERS: "kafka.controller=INFO,kafka.producer.async.DefaultEventHandler=INFO,state.change.logger=INFO"
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
      KAFKA_JMX_PORT: 9999
      KAFKA_JMX_HOSTNAME: ${DOCKER_HOST_IP:-192.168.xxx.xxx}
      KAFKA_AUTHORIZER_CLASS_NAME: kafka.security.authorizer.AclAuthorizer
      KAFKA_ALLOW_EVERYONE_IF_NO_ACL_FOUND: "true"
    depends_on:
      - zoo1
  kafka-ui:
    container_name: kafka-ui
    image: provectuslabs/kafka-ui:latest
    ports:
      - 8080:8080
    depends_on:
      - kafka1
    environment:
      DYNAMIC_CONFIG_ENABLED: "TRUE"

注意:DOCKER_HOST_IP:-192.168.xxx.xxx表示如果DOCKER_HOST_IP没有配置,则使用宿主机ip:192.168.xxx.xxx 保存后执行
docker-compose up -d

image

容器启动后,使用浏览器打开192.168.xxx.xxx:8080 即可看到如下kafka-ui界面。
image
点击页面右侧的“Configure new cluster”按钮,配置kafka服务连接信息。
image
填写完信息后,点击页面下方的“Submit”按钮提交即可。
image
版本读取正常,"online"和"offline"用来描述Kafka集群中的分区(partition)状态。online为1表示分区状态正常,否则表示不正常。
创建topic(也可以在代码中创建)
image
image

2、go操作kafka

Go社区中目前有三个比较常用的kafka客户端库:confluent-kafka-go、sarama、kafka-go,本文使用kafka-go库。
下载依赖

go get github.com/segmentio/kafka-go

2.1连接kafka,发送消息

点击查看代码
// Kafka 配置
const (
	KafkaBroker = "192.168.xxx.xxx:9092" // 替换为你的 Kafka Broker 地址
	KafkaTopic  = "k8s-version"          // Kafka 主题
)

func main() {
	sendMesgKafka()
}

func sendMesgKafka() {
	w := kafka.NewWriter(kafka.WriterConfig{
		Brokers:  []string{KafkaBroker},
		Topic:    KafkaTopic,
		Balancer: &kafka.LeastBytes{},
	})

	err := w.WriteMessages(context.Background(),
		kafka.Message{
			Key:   []byte("Key-A"),
			Value: []byte("one!"),
		},
		kafka.Message{
			Key:   []byte("Key-B"),
			Value: []byte("two!"),
		},
		kafka.Message{
			Key:   []byte("Key-C"),
			Value: []byte("three!"),
		},
	)

	if err != nil {
		log.Fatal("failed to write messages:", err)
	}

	if err := w.Close(); err != nil {
		log.Fatal("failed to close writer:", err)
	}

	fmt.Println("Message sent successfully")

}

2.2消费消息

点击查看代码
func main() {
	readMesgKafka()
}
func readMesgKafka() {
	r := kafka.NewReader(kafka.ReaderConfig{
		Brokers:  []string{"192.168.xxx.xxx:9092"},
		GroupID:  "myGroup",
		Topic:    "k8s-version",
		MinBytes: 10e3, // 10KB
		MaxBytes: 10e6, // 10MB
	})

	for {
		msg, err := r.ReadMessage(context.Background())
		if err != nil {
			break
		}
		fmt.Println(string(msg.Key), string(msg.Value))
	}

	if err := r.Close(); err != nil {
		log.Fatal("failed to close reader:", err)
	}
}
运行发送消息程序后

image
运行消费消息程序,循环读取kafka中的消息
image

posted @   白羽翎  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示