Dubbo使用Sentinel来对服务进行降级与限流
2018-12-26 16:29
1006 查看
一、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 指定控制台显示的项目名称
更详细的信息可以参考启动配置项。
然后你可以愉快的打开控制台对你的服务进行限流,熔断降级了。
三、现有的问题
- 规则的推送目前采用的是以http接口的形式进行数据处理,当发布规则时,需要采用遍历所有的客户端,以http的形式进行数据推送,此方式的问题在于服务部署数量越来越多,发布规则也就越来越慢,越来越困难。
- Sentinel的熔断限流统计则是以异常发生数为依据,真正使用过程中还需要排除业务异常。
- 监控数据目前的做法是遍历所有的客户端采用http进行批量远程读取,并存储入库,且实时监控仅能查看5分钟内的metric数据。
- 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的方式,采用自动化配置。
五、项目推荐
楼主自己改造了一个版本,目前已实现的功能如下:
- 新增dubbo的filter将异常包装成统一返回体,将异常状态码定义为>=500的值(与HttpStatus相对应),修改SentinelResourceAspect实现,判断返回的状态码是否为>=500,如果是则进行熔断统计。
- 并新增sentinel-dubbo-starter,进行自动配置化。
- Sentinel Dashboard改造:控制台规则 -> 配置中心 -> 客户端。
欢迎start,如有问题,欢迎指出,共同进步:
相关文章推荐
- 7、何时进行服务熔断、服务降级、服务限流?
- 分布式架构学习之:003--使用Dubbo进行规模服务化前的工程结构优化
- 使用 Dubbo 对遗留单体系统进行微服务改造
- spring cloud RestTemplate消费者使用Hystrix进行容错和服务降级
- 基于Dubbo的分布式系统架构-使用Dubbo进行规模服务化前的工程结构优化
- 使用系统服务对手机进行操作
- 使用 OpenSSL API 进行安全编程,第 3 部分: 提供安全服务
- dubbo开发中使用到的一些服务配置方式
- springboot(二十):使用spring-boot-admin对spring-boot服务进行监控
- Dubbo使用multicast广播注册中心暴露服务地址时启动报错empty notify
- 使用Zipkin和Brave 实现dubbo服务调用跟踪
- SpringCloud(第 013 篇)电影微服务使用定制化 Feign 在客户端进行负载均衡调度并为 Feign 配置帐号密码登录认证 Eureka
- 学习dubbo(五):使用maven构建dubbo服务的可执行的jar
- Dubbo源码解析 —— 逻辑层设计之服务降级
- dubbo中使用自建jetty服务监控一些指标
- 使用微软企业库5.0进行WCF服务边界上的异常保护
- 安卓调用系统语音识别功能全解(谷歌语音服务):获取识别结果,使用语音识别进行搜索。
- 使用APMServ服务配置如何进行Wordpress本地伪静态设置
- SpringBank 开发日志 使用maven构建dubbo服务的可执行jar包
- 【性能测试-jmeter】使用jmeter做dubbo服务线程同步并发测试(多图)