一、Sentinel 是什么

Sentinel 是阿里中间件团队开源的,面向分布式服务架构的轻量级流量控制产品,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保护服务的稳定性。 点此地址了解更多Sentinel

二、Sentinel 怎么用

Sentinel分为两个部分:客户端以及控制台。

  • 控制台用于管理限流,熔断规则的发布与监控。
  • 客户端则用于接收规则,并执行相关规则。

1. 下载Sentinel控制台

当前最新的release版本为1.4.0

https://github.com/alibaba/Sentinel/releases/tag/1.4.0

2. 运行Sentinel控制台

注意:启动 Sentinel 控制台需要 JDK 版本为 1.8 及以上版本。

使用如下命令启动控制台:

java -Dserver.port=8080 \
-Dcsp.sentinel.dashboard.server=localhost:8080 \
-Dproject.name=sentinel-dashboard \
-jar sentinel-dashboard.jar

其中 -Dserver.port=8080 用于指定 Sentinel 控制台端口为 8080。

访问http://localhost:8080查看控制台信息。

3. 客户端Dubbo集成

使用时需引入以下模块(以 Maven 为例):

<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-dubbo-adapter</artifactId>
<version>1.4.0</version>
</dependency> <dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
<version>1.4.0</version>
</dependency>

启动时加入 JVM 参数

-Djava.net.preferIPv4Stack=true \
-Dcsp.sentinel.api.port=8720 \
-Dcsp.sentinel.dashboard.server=localhost:8787 \
-Dproject.name=example-customer

启动项参数说明:

  • -Dcsp.sentinel.api.port 接受数据推荐的http端口
  • -Dcsp.sentinel.dashboard.server 指定控制台地址
  • -Dproject.name 指定控制台显示的项目名称

更详细的信息可以参考启动配置项

然后你可以愉快的打开控制台对你的服务进行限流,熔断降级了。

三、现有的问题

  1. 规则的推送目前采用的是以http接口的形式进行数据处理,当发布规则时,需要采用遍历所有的客户端,以http的形式进行数据推送,此方式的问题在于服务部署数量越来越多,发布规则也就越来越慢,越来越困难。
  2. Sentinel的熔断限流统计则是以异常发生数为依据,真正使用过程中还需要排除业务异常。
  3. 监控数据目前的做法是遍历所有的客户端采用http进行批量远程读取,并存储入库,且实时监控仅能查看5分钟内的metric数据。
  4. Sentinel的启动注入参数的方式太过原始。

四、如何改造

1. 关于Dashboard的数据推送问题的改造,思路可以考虑将数据传递到配置中心,利用配置中心来进行数据推送广播。

  • 改造前:客户端利用sentinel-transport-simple-http模块暴露一个特定的端口,Sentinel Dashboard通过http的形式进行数据推送,客户端接收后将规则保存在本地内存中。
  • 改造后:客户端注册到相关的注册中心中,Sentinel Dashboard控制台将配置信息推送到配置中心,如nacos,zookeeper中,由配置中心去进行配置推送。

2. 关于Sentinel的业务异常问题,可以考虑采用类似于Hystrix的方法,HystrixBadRequestException被Hystrix认定为这是消费者自身的问题,而非提供者的服务不稳定,即我们常说的业务异常不被熔断。

方法1:采用包装异常的形式,将所有的异常包装为统一的结构体,并设定异常状态码,例如业务异常都是400,服务异常是500。

public class Result<T> {

    /**
* 状态码
*/
private int code; /**
* 消息
*/
private String message; /**
* 数据
*/
private T result; // TODO 忽略get,set
} Entry entry = null;
try {
entry = SphU.entry(resourceName, entryType, 1, pjp.getArgs());
Object result = pjp.proceed(); // 核心判断
if (result instanceof Result && ((Result) result).getCode() == 500) {
Tracer.trace(new RuntimeException(((Result) result).getMessage()));
}
return result;
} catch (BlockException ex) {
return handleBlockException(pjp, annotation, ex);
} catch (Throwable ex) {
Tracer.trace(ex);
throw ex;
} finally {
if (entry != null) {
entry.exit();
}
}

方法2:采用抛异常的形式,定义一个BussinessException业务异常。

Entry entry = null;
try {
entry = SphU.entry(resourceName, entryType, 1, pjp.getArgs());
return pjp.proceed();
} catch (BlockException ex) {
return handleBlockException(pjp, annotation, ex);
} catch (BussinessException ex) {
// 核心处理
throw ex;
} catch (Throwable ex) {
Tracer.trace(ex);
throw ex;
} finally {
if (entry != null) {
entry.exit();
}
}

至于采用何种方式进行改造,见仁见智吧。

3. Sentinel监控问题,可以考虑采用CrateDB + Grafana/或者数据落地InfluxDB等方式。

相关链接参考:

4. Sentinel的启动注入参数的方式太过原始,可以考虑使用spring-boot-starter的方式,采用自动化配置。

五、项目推荐

楼主自己改造了一个版本,目前已实现的功能如下:

  1. 新增dubbo的filter将异常包装成统一返回体,将异常状态码定义为>=500的值(与HttpStatus相对应),修改SentinelResourceAspect实现,判断返回的状态码是否为>=500,如果是则进行熔断统计。
  2. 并新增sentinel-dubbo-starter,进行自动配置化。
  3. Sentinel Dashboard改造:控制台规则 -> 配置中心 -> 客户端。

欢迎start,如有问题,欢迎指出,共同进步:

Dubbo使用Sentinel来对服务进行降级与限流的更多相关文章

  1. 2流高手速成记(之八):基于Sentinel实现微服务体系下的限流与熔断

    我们接上回 上一篇中,我们进行了简要的微服务实现,也体会到了SpringCloudAlibaba的强大和神奇之处 我们仅改动了两个注释,其他全篇代码不变,原来的独立服务就被我们分为了provider和 ...

  2. 服务熔断、降级、限流、异步RPC -- HyStrix

    背景 伴随着业务复杂性的提高,系统的不断拆分,一个面向用户端的API,其内部的RPC调用层层嵌套,调用链条可能会非常长.这会造成以下几个问题: API接口可用性降低 引用Hystrix官方的一个例子, ...

  3. Spring Cloud实践:降级、限流、滚动、灰度、AB、金丝雀的实现思路

    端口:8888,方便起见直接读取配置文件,生产环境可以读取git.application-dev.properties为全局配置.先启动配置中心,所有服务的配置(包括注册中心的地址)均从配置中心读取. ...

  4. SpringCloud 中集成Sentinel+Feign实现服务熔断降级

    Sentine 1.背景 Sentinel 是阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度来帮助用户保护服务的稳 ...

  5. springcloud组件之hystrix服务熔断,降级,限流

    hystrix 简介 Hystrix是什么 在分布式环境中,许多服务依赖项中的一些必然会失败.Hystrix是一个库,通过添加延迟容忍和容错逻辑,帮助你控制这些分布式服务之间的交互.Hystrix通过 ...

  6. 6.Sentinel源码分析—Sentinel是如何动态加载配置限流的?

    Sentinel源码解析系列: 1.Sentinel源码分析-FlowRuleManager加载规则做了什么? 2. Sentinel源码分析-Sentinel是如何进行流量统计的? 3. Senti ...

  7. Spring cloud微服务安全实战-6-8sentinel限流实战

    阿里2018年开源的. 简单来说就是干三件事,最终的结果就是保证你的服务可用,不会崩掉.保证服务高可用. 流控 先从最简单的场景来入手. 1.引用一个依赖, 2,声明一个资源. 3.声明一个规则 注意 ...

  8. 服务治理-Resilience4j(限流)

    Bulkhead Bulkhead一般用于服务调用客户端,用于限定对特定的服务的并发请求数量,起到一下作用:1.防⽌下游依赖被并发请求冲击2.防⽌发⽣连环故障 1.配置规则“order” //允许最大 ...

  9. 不死的小强 .net core 微服务 快速开发框架 Viper 限流

    1.Viper是什么? Viper 是.NET平台下的Anno微服务框架的一个示例项目.入门简单.安全.稳定.高可用.全平台可监控.底层通讯可以随意切换thrift grpc. 自带服务发现.调用链追 ...

随机推荐

  1. Confluence 6 编辑一个附加文件的属性

    你需要具有空间的 添加附件(Add Attachment)权限来编辑文件的属性. 希望编辑一个附加文件的属性: Go to  > Attachments 单击你希望编辑附件边上的 属性(Prop ...

  2. 51 Nod 1272 简单思维题

    1272 最大距离  题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 给出一个长度为N的整数数组A,对于每一个数组元素 ...

  3. 灰度图像--图像分割 阈值处理之OTSU阈值

    学习DIP第55天 转载请标明本文出处:***http://blog.csdn.net/tonyshengtan ***,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发:http ...

  4. 大体知道java语法2----------理解面向对象

    我参加过大大小小n场面试,被好几位面试官问到过:能不能谈谈面向对象的几大特征?什么是面向对象?对于这两个问题,我始终觉得一定要理解,其实不只是这种概念题(姑且算它是概念题吧),包括各种语法都应该去理解 ...

  5. 关于开发APP接口版本不兼容的问题

    关于 APP接口版本兼容的问题. iOS和android 要不断开发新版本,很多服务端开发都是在以前接口的逻辑上进行修改. 新的APP和接口开发后,接口如何兼容老的APP? 有的公司 每次发布完APP ...

  6. UEFI和GPT

    好就没用linux了,这几天在win8笔记本上用虚拟机装了下,也准备装到硬盘上和win8双系统使用,发现一些概念已经跟不上时代了. 一个是在虚拟机中装的时候,分配了虚拟硬盘分区时,提示选择分区表类型, ...

  7. 苹果用户转入mate30,被恶心到了

    几年没更新博客了,今天入了新坑,一堆东西想吐槽,发一篇喷一波. 几千块的机器,牛皮癣广告居然这么鬼多,预装一打,推荐一打,不比千元机少,这TM是旗舰机啊.华为官方产的 app打着服务旗号,不给权限强退 ...

  8. MemoScope.Net

    What is MemoScope.Net ? It's a tool to analyze .Net process memory: it can dump an application's mem ...

  9. Linux搭建PHP环境(LAMP)

    //安装Apache的命令 # yum install httpd //启动Apache的命令 # service httpd start //安装MySQL的命令 # wget http://dev ...

  10. FTP文件上传和下载(JAVA)

    前文 1.使用FTP的方式进行文件的上传和下载(非SFTP) 2.本人手打,亲测,代码是最简单的,清晰易懂,需要的同学请结合自己的实际添加业务逻辑 2.第三方的jar包:import org.apac ...