---恢复内容开始---

基本概念

spring:
  cloud:
    stream:
      kafka:
        binder:
          brokers: cloudTest:19092
          zk-nodes: cloudTest:22182
          auto-create-topics: true
      bindings:
        output:
          destination: simpleTest
          content-type: text/plain
          producer:
            partitionCount: 1

做类比的话binder就类似于connection,而bindings就是topic,其中destination就是消息队列中的。
spring会对很多东西做出自己的封装。有些不错。有些就做些类比就好了。

关于具体channel的配置有两类。比如channel input
一类是通用配置。路径是spring.cloud.bindings.input
一类是kafka专用配置。路径是spring.cloud.kafka.bindings.input,然后官方指导上面的文章上面default不太对。我试下来是下面的路径

spring:
  cloud:
    stream:
      kafka:
        default:
          consumer:
            autoCommitOffset: false

或者说官方的意思,可能说想、是同级别下面的defualt的意思吧。

MessageConverter

MessageConverter最大的一个坑就是网络上很多google到的教程。往往已经过时,比如开始的时候是在配置项里面baeldung里面很多配置,现在已经过时。现在只要配置一个bean。注入就好。
其他的看看文档就好。

  • 看了一下代码,MessageConverter是通过content-type这个配置项来捞的。

Avro

关于Avro,就是需要一个schema-registy服务器。简单的来书,就是共享schema的地方。其实这个话题,是Avro的话题。
回到spring的话,spring自己做了一个schma的服务器。那么你用两种选择

  • 用spring的。然后配置@EnableSchemaRegistryServer新建一个boot的application,然后在client端配置@EnableSchemaRegistryClient就好
  • 用Confluent的话,像下面配置就好。然后记住默认的content type是application/*+avro
@Bean
public SchemaRegistryClient schemaRegistryClient(@Value("${spring.cloud.stream.schemaRegistryClient.endpoint}") String endpoint){
  ConfluentSchemaRegistryClient client = new ConfluentSchemaRegistryClient();
  client.setEndpoint(endpoint);
  return client;
}

如果开发目的呢。我建议还是用Confluent,然后弄个docker container就好。就是方便而已。

offset

  • 获取offset: Long offset = message.getHeaders().get(KafkaHeaders.OFFSET, Long.class);

手动提交的配置

spring:
  cloud:
    stream:
      kafka:
        bindings:
          input:
            consumer:
              autoCommitOffset: false
      bindings:
        input:
          destination: textPlain
          group: s1

关于手动提交的
一开始的时候,按照官方的手动提交的例子,我发觉一直获得的Acknowledge一直为Null。然后细看了配置,才发现原来源于kafka的配置,要写在kafka下面。我觉得这个设计还是挺操蛋的。
然后关于meesage的meta data。其实都藏在header里面,可以通过KafkaHeaders来取。
不过关于这点,我觉得还有一个问题,就是commit offset。其实也可以通过那个从header里面来获得customer对象来获得,我发觉commit相关的api都在。估计一个是spring的封装。一个是原生吧

resume

基本没什么特别

@Slf4j
@Component
public class RebalancedListener implements KafkaBindingRebalanceListener {

    @Override
    public void onPartitionsAssigned(String bindingName,
                                     Consumer<?, ?> consumer,
                                     Collection<TopicPartition> partitions,
                                     boolean initial) {

        partitions.forEach(
                p -> consumer.seek(p, offset)
        );

    }
}

@StreamListener

condition

尽管来说支持spel表达式。如果读取payload的话,payload是之前的。所以最好加在heeders里面。

有用的代码入入口

  • NetworkClient-initiateConnect: 用来看kafka到底是怎么连接到那里。

    • 由于kafka的机制问题。经常会有很多的地址。有时候一个配置错误,不知道哪里错了。就可以看这里。有一次,我把127和172搞错了。花了一个下午
  • SmartMessageMethodArgumentResolver-convertPayload: message to pojo的入口
    • 可以看看你配置的MessageConverter到底有没有作用
    • 可以看看到底message的二进制字节码
  • OutboundContentTypeConvertingInterceptor-doPreSend: pojo to message的入口
    • 和上面一个正好相对

      ---恢复内容结束---

spring cloud stream 经验总结的更多相关文章

  1. Spring Cloud Stream同一通道根据消息内容分发不同的消费逻辑

    应用场景 有的时候,我们对于同一通道中的消息处理,会通过判断头信息或者消息内容来做一些差异化处理,比如:可能在消息头信息中带入消息版本号,然后通过if判断来执行不同的处理逻辑,其代码结构可能是这样的: ...

  2. Spring Cloud Stream消费失败后的处理策略(四):重新入队(RabbitMQ)

    应用场景 之前我们已经通过<Spring Cloud Stream消费失败后的处理策略(一):自动重试>一文介绍了Spring Cloud Stream默认的消息重试功能.本文将介绍Rab ...

  3. Spring Cloud Stream消费失败后的处理策略(三):使用DLQ队列(RabbitMQ)

    应用场景 前两天我们已经介绍了两种Spring Cloud Stream对消息失败的处理策略: 自动重试:对于一些因环境原因(如:网络抖动等不稳定因素)引发的问题可以起到比较好的作用,提高消息处理的成 ...

  4. Spring Cloud Stream消费失败后的处理策略(二):自定义错误处理逻辑

    应用场景 上一篇<Spring Cloud Stream消费失败后的处理策略(一):自动重试>介绍了默认就会生效的消息重试功能.对于一些因环境原因.网络抖动等不稳定因素引发的问题可以起到比 ...

  5. Spring Cloud Stream消费失败后的处理策略(一):自动重试

    之前写了几篇关于Spring Cloud Stream使用中的常见问题,比如: 如何处理消息重复消费 如何消费自己生产的消息 下面几天就集中来详细聊聊,当消息消费失败之后该如何处理的几种方式.不过不论 ...

  6. Spring Cloud Stream如何消费自己生产的消息?

    在上一篇<Spring Cloud Stream如何处理消息重复消费>中,我们通过消费组的配置解决了多实例部署情况下消息重复消费这一入门时的常见问题.本文将继续说说在另外一个被经常问到的问 ...

  7. Spring Cloud Stream如何处理消息重复消费?

    最近收到好几个类似的问题:使用Spring Cloud Stream操作RabbitMQ或Kafka的时候,出现消息重复消费的问题.通过沟通与排查下来主要还是用户对消费组的认识不够.其实,在之前的博文 ...

  8. 使用 Spring Cloud Stream 构建消息驱动微服务

    相关源码: spring cloud demo 微服务的目的: 松耦合 事件驱动的优势:高度解耦 Spring Cloud Stream 的几个概念 Spring Cloud Stream is a ...

  9. Spring Cloud Stream

    Spring Cloud Stream是Spring Cloud的组件之一,是一个为微服务应用构建消息驱动能力的框架. 1.导入引用 <dependency> <groupId> ...

随机推荐

  1. elasticsearch 集群部署,版本 5.5.0

    准备说明: 两台服务器 Ip分别为 192.168.239.78(主),192.168.239.49(从) 主服务器上配置如下:1.上传es5.5.0版本至主服务器2.解压 unzipunzip el ...

  2. 实现socket的服务和客户端通信

    对学习过程中自己敲的一些关于socket有关的代码做了个简单总结,在这分享一下,给有需要的同学借鉴一下. 什么是socket? 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为 ...

  3. 一次使用InfluxDB数据库的总结

    前言 因当前的项目需要记录每秒钟服务器的状态信息,例如负载.cpu等等信息,这些数据都是和时间相关联的. 因为一秒钟就要存储挺多的数据.而且我还在前端做了echart的折线图,使用websocket实 ...

  4. SpringBoot2.x 整合Spring-Session实现Session共享

    SpringBoot2.x 整合Spring-Session实现Session共享 1.前言 发展至今,已经很少还存在单服务的应用架构,不说都使用分布式架构部署, 至少也是多点高可用服务.在多个服务器 ...

  5. CVE-2018-4407 漏洞复现POC

    pip install scapy import scapy from scapy.all import * send(IP(dst="192.168.1.132",options ...

  6. c语言进阶15-数据结构总结

    数据结构结论 1.阿基米德说过:“给我一个支点,我就能翘起地球”. 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成.记为:Data_Structure=(D, ...

  7. C语言入门3-C语言概述及数据类型

    一.          计算机程序设计语言 (计算机语言的发展历史) 1.       机器语言 机器语言 二进制代码语言,由  0和1组成的. 特点是:计算机可以直接识别,不需要进行任何的翻译. 2 ...

  8. 【CodeForces - 357B】Flag Day(水题)

    Flag Day Descriptions 小G请你对 n 个点进行染色,可选的颜色有三种:白.红.蓝,并使得给定的 m 个三元组中,每个点的颜色各不相同. 因为你可能不会三分图匹配,于是小G给出了更 ...

  9. apache自动打包日志脚本

    #!/bin/bash # apachedata=$(date +%Y%m%d) time=$(date +%Y%m%d%H --date='1 hour ago') cd /logs/apache/ ...

  10. 《VR入门系列教程》之4---运行平台

    运行平台     大多数的VR应用都可以在目前多数的PC和手机上运行,基本上一个不太旧的PC或者配置好点的笔记本电脑都可以正常运行Oculus Rift,如果手机的CPU和显卡不错的话也可以有很好的V ...