文档章节

Dubbo使用Sentinel来对服务进行降级与限流

nonnetta
 nonnetta
发布于 2018/12/24 19:53
字数 1321
阅读 900
收藏 21

一、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,如有问题,欢迎指出,共同进步:

© 著作权归作者所有

nonnetta
粉丝 7
博文 9
码字总数 8465
作品 0
厦门
高级程序员
私信 提问
Dubbo 的流量防卫兵| Sentinel如何通过限流实现服务的高可用性

在复杂的生产环境下可能部署着成千上万的服务实例,当流量持续不断地涌入,服务之间相互调用频率陡增时,会产生系统负载过高、网络延迟等一系列问题,从而导致某些服务不可用。如果不进行相应...

中间件小哥
2018/08/09
0
0
阿里巴巴宣布 Sentinel 开源,进一步完善 Dubbo 生态(附PPT和视频)

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。Sentinel 作为阿里巴巴“大中台、小前...

中间件小哥
2018/08/03
0
0
阿里巴巴开源 Sentinel,进一步完善 Dubbo 生态

近日,阿里巴巴中间件团队宣布开源 Sentinel,并发布了首个社区版本v0.1.0。 Sentinel 作为阿里巴巴“大中台、小前台”架构中的基础模块,覆盖了阿里的所有核心场景,因此积累了大量的流量归...

h4cd
2018/08/03
14.6K
23
Spring Cloud 微服务架构实战(三)——使用alibaba-sentinel流量控制、熔断降级

什么是Sentinel 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 Sentinel 具有以下特...

xiaomin0322
06/05
85
0
dubbo服务配置sentinel

前言 前几天ali开源了Sentinel项目,Sentinel中文意思是哨兵,作为dubbo的配套项目,看字面意思是dubbo的一个监控系统,sentinel自己的官方文档上是这样说的:Sentinel 以流量为切入点,从流...

alexzhu592
2018/08/26
257
0

没有更多内容

加载失败,请刷新页面

加载更多

反编译9.png图片还原

本文链接:https://blog.csdn.net/a1140778530/article/details/10528507 经常反编译apk文件找资源,9.png的文件处理起来很麻烦。 最近使用Ant自动编译打包app时,从别处搜罗来的9.png文件导...

shzwork
5分钟前
1
0
Shell脚本应用 – for、while循环语句

一、for循环语句 在实际工作中,经常会遇到某项任务需要多次执行的情况,而每次执行时仅仅是处理的对象不一样,其他命令相同。例如:根据通讯录中的姓名列表创建系统账号等情况。 当面对各种...

linux-tao
5分钟前
1
0
RPA风潮下企业财务工作模式的变革

RPA(机器人流程自动化)在财务领域的应用,正给企业财务带来前所未有的改变。 前RPA时代,财务领域面临的痛点 在RPA机器人应用之前,企业财务工作进程的推进,主要通过财务人员人工操作或信...

UiBot
10分钟前
2
0
Hive之命令行修改表注释

最近遇到一个需求,在不重建表的情况下,修改表的注释,hive有没有类似关系型数据库的SQL命令来修改呢,找了下,亲测有效,如下List-1 List-1 hive>use your_schemahvie>ALTER TABLE tabl...

克虏伯
11分钟前
1
0
是什么,它的作用是什么

在HTML文档的首部往往会有这么一句话<!DOCTYPE html>,许多时候我们忽视了它的存在,它实际上是一个声明,告诉浏览器用哪种HTML版本的规范来解读HTML文档。 尽管我们不给出这句声明浏览器照样...

前端老手
16分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部