常见微服务保护技术对比
既然上面我们分析了种种方案,那么对应这些方案又有哪些技术可以去落地呢?目前能结合SpringCloud支持微服务保护的技术一般是:Hystrix、Sentinel,在此我们横向比对下面两种常见技术:
对比指标 |
||
隔离策略 |
信号量隔离 |
线程池隔离/信号量隔离 |
熔断降级策略 |
慢调用比例/异常比例/异常数 |
失败比率 |
实时指标实现 |
滑动窗口(基于RxJava) |
|
规则配置 |
支持多种数据源 |
支持多种数据源 |
扩展性 |
多个扩展点 |
插件形式 |
基于注解的支持 |
支持 |
支持 |
限流 |
基于QPS、支持基于调用关系的限流 |
优先的支持 |
流量整形 |
支持冷启动、排队等待模式 |
不支持 |
系统自适应保护 |
支持 |
不支持 |
控制台 |
开箱即用、可配置规则、查看秒级监控、机器发现等 |
不完善 |
常见框架适配 |
Servlet、SpringCloud、Dubbo、gRPC等 |
Servlet、SpringCloud Netflix |
在种种差异中,我们重点关注红色标注的部分:
隔离策略
- 线程池隔离:同上述线程隔离案例,给不同业务分配不同线程池,这种方案可以杜绝雪崩问题;但是因为tomcat之外的线程池开销也使得系统开销增加,频繁的上下文切换将给系统性能带来额外的损失。
- 信号量隔离:不会给业务单独创建线程池(统一使用tomcat一个容器),而是限制每个业务能使用的线程数量。统计当前业务使用的线程数,当达到指定数量后(类似计数器)触发隔离。相较于线程池隔离性差一点。
熔断降级策略
- 慢调用比例/异常比例/异常数:统计调用中慢性能的比例、异常的比例、或异常数量均可触发熔断降级。
- 失败比例:只能根据异常请求比例触发熔断降级策略。
限流
- 基于QPS/调用链路:基于调用的QPS、调用链路都可以做到限流。
- 有限的控制:没有专门的限流方案,基于线程池隔离做的,线程池有多少线程数就限制到多少。
流量整形
- 慢调用/排队等待:避免突发流量的暴增而引起系统崩溃,而Hystrix则没有解决方案
控制台
- Sentinel有较为完善的控制台,界面化操作实时生效,而Hystrix只能查看一下服务状态,不可动态调整。
对比可以发现Hystrix的重点在于隔离、熔断为主的容错机制,而Sentinel的侧重点在于:多样化的流量控制、熔断降级、系统保护、实时监控和控制台。同时基于HyStrix停止维护,加上Sentinel在阿里巴巴经过双十一的高峰流量验证,目前国内主流保护还是选择了后者。因为后续的章节中我们也将借助于Sentinel为大家实践微服务保护相关的知识点。
2.2 Sentinel介绍
Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量控制、流量路由、熔断降级、系统自适应保护等多个维度来帮助用户保障微服务的稳定性。
丰富的应用场景:阿里巴巴 10 年双十一积累的丰富流量场景,包括秒杀、双十一零点持续洪峰、热点商品探测、预热、消息队列削峰填谷等多样化的场景
易于使用快速接入:简单易用,开源生态广泛,针对 Dubbo、Spring Cloud、gRPC、Zuul、Reactor、Quarkus 等框架只需要引入适配模块即可快速接入
多样化的流量控制:资源粒度、调用关系、指标类型、控制效果等多维度的流量控制
可视化的监控和规则管理:简单易用的 Sentinel 控制台
2.3 Sentinel本地安装与启动
相较于前面Nacos的下载、shell指令的启动,Sentinel为开发者提供开箱即用的jar包,您可以从 release 页面 下载最新版本的控制台 jar 包。也可以直接使用提供的:📎sentinel-dashboard-1.8.4.jar.zip
注意:启动 Sentinel 控制台需要 JDK 版本为 1.8 及以上版本;jar包需放在非中文路径下
使用指令启动:java -jar sentinel-dashboard.jar
Sentinel同时支持其余配置项来修改启动端口、用户名、密码:
配置项 |
默认值 |
说明 |
server.port |
8080 |
服务端口 |
server.dashboard.auth.username |
sentinel |
默认用户名 |
server.dashboard.auth.password |
sentinel |
默认密码 |
如修改启动端口则可使用下述指令:
java -Dserver.port=8080 -jar sentinel-dashboard.jar
启动后访问控制台:http://localhost:8080/#/login,账户密码均为:sentinel
2.4 服务整合Sentinel
1 引入Sentinel依赖
在order-service服务中新增sentinel的pom依赖,如下:
<!--引入Sentinel依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
2 配置控制台
spring: cloud: sentinel: transport: dashboard: localhost:8080
3 访问验证
注意:服务启动依赖Nacos,需先将Nacos启动:startup.cmd -m standalone
访问order-service服务任意接口:http://localhost:8088/order/101,去控制台实时监控即可查看如下: