玩转Kafka—Spring&Go整合Kafka

简介: 玩转Kafka—Spring&Go整合Kafka

玩转Kafka—Spring整合Kafka

1 新建Spring Boot项目,增加依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.kafka</groupId>
        <artifactId>spring-kafka</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.20</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.76</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.kafka</groupId>
        <artifactId>spring-kafka-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

2 项目结构

3 代码

3.1 配置文件和Kafka服务器所需配置

application.properties

server.port=8080
#制定kafka代理地址
spring.kafka.bootstrap-servers=8.131.57.161:9092
#消息发送失败重试次数
spring.kafka.producer.retries=0
#每次批量发送消息的数量
spring.kafka.producer.batch-size=16384
#每次批量发送消息的缓冲区大小
spring.kafka.producer.buffer-memory=335554432
# 指定消息key和消息体的编解码方式
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
# 指定默认消费者group id
spring.kafka.consumer.group-id=user-log-group
spring.kafka.consumer.bootstrap-servers=8.131.57.161:9092
spring.kafka.consumer.auto-offset-reset=earliest
spring.kafka.consumer.enable-auto-commit=true
spring.kafka.consumer.auto-commit-interval=100
# 指定消息key和消息体的编解码方式
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer

Kafka服务器所需配置,server.properties文件

# 33行左右 0.0.0.0代表允许外部端口连接
listeners=PLAINTEXT://0.0.0.0:9092  
# 36行左右 ip代表外部代理地址
advertised.listeners=PLAINTEXT://8.131.57.161:9092

3.2 生产者和实体类代码

Student.java

/**
 * @desc: 实体类
 * @author: YanMingXin
 * @create: 2021/11/20-12:43
 **/
@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class Student implements Serializable {
    private String id;
    private String name;
    private String context;
}

StudentService.java

/**
 * @desc: 接口
 * @author: YanMingXin
 * @create: 2021/11/20-12:43
 **/
public interface StudentService {
    void stuSayHello(Student student);
}

StudentServiceImpl.java

/**
 * @desc: 接口实现类
 * @author: YanMingXin
 * @create: 2021/11/20-12:43
 **/
@Service
public class StudentServiceImpl implements StudentService {
    @Autowired
    private KafkaTemplate kafkaTemplate;
    /**
     * topic
     */
    private static final String STU_TOPIC = "stu.sayHello";
    @Override
    public void stuSayHello(Student student) {
        Student stu = new Student("1", "zs", "Hello Ls.");
        kafkaTemplate.send(STU_TOPIC, JSON.toJSONString(stu));
    }
}

3.3 消费者代码

MyKafkaListener.java

/**
 * @desc: 消费者监听
 * @author: YanMingXin
 * @create: 2021/11/20-12:44
 **/
@Component
public class MyKafkaListener {
    /**
     * topic
     */
    private static final String STU_TOPIC = "stu.sayHello";
    @KafkaListener(topics = {STU_TOPIC})
    public void stuTopicConsumer(ConsumerRecord consumerRecord) {
        Optional kafkaMsg = Optional.ofNullable(consumerRecord.value());
        if (kafkaMsg.isPresent()) {
            Object msg = kafkaMsg.get();
            System.err.println(msg);
        }
    }
}

3.4 测试

@SpringBootTest
class SpKafkaApplicationTests {
    @Autowired
    private StudentService studentService;
    @Test
    void contextLoads() throws Exception{
        for (int i = 0; i < 900000; i++) {
            studentService.stuSayHello(new Student());
        }
    }
}

玩转Kafka—Golang整合Kafka

几个常见的Go整合Kafka客户端工具:我们本次使用的是Shopify

ps:配置go get代理(类似于Maven配置阿里云镜像)教程:

https://goproxy.io/zh/docs/getting-started.html

1 新建go modules

2 项目结构

3 生产者代码

KakaProducer.go

package main
import (
   "fmt"
   "github.com/Shopify/sarama"
   "time"
)
//消息生产者
func main() {
   //获取配置类
   config := sarama.NewConfig() //配置类实例(指针类型)
   config.Producer.RequiredAcks = sarama.WaitForAll //代理需要的确认可靠性级别(默认为WaitForLocal)
   config.Producer.Partitioner = sarama.NewRandomPartitioner  //生成用于选择要发送消息的分区的分区(默认为散列消息键)。
   config.Producer.Return.Successes = true //如果启用,成功传递的消息将在成功通道(默认禁用)。
   //获取客户端对象
   client, err := sarama.NewSyncProducer([]string{"8.131.57.161:9092"}, config)
   if err != nil {
      //获取客户端失败
      fmt.Println("producer close, err:", err)
      return
   }
   //延迟执行,类似于栈,等到其他代码都执行完毕后再执行
   defer client.Close()
   //一直循环
   for {
      //获取Message对象
      msg := &sarama.ProducerMessage{}
      //设置topic
      msg.Topic = "go_kafka"
      //设置Message值
      msg.Value = sarama.StringEncoder("this is a good test, my message is good")
      //发送消息,返回pid、片偏移
      pid, offset, err := client.SendMessage(msg)
      //发送失败
      if err != nil {
         fmt.Println("send message failed,", err)
         return
      }
      //打印返回结果
      fmt.Printf("pid:%v offset:%v\n", pid, offset)
      //线程休眠下
      time.Sleep(10 * time.Second)
   }
}

4 消费者代码

KafkaConsumer.go

package main
import (
  "fmt"
  "github.com/Shopify/sarama"
  "strings"
  "sync"
  "time"
)
var (
  wg sync.WaitGroup //同步等待组
  //在类型上,它是一个结构体。一个WaitGroup的用途是等待一个goroutine的集合执行完成。
  //主goroutine调用了Add()方法来设置要等待的goroutine的数量。
  //然后,每个goroutine都会执行并且执行完成后调用Done()这个方法。
  //与此同时,可以使用Wait()方法来阻塞,直到所有的goroutine都执行完成。
)
func main() {
  //获取消费者对象 可以设置多个IP地址和端口号,使用逗号进行分割
  consumer, err := sarama.NewConsumer(strings.Split("8.131.57.161:9092", ","), nil)
  //获取失败
  if err != nil {
    fmt.Println("Failed to start consumer: %s", err)
    return
  }
  //对该topic进行监听
  partitionList, err := consumer.Partitions("go_kafka")
  if err != nil {
    fmt.Println("Failed to get the list of partitions: ", err)
    return
  }
  //打印分区
  fmt.Println(partitionList)
  //获取分区和片偏移
  for partition := range partitionList {
    pc, err := consumer.ConsumePartition("go_kafka", int32(partition), sarama.OffsetNewest)
    if err != nil {
      fmt.Printf("Failed to start consumer for partition %d: %s\n", partition, err)
      return
    }
    //延迟执行
    defer pc.AsyncClose()
    //启动多线程
    go func(pc sarama.PartitionConsumer) {
      wg.Add(1)
      //获得message的信息
      for msg := range pc.Messages() {
        fmt.Printf("Partition:%d, Offset:%d, Key:%s, Value:%s", msg.Partition, msg.Offset, string(msg.Key), string(msg.Value))
        fmt.Println()
      }
      wg.Done()
    }(pc)
  }
  //线程休眠
  time.Sleep(10 * time.Second)
  wg.Wait()
  consumer.Close()
}

5 测试


相关文章
|
3月前
|
消息中间件 开发框架 Java
掌握这一招,Spring Boot与Kafka完美融合,顺序消费不再是难题,让你轻松应对业务挑战!
【8月更文挑战第29天】Spring Boot与Kafka集成广泛用于处理分布式消息队列。本文探讨了在Spring Boot中实现Kafka顺序消费的方法,包括使用单个Partition或消息Key确保消息路由到同一Partition,并设置Consumer并发数为1以保证顺序消费。通过示例代码展示了如何配置Kafka Producer和Consumer,并自定义Partitioner。为确保数据正确性,还建议在业务逻辑中增加顺序校验机制。
99 3
|
3月前
|
消息中间件 Java Kafka
|
3月前
|
消息中间件 Java Kafka
|
3月前
|
消息中间件 安全 Java
Spring Boot 基于 SCRAM 认证集成 Kafka 的详解
【8月更文挑战第4天】本文详解Spring Boot结合SCRAM认证集成Kafka的过程。SCRAM为Kafka提供安全身份验证。首先确认Kafka服务已启用SCRAM,并准备认证凭据。接着,在`pom.xml`添加`spring-kafka`依赖,并在`application.properties`中配置Kafka属性,包括SASL_SSL协议与SCRAM-SHA-256机制。创建生产者与消费者类以实现消息的发送与接收功能。最后,通过实际消息传递测试集成效果与认证机制的有效性。
137 4
|
3月前
|
消息中间件 Kafka Java
Spring 框架与 Kafka 联姻,竟引发软件世界的革命风暴!事件驱动架构震撼登场!
【8月更文挑战第31天】《Spring 框架与 Kafka 集成:实现事件驱动架构》介绍如何利用 Spring 框架的强大功能与 Kafka 分布式流平台结合,构建灵活且可扩展的事件驱动系统。通过添加 Spring Kafka 依赖并配置 Kafka 连接信息,可以轻松实现消息的生产和消费。文中详细展示了如何设置 `KafkaTemplate`、`ProducerFactory` 和 `ConsumerFactory`,并通过示例代码说明了生产者发送消息及消费者接收消息的具体实现。这一组合为构建高效可靠的分布式应用程序提供了有力支持。
109 0
|
3月前
|
消息中间件 Java Kafka
SpringBoot Kafka SSL接入点PLAIN机制收发消息
SpringBoot Kafka SSL接入点PLAIN机制收发消息
38 0
|
1月前
|
消息中间件 存储 运维
为什么说Kafka还不是完美的实时数据通道
【10月更文挑战第19天】Kafka 虽然作为数据通道被广泛应用,但在实时性、数据一致性、性能及管理方面存在局限。数据延迟受消息堆积和分区再平衡影响;数据一致性难以达到恰好一次;性能瓶颈在于网络和磁盘I/O;管理复杂性涉及集群配置与版本升级。
|
1月前
|
消息中间件 Java Kafka
Flink-04 Flink Java 3分钟上手 FlinkKafkaConsumer消费Kafka数据 进行计算SingleOutputStreamOperatorDataStreamSource
Flink-04 Flink Java 3分钟上手 FlinkKafkaConsumer消费Kafka数据 进行计算SingleOutputStreamOperatorDataStreamSource
46 1
|
3月前
|
消息中间件 Java Kafka
Kafka不重复消费的终极秘籍!解锁幂等性、偏移量、去重神器,让你的数据流稳如老狗,告别数据混乱时代!
【8月更文挑战第24天】Apache Kafka作为一款领先的分布式流处理平台,凭借其卓越的高吞吐量与低延迟特性,在大数据处理领域中占据重要地位。然而,在利用Kafka进行数据处理时,如何有效避免重复消费成为众多开发者关注的焦点。本文深入探讨了Kafka中可能出现重复消费的原因,并提出了四种实用的解决方案:利用消息偏移量手动控制消费进度;启用幂等性生产者确保消息不被重复发送;在消费者端实施去重机制;以及借助Kafka的事务支持实现精确的一次性处理。通过这些方法,开发者可根据不同的应用场景灵活选择最适合的策略,从而保障数据处理的准确性和一致性。
271 9
|
3月前
|
消息中间件 负载均衡 Java
"Kafka核心机制揭秘:深入探索Producer的高效数据发布策略与Java实战应用"
【8月更文挑战第10天】Apache Kafka作为顶级分布式流处理平台,其Producer组件是数据高效发布的引擎。Producer遵循高吞吐、低延迟等设计原则,采用分批发送、异步处理及数据压缩等技术提升性能。它支持按消息键值分区,确保数据有序并实现负载均衡;提供多种确认机制保证可靠性;具备失败重试功能确保消息最终送达。Java示例展示了基本配置与消息发送流程,体现了Producer的强大与灵活性。
67 3