前言

今年主要会做一个比较完整的微服务项目开源出来。目前已经开始了,刚兴趣的先Star一个吧。

项目:https://github.com/yinjihuan/kitty-cloud

基础框架:https://github.com/yinjihuan/kitty

在做的过程中遇到一个问题那就是标题所说的两个框架碰撞了火花。都是S开头的谁都不服谁。

问题描述

既然使用了Sentinel来限流,那么干脆熔断也直接用Sentinel好了,所以就没使用Hystrix了。

Sentinel对Feign做了适配,使用的时候只需要引入spring-cloud-starter-alibaba-sentinel,如下:

<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

然后在配置文件打开 Sentinel 对 Feign 的支持:feign.sentinel.enabled=true就可以了。

一开始都很正常,平平淡淡的小日子过得也挺舒坦。

突然有一天,来了一位同姓但不同名的哥们,它叫Sleuth。

Sleuth文档:https://cloud.spring.io/spring-cloud-static/Greenwich.SR5/single/spring-cloud.html#_spring_cloud_sleuth

Spring Cloud Sleuth为Spring Cloud实现了分布式追踪解决方案。可以配合Zipkin或者Jaeger使用。

自从Sleuth来了之后,Sentinel Feign 的日子就不好过了,莫名其妙熔断回退失效了。

问题排查

Sentinel 对 Feign 的适配入口在SentinelFeignAutoConfiguration中。

主要是构建了Feign 的 Builder类,只要这个类被自动配置了,那么Sentinel 对 Feign 的支持也会生效。突然不生效了,那么肯定是这里有问题。

于是开启debug模式,发现启动的时候这里没有执行。feign.sentinel.enabled已经配置了,剩下就只有@ConditionalOnMissingBean的问题了。

@ConditionalOnMissingBean的作用是如果容器中已经有Builder那么这里就不会执行。

接下来就要看Sleuth的代码了,之所以能马上知道是Sleuth影响了,是因为一开始都是正常的,加了Sleuth后就出问题了。

在Sleuth中Feign相关的配置是在TraceFeignClientAutoConfiguration中。

可以看到,Sleuth中对Feign Builder也有配置,一种是如果开启了Hystrix就用SleuthHystrixFeignBuilder,如果没有开启就用SleuthFeignBuilder。

在这里打个断点,启动时直接就进来了,这边执行完后Builder对象就有了,所以Sentinel中的自然就不会执行了。

解决方案

发生冲突的根本原因在于两个框架都要对Feign进行扩展,Sentinel扩展是为了再调用的时候可以实现限流熔断等功能。Sleuth扩展是为了使用Feign调用接口的时候可以传递链路跟踪的信息。

要想解决这个问题,要么妥协只用一个框架,这样是最简单的。

要么看看Sleuth后面会不会支持Sentinel,目前可以看到已经支持了Hystrix。

最后一种就是自己改源码,将Sentinel融入到Sleuth中。

SleuthFeignBuilder 中只是对Client做了包装。

SentinelFeign 中只是对Builder做了增强。

所以我们只要把两者结合起来就可以了。

PS:没Star的现在接着Star吧!

项目:https://github.com/yinjihuan/kitty-cloud

基础框架:https://github.com/yinjihuan/kitty

当Spring Cloud Alibaba Sentinel碰上Spring Cloud Sleuth会擦出怎样的火花的更多相关文章

  1. Spring Cloud Alibaba | Sentinel: 分布式系统的流量防卫兵初探

    目录 Spring Cloud Alibaba | Sentinel: 分布式系统的流量防卫兵初探 1. Sentinel 是什么? 2. Sentinel 的特征: 3. Sentinel 的开源生 ...

  2. Spring Cloud Alibaba | Sentinel: 服务限流基础篇

    目录 Spring Cloud Alibaba | Sentinel: 服务限流基础篇 1. 简介 2. 定义资源 2.1 主流框架的默认适配 2.2 抛出异常的方式定义资源 2.3 返回布尔值方式定 ...

  3. Spring Cloud Alibaba | Sentinel: 服务限流高级篇

    目录 Spring Cloud Alibaba | Sentinel: 服务限流高级篇 1. 熔断降级 1.1 降级策略 2. 热点参数限流 2.1 项目依赖 2.2 热点参数规则 3. 系统自适应限 ...

  4. Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵基础实战

    Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵基础实战 Springboot: 2.1.8.RELEASE SpringCloud: Greenwich.SR2 ...

  5. Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵进阶实战

    Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵进阶实战 在阅读本文前,建议先阅读<Spring Cloud Alibaba | Sentinel:分布式系 ...

  6. Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵动态限流规则

    Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵动态限流规则 前面几篇文章较为详细的介绍了Sentinel的使用姿势,还没看过的小伙伴可以访问以下链接查看: &l ...

  7. Spring Cloud Alibaba Sentinel对Feign的支持

    Spring Cloud Alibaba Sentinel 除了对 RestTemplate 做了支持,同样对于 Feign 也做了支持,如果我们要从 Hystrix 切换到 Sentinel 是非常 ...

  8. Spring Cloud Alibaba Sentinel对RestTemplate的支持

    Spring Cloud Alibaba Sentinel 支持对 RestTemplate 的服务调用使用 Sentinel 进行保护,在构造 RestTemplate bean的时候需要加上 @S ...

  9. 0.9.0.RELEASE版本的spring cloud alibaba sentinel+feign降级处理实例

    既然用到了feign,那么主要是针对服务消费方的降级处理.我们基于0.9.0.RELEASE版本的spring cloud alibaba nacos+feign实例添油加醋,把sentinel功能加 ...

随机推荐

  1. cisco应用

    1.修改VLAN show arp:查看设备的ip地址和mac地址的对应关系,一般查看的是设备ARP缓存 show mac-address-table:查看各端口所学习到的MAC show ip ar ...

  2. no parameterless constructor define for type 解决一例

    在生成根据模型和上下文生成带增删查改操作的视图的控制器时,提示上述信息,网上查找了资料也没有解决,突然想起该项目是连接MSSQL数据库和Redis数据库的,并且已经依赖注入了,而Redis数据库的服务 ...

  3. 第十五周java实验作业

    实验十五  GUI编程练习与应用程序部署 实验时间 2018-12-6 1.实验目的与要求 (1) 掌握Java应用程序的打包操作: Java程序的打包,程序编译完成后,程序员将.class文件压缩打 ...

  4. [JVM教程与调优] JVM都有哪些参数类型?

    JDK本身是提供了一些监控工具,有一些是命令行,也有图形界面.本次介绍命令行如何进行监控. 命令行是非常重要的,因为在我们生产环境基本上是没有图形界面的,完全是通过命令行. 主要内容: JVM的参数类 ...

  5. 服务器安装 mongodb

    参考 https://www.cnblogs.com/layezi/p/7290082.html

  6. ASP.NET Core Authentication and Authorization

    最近把一个Asp .net core 2.0的项目迁移到Asp .net core 3.1,项目启动的时候直接报错: InvalidOperationException: Endpoint CoreA ...

  7. shell脚本中的case条件语句介绍和使用案例

    #前言:这篇我们接着写shell的另外一个条件语句case,上篇讲解了if条件语句.case条件语句我们常用于实现系统服务启动脚本等场景,case条件语句也相当于if条件语句多分支结构,多个选择,ca ...

  8. 搜索引擎如何检索结果:Python和spaCy信息提取简介

    概览 像Google这样的搜索引擎如何理解我们的查询并提供相关结果? 了解信息提取的概念 我们将使用流行的spaCy库在Python中进行信息提取 介绍 作为一个数据科学家,在日常工作中,我严重依赖搜 ...

  9. AttributeError: module 'tensorflow.python.keras.backend' has no attribute 'get_graph'处理办法

    原因:安装的tensorflow版本和keras版本不匹配,只需卸载keras,重新安装自己tensorflow对应的版本. Keras与tensorflow版本匹配查询网站  

  10. sql mysql数据库导库 panda pymysql

    mysql数据库 导入数据 1. panda 效率超高 对内存要求高 网络稳定性 # 读取文件 ratings_names = ['user_id', 'movie_id', 'ratings', ' ...