前言

今年主要会做一个比较完整的微服务项目开源出来。目前已经开始了,刚兴趣的先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. 支付宝小程序获取 user_id(openid) ThinkPHP版

    支付宝小程序获取 user_id(openid) ThinkPHP版 近期支付宝小程序个人公测了,就想着玩一下,没想到就获取用户唯一标识都这么麻烦,微信的openid的话Get请求一下就完事了,支付宝 ...

  2. 学习vue前的准备工作

    起步 1.扎实的HTML/CSS/Javascript基本功,这是前置条件. 2.不要用任何的构建项目工具,只用最简单的<script>,把教程里的例子模仿一遍,理解用法.不推荐上来就直接 ...

  3. 【Excel使用技巧】vlookup函数

    背景 前不久开发了一个运营小工具,运营人员上传一个id的列表,即可导出对应id的额外数据.需求本身不复杂,很快就开发完了,但上线后,运营反馈了一个问题,导出后的数据跟导出之前的数据顺序不一致. 经过沟 ...

  4. 【翻译】如何使用 OpenVINO 来优化 OpenCV

    本文翻译自 Vishwesh Shrimali 的  "Using OpenVINO with OpenCV" 原文链接: https://www.learnopencv.com/ ...

  5. 微信内置浏览器对于html5的支持

    微信内置浏览器对于html5的支持 来源: 作者: 热度:102 日期:14-06-10, 09:10 AM 我在做针对微信的HTML5应用, 目前遇到的几个问题是 一. 安卓版微信直接调用系统浏览器 ...

  6. Building Applications with Force.com and VisualForce(Dev401)(十):Designing Applications for Multiple Users: Building Business Processes that You Want

    Dev401-011: Building Business Processes that You Want Course Objectives1.Describe the capabilities o ...

  7. TensorFlow Windows 安装

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 本系列教程将手把手带您从零开始学习Tensorflow,并最终通过 ...

  8. K8S 资源收集和展示 top & DashBoard-UI

    一.前言 在近期的 K8S 开发调试的过程中,总会想知道 Node 或者 Pod 的更多信息.但 $ kubectl top node $ kubectl top pod 中的 top 操作符,需要 ...

  9. 将java中Map对象转为有相同属性的类对象(json作为中间转换)

    java中Map对象转为有相同属性的类对象(json作为中间转换) 准备好json转换工具类 public class JsonUtil { private static ObjectMapper o ...

  10. iOS 页面流畅技巧(1)

    一.屏幕显示图像原理 首先明确两个概念:水平同步信号.垂直同步信号. CRT 的电子枪按照上图中的方式,从上到下一行一行的扫描,扫描完成后显示器就呈现一帧画面,随后电子枪回到初始位置继续下一次的扫描. ...