kafka接受消息

SpringBoot + Kafka 消费者,用来监听 3 个不同 topic 的加密消息 → 解密 → 解析 → 入库

接收代码

功能拆解:

监听 3 个 Kafka 主题:JD/GD/HF 三种工单

消息是 AES 加密 的,用 | 分割字段

解密后转成对应 DTO

调用 service 插入数据库

java 复制代码
import static com.zznode.jiake.e2e.common.util.AESUtil.desEncrypt;

@Slf4j
@RefreshScope
@Component
@ConditionalOnProperty(name = "spring.kafka.enabled", havingValue = "true")
public class KfkMessageController {


    @Value("${spring.kafka.topic.jd_name}")
    private String jdTopicName;

    @Value("${spring.kafka.topic.gd_name}")
    private String gdTopicName;

    @Value("${spring.kafka.topic.hf_name}")
    private String hfTopicName;

    @Value("${spring.kafka.aesKey}")
    private String aeskey;

    @Autowired
    NewKftsgdServiceImpl kfkService;

    // 监听指定的 Topic,动态获取名称

    // 监听指定的 Topic,现在直接使用配置项值
    @KafkaListener(topics = "${spring.kafka.topic.jd_name}")
    public void consumejd(String message) {
        log.info("jdTopicName: " + jdTopicName);
        this.doit(message, "jd");
    }

    @KafkaListener(topics = "${spring.kafka.topic.gd_name}")
    public void consumegd(String message) {
        log.info("gdTopicName: " + gdTopicName);
        this.doit(message, "gd");
    }

    @KafkaListener(topics = "${spring.kafka.topic.hf_name}")
    public void consumehf(String message) {
        log.info("hfTopicName: " + hfTopicName);
        this.doit(message, "hf");
    }



    public void doit(String message,String type){
        log.info("原始消息: " + message);
        try {
            log.info("aeskey: " + aeskey);
            // 1. 分割消息头和消息体(假设格式为 HEADER~BODY)
//            String[] parts = message.split("~");
//            String header = parts[0]; // 消息头
            String body = message;   // 消息体
            // 2. 按配置的分隔符解析消息体
            String[] fields = body.split("\\|");
            for(int i=0;i<fields.length;i++){
                String str = fields[i];
                log.info("encrypt:"+str);
                String desEncryptStr = desEncrypt(str, aeskey);
                log.info("desEncrypt:"+desEncryptStr+"执行kafka数据接入...");
                if(desEncryptStr==null){
                    log.info("执行失败!");
                    return;
                }else{
                    if("gd".equals(type)){
                        doAddInfoGd(desEncryptStr);
                    }else if ("hf".equals(type)){
                        doAddInfoZjdf(desEncryptStr);
                    }else if ("jd".equals(type)){
                        doAddInfoLd(desEncryptStr);
                    }
                }

            }
        }catch(Exception e){
            log.info("e:"+e);
        }
    }

    /**新一代客服投诉工单-直接答复*/
    public void  doAddInfoZjdf(String desEncryptStr){
        try {


            NewkftsgdZjdfDTO dto = JsonUtils.parseObject(desEncryptStr, NewkftsgdZjdfDTO.class);
            log.debug("dto:"+JSON.toJSONString(dto, SerializerFeature.WriteMapNullValue));
            log.debug("新一代客服投诉工单-直接答复 kafka 数据接入...");
            kfkService.insertNewKftsgdZjdf(dto);
        }catch(Exception e){
            log.error("e:"+e);
        }
    }
    /**新一代客服投诉工单-归档*/
    public void  doAddInfoGd(String desEncryptStr){
        try {
            NewkftsgdGdDTO dto = JsonUtils.parseObject(desEncryptStr, NewkftsgdGdDTO.class);
            log.debug("dto:"+JSON.toJSONString(dto, SerializerFeature.WriteMapNullValue));
            log.debug("新一代客服投诉工单-归档 kafka 数据接入...");
            kfkService.insertNewKftsgdGd(dto);
        }catch(Exception e){
            log.error("e:"+e);
        }
    }
    /**新一代客服投诉工单-立单,现场解决*/
    public void  doAddInfoLd(String desEncryptStr){
        try {
//            NewkftsgdLdDTO dto = JsonUtils.parseObject(desEncryptStr, NewkftsgdLdDTO.class);
            NewkftsgdLdDTO dto = JsonUtils.parseObject(desEncryptStr, NewkftsgdLdDTO.class);
            log.debug("dto:"+JSON.toJSONString(dto, SerializerFeature.WriteMapNullValue));
            log.debug("新一代客服投诉工单-现场解决 kafka 数据接入...");
            kfkService.insertNewKftsgdLd(dto);
        }catch(Exception e){
            log.error("e:"+e);
        }
    }

}

安全认证

证书信息

security.protocol: SASL_PLAINTEXT

sasl.mechanism: GSSAPI

sasl.kerberos.service.name: kafka

sasl.jaas.config: Krb5LoginModule + keytab

公司 Kafka 开启了 Kerberos 安全认证

所以必须配证书、密钥表,否则连不上。

nacos配置

js 复制代码
spring:
    kafka:
        enabled: false  # 设置为true或false来控制是否启用kafka
        aesKey: exhinkplsgjlinsg
        bootstrap-servers: ${KAFKA_SERVERS}
        consumer:
            group-id: kafka-consumer-group
            key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
            value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
            auto-offset-reset: latest 
            #latest
            enable-auto-commit: false
        properties:
            security.protocol: SASL_PLAINTEXT  # 根据需要选择SASL_PLAINTEXT或SASL_SSL
            sasl.mechanism: GSSAPI
            sasl.kerberos.service.name: kafka  # 这应与jaas配置中的serviceName匹配
            sasl.jaas.config: |
                com.sun.security.auth.module.Krb5LoginModule required
                useKeyTab=true
                storeKey=true
                keyTab="/data/keytabs/uino.keytab"
                principal="uino@BMCC.COM";
        listener:
            ack-mode: manual_immediate  
        topic:
            jd_name: GD_DXWT_JK_JIANDAN  
            hf_name: GD_DXWT_JK_HUIFU
            gd_name: GD_DXWT_JK_GUIDANG
            consumer-group: kafka-consumer-group
            header-delimiter: "~"
            field-delimiter: "|" 

后续补充

修复 ACK 提交

修复分割逻辑

加入异常重试

加入死信队列

加入日志追踪

加入并发配置

相关推荐
敖正炀15 小时前
生产者原理:分区策略、幂等与事务
kafka
贺国亚20 小时前
Kafka 调优与运维实战
后端·kafka
Devin~Y20 小时前
大厂Java面试:Spring Boot + Redis/Kafka + Spring Cloud + JVM + RAG/向量检索(小Y翻车实录)
java·jvm·spring boot·redis·spring cloud·kafka·mybatis
铁皮哥1 天前
【后端开发】RabbitMQ、RocketMQ、Kafka 怎么选?我从业务场景重新梳理了一遍
java·linux·数据库·分布式·kafka·rabbitmq·rocketmq
宇之广曜1 天前
从 MQ 到 Celery:把异步任务、状态表、重试补偿和 Outbox 一次讲清楚
kafka·rabbitmq
苍煜1 天前
Kafka消息零丢失核心全解:生产者acks机制+消费者offset机制
分布式·kafka
敖正炀2 天前
Kafka 安全机制:SASL 认证、SSL 加密与 ACL 授权
kafka
敖正炀2 天前
Kafka 特性全景与选型指南
kafka
乐之者v2 天前
Kafka 跨服数据同步
分布式·kafka
富士康质检员张全蛋2 天前
Kafka 消息查找流程和消息读取流程
分布式·kafka