spring cloud stream 经验总结
---恢复内容开始---
基本概念
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 经验总结的更多相关文章
- Spring Cloud Stream同一通道根据消息内容分发不同的消费逻辑
应用场景 有的时候,我们对于同一通道中的消息处理,会通过判断头信息或者消息内容来做一些差异化处理,比如:可能在消息头信息中带入消息版本号,然后通过if判断来执行不同的处理逻辑,其代码结构可能是这样的: ...
- Spring Cloud Stream消费失败后的处理策略(四):重新入队(RabbitMQ)
应用场景 之前我们已经通过<Spring Cloud Stream消费失败后的处理策略(一):自动重试>一文介绍了Spring Cloud Stream默认的消息重试功能.本文将介绍Rab ...
- Spring Cloud Stream消费失败后的处理策略(三):使用DLQ队列(RabbitMQ)
应用场景 前两天我们已经介绍了两种Spring Cloud Stream对消息失败的处理策略: 自动重试:对于一些因环境原因(如:网络抖动等不稳定因素)引发的问题可以起到比较好的作用,提高消息处理的成 ...
- Spring Cloud Stream消费失败后的处理策略(二):自定义错误处理逻辑
应用场景 上一篇<Spring Cloud Stream消费失败后的处理策略(一):自动重试>介绍了默认就会生效的消息重试功能.对于一些因环境原因.网络抖动等不稳定因素引发的问题可以起到比 ...
- Spring Cloud Stream消费失败后的处理策略(一):自动重试
之前写了几篇关于Spring Cloud Stream使用中的常见问题,比如: 如何处理消息重复消费 如何消费自己生产的消息 下面几天就集中来详细聊聊,当消息消费失败之后该如何处理的几种方式.不过不论 ...
- Spring Cloud Stream如何消费自己生产的消息?
在上一篇<Spring Cloud Stream如何处理消息重复消费>中,我们通过消费组的配置解决了多实例部署情况下消息重复消费这一入门时的常见问题.本文将继续说说在另外一个被经常问到的问 ...
- Spring Cloud Stream如何处理消息重复消费?
最近收到好几个类似的问题:使用Spring Cloud Stream操作RabbitMQ或Kafka的时候,出现消息重复消费的问题.通过沟通与排查下来主要还是用户对消费组的认识不够.其实,在之前的博文 ...
- 使用 Spring Cloud Stream 构建消息驱动微服务
相关源码: spring cloud demo 微服务的目的: 松耦合 事件驱动的优势:高度解耦 Spring Cloud Stream 的几个概念 Spring Cloud Stream is a ...
- Spring Cloud Stream
Spring Cloud Stream是Spring Cloud的组件之一,是一个为微服务应用构建消息驱动能力的框架. 1.导入引用 <dependency> <groupId> ...
随机推荐
- Python旅途——函数的递归和栈的使用
Python--函数之递归.栈的使用 今天主要和大家分享函数的递归,同时引入一个新的概念--栈 1.递归 1.定义 函数的递归指的就是函数自己调用自己,什么是函数自己调用自己呢?我们来看一个栗子: 这 ...
- Maven打包成Jar文件时依赖包的问题
我们项目中使用到第三方的库文件,这些jar库文件并没有放到Maven中央库上,导致我们需要在项目中自己配置使用.我们的两三个开发人员对Java都是很熟,因此在使用中遇到了一些问题,表现在:在本地中引入 ...
- Android Native 内存泄漏系统化解决方案
导读:C++内存泄漏问题的分析.定位一直是Android平台上困扰开发人员的难题.因为地图渲染.导航等核心功能对性能要求很高,高德地图APP中存在大量的C++代码.解决这个问题对于产品质量尤为重要和关 ...
- 9.22考试 crf的视察 题解
这道题当时第一反应就是一道典型的NOIP第一题的难度,绝对要A掉,不然分数一定会被拉开. 然后就开始分析,暴力是一开始想的是用二维树状数组打加上暴力枚举长度,然而这道题满足二分性质,所以时间复杂度就是 ...
- vue--组件性别选择器和仿百度搜索栏
目录 实现原理 性别选择器 仿百度搜索栏 实现原理 主要参考vue官网上的自定义事件,父组件v-bind给子组件传参数,子组件利用props来接受父组件那边传过来的参数.我们还会遇到一个问题,怎么实时 ...
- .NET Core CSharp初级篇 1-5 接口、枚举、抽象
.NET Core CSharp初级篇 1-5 本节内容类的接口.枚举.抽象 简介 问题 如果你需要表示星期或者是某些状态,使用字符串或者数字是否不直观? 你是否发现,无论何种电脑,它的USB口的设计 ...
- springboot简单入门笔记
一.Spring Boot 入门 1.Spring Boot 简介 简化Spring应用开发的一个框架: 整个Spring技术栈的一个大整合: J2EE开发的一站式解决方案: 2.微服务 2014,m ...
- Golang高效实践之interface、reflection、json实践
前言 反射是程序校验自己数据结构和类型的一种机制.文章尝试解释Golang的反射机制工作原理,每种编程语言的反射模型都是不同的,有很多语言甚至都不支持反射. Interface 在将反射之前需要先介绍 ...
- docker跨主机通信扁平化网络的设计与实现
端口映射.ovs. fannel,weave 1.使用网桥实现跨主机容器连接 使用Open vSwitch实现跨主机容器连接
- 用margin还是padding ?
margin是用来隔开元素与元素的间距:padding是用来隔开元素与内容的间隔. margin用于布局分开元素使元素与元素互不相干:padding用于元素与内容之间的间隔,让内容(文字)与(包裹)元 ...