【kafka专栏】SpringBoot整合kafka客户端实现生产消费

一、maven坐标引入依赖

如果需要在Spring Boot项目中集成kafka客户端,首先需要引入下面的maven坐标。Spring Boot的版本与kafka对应关系,如:https://spring.io/projects/spring-kafka

在这里插入图片描述

新建一个Spring Boot项目,在项目中引入如下maven坐标,默认情况下不填版本号(使用springboot父项目确定版本号),即可满足上图中的对应关系。

<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
</dependency>

进行Spring kafka生产者及消费者参数配置,如果大家看过本专栏的前面两章针对生产者及消费者介绍,这些参数的配置应该都不陌生。需要注意的是:生产者的序列化器和消费者的反序列化器是成对出现的,也就是说生产者序列化value采用JSON的方式,消费者反序列化的时候也应该采用JSON的方式。

spring:
  kafka:
    bootstrap-servers: 192.168.137.10:9092
    producer: # 生产者
      retries: 3  #发送失败重试次数
      acks: all  #所有分区副本确认后,才算消息发送成功
      # 指定消息key和消息体的序列化编码方式
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.springframework.kafka.support.serializer.JsonSerializer
    consumer: #消费者
      # 指定消息key和消息体的反序列化解码方式,与生产者序列化方式一一对应
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
      properties:  # 这个配置参数相对默认,会在下文中介绍
        spring:
          json:
            trusted:
              packages: '*'

如果想自定义日志级别,使用下面的配置。

logging:
  level:
    org:
      springframework:
        kafka: ERROR # spring-kafka
      apache:
        kafka: ERROR # kafka

二、生产者实现与测试

创建一个类User作为本文生产者生产的、消费者消费的目标对象。

public class User {
    
    
    private String firstName;
    private String lastName;
    private int age;

    @Override
    public String toString() {
    
    
        return "User{" +
                "firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", age=" + age +
                '}';
    }

   //这里省略了若干get、set方法
}

生产者测试用例

@SpringBootTest
class SpringKafkaTest {
    
    

    @Resource
    KafkaTemplate<String, User> kafkaTemplate;

    @Test
    void testProducer() {
    
    
        User user = new User();
        user.setAge(21);
        user.setFirstName("stephen");
        user.setLastName("curry");
        //将user发往zimug-test这个topic
        kafkaTemplate.send("zimug-test",user);
    }

}
  • KafkaTemplate是Spring针对kafka生产者封装的模板操作类,可以使用泛型,上文中的<String,User>表示发送的数据消息的key的数据类型是String,数据体value的数据类型是User。
  • 因为配置了value-serializer: org.springframework.kafka.support.serializer.JsonSerializer,所以User对象会被序列化为JSON对象之后发往kafka服务端。
  • 需要注意的是:在进行数据发送之前我并没有在服务端新建一个主题“zimug-test”,但是数据却发送成功了。这是因为,默认情况下当生产者发送数据的主题不存在的时候,会新建一个主题(该主题只有一个分区)。

三、消费者实现与测试

@Component
public class DemoConsumer {
    
    
    @KafkaListener(topics = "zimug-test" , groupId = "jsonuser")
    public void dealUser(User user) {
    
    
        System.out.println(user.toString());
    }
}
  • 核心注解是KafkaListener,topics指定了消费哪个主题的数据,gourpId指定了消费者组的名称
  • 这里使用User作为方法参数,是因为kafka消费者会调用反序列化器value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer将生产者发送的User对象反序列化。
  • 注意这里的消费者组只有一个消费者,如果希望启动多个消费者线程,可以设置@KafkaListener(concurrency=n)。(用法:消费者线程数=主题分区数)

上文中的代码输出的内容如下:

User{
    
    firstName='stephen', lastName='curry', age=21}

如果你在使用过程中出现下面的错误,这是因为com.zimug.kafka.tujie.model这个包路径在消费者这一端不被信任。如果需要被信任,需要配置spring.kafka.consumer.properties.spring.json.trusted.packages: com.zimug.kafka.tujie.model; 如果配置成’*'表示所有的路径都将被信任。

Caused by: java.lang.IllegalArgumentException: The class 'com.zimug.kafka.tujie.model.User' is not in the trusted packages

猜你喜欢

转载自blog.csdn.net/hanxiaotongtong/article/details/125684925
今日推荐