赞
踩
服务的稳定是公司可持续发展的重要基石,随着业务量的快速发展,一些平时正常运行的服务,会出现各种突发状况,而且在分布式系统中,每个服务本身又存在很多不可控的因素,比如线程池处理缓慢,导致请求超时,资源不足,导致请求被拒绝,又甚至直接服务不可用、宕机、数据库挂了、缓存挂了、消息系统挂了...对于一些非核心服务,如果出现大量的异常,可以通过技术手段,对服务进行降级并提供有损服务,保证服务的柔性可用,避免引起雪崩效应。
服务熔断一般是指软件系统中,由于某些原因使得服务出现了过载现象,为防止造成整个系统故障,从而采用的一种保护措施。
服务降级是在服务器压力陡增的情况下,利用有限资源,根据当前业务情况,关闭某些服务接口或者页面,以此释放服务器资源以保证核心任务的正常运行。
在一个分布式系统里,一个服务依赖多个服务,可能存在某个服务调用失败,比如超时、异常等,需要保证在一个依赖出问题的情况下,不会导致整体服务失败。
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel
是面向分布式服务架构的流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来帮助您保障微服务的稳定性。
sentinel具有以下特征:
丰富的应用场景: Sentinel承接了阿里巴巴近十年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围),消息削峰填谷,集群流量控制,实时熔断下游不可用应用等
完美的实时监控: Sentinel同时提供实时的监控功能,您可以在控制台看到接入应用的单台机器秒级数据,甚至500台一下规模的集群的汇总运行情况
广泛的开源生态: Sentinel提供开箱即用的与其他框架/库的整合模块,例如与SpringCloud,Dubbo,gRPC的整合,您只需要引入响应的依赖并进行简单的配置即可快速接入Sentinel
完美的SPI扩展点: Sentinel提供简单易用的,完美的SPI扩展接口,可以通过实现扩展接口来快速定制逻辑,例如定制规则管理,适配动态数据源等
下面是sentinel
的架构图:
sentinel
的使用可以分为两个部分
核心库不依赖任何框架/库,能够允许在jdk7
以上的版本运行时环境,同时对Dubbo、SpringCloud等框架也有比较好的支持。
控制台主要负责管理推送规则、监控、集群限流分配管理、机器发现等。
注意:启动 Sentinel 控制台需要 JDK 版本为 1.8 及以上版本。
可以从https://github.com/alibaba/Sentinel/releases
下载sentinel-dashboard-$version.jar
包。
使用如下命令启动控制台:
java -Dserver.port=8718 -Dcsp.sentinel.dashboard.server=localhost:8718 -Dproject.name=sentinel-dashboard -Dcsp.sentinel.api.port=8719 -jar D:\sentinel\sentinel-dashboard-1.8.0.jar
其中-Dserver.port=8718
用于指定Sentinel
控制台端口为8718
,F:\software\sentinel\sentinel-dashboard-1.8.0.jar
为下载的包路径地址。
提示
如果觉得官网下载慢,可以使用我分享的网盘地址: https://pan.baidu.com/s/1E9J52g6uW_VFWY34fHL6zA 提取码: vneh
Sentinel
提供了一个可视化的操作平台,安装好之后,在浏览器中输入(http://localhost:8718 (opens new window))就可以访问了,默认的用户名和密码都是sentinel
(我使用的是1.8.0版本)
1、添加依赖
- <!-- springcloud alibaba sentinel -->
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
- </dependency>
-
- <!-- SpringBoot Web -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
2、添加Sentinel配置
- spring:
- application:
- # 应用名称
- name: ruoyi-xxxx
- cloud:
- sentinel:
- # 取消控制台懒加载
- eager: true
- transport:
- # 控制台地址
- dashboard: 127.0.0.1:8718
3、自定义限流异常处理
- public class SentinelFallbackHandler implements WebExceptionHandler
- {
- private Mono<Void> writeResponse(ServerResponse response, ServerWebExchange exchange)
- {
- return ServletUtils.webFluxResponseWriter(exchange.getResponse(), "请求超过最大数,请稍候再试");
- }
-
- @Override
- public Mono<Void> handle(ServerWebExchange exchange, Throwable ex)
- {
- if (exchange.getResponse().isCommitted())
- {
- return Mono.error(ex);
- }
- if (!BlockException.isBlockException(ex))
- {
- return Mono.error(ex);
- }
- return handleBlockedRequest(exchange, ex).flatMap(response -> writeResponse(response, exchange));
- }
-
- private Mono<ServerResponse> handleBlockedRequest(ServerWebExchange exchange, Throwable throwable)
- {
- return GatewayCallbackManager.getBlockHandler().handleRequest(exchange, throwable);
- }
- }
4、网关限流配置
- @Configuration
- public class GatewayConfig
- {
- @Bean
- @Order(Ordered.HIGHEST_PRECEDENCE)//定义组件的加载顺序:(最早执行)
- public SentinelFallbackHandler sentinelGatewayExceptionHandler()
- {
- return new SentinelFallbackHandler();
- }
- }
5、控制台配置流控规则(此配置代表1s内访问system路径下的接口的阈值为1次)否则触发限流
当sentinel
重新启动时,sentinel dashboard
中原来的数据将会全部消失,这样就需要重新定义限流规则,无疑是不可取的。所以需要将sentinel
中定义的限流规则保存到配置中心里面。
具体的实现方法如下:
1、在nacos中定义自定义限流策略sentinel-ruoyi-gateway
- [
- {
- "resource": "wjyk-system",
- "count": 1,
- "grade": 1,
- "limitApp": "default",
- "strategy": 0,
- "controlBehavior": 0
- }
- ]
2、添加依赖
- <!-- springcloud alibaba nacos config -->
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
- </dependency>
-
- <!-- sentinel datasource nacos -->
- <dependency>
- <groupId>com.alibaba.csp</groupId>
- <artifactId>sentinel-datasource-nacos</artifactId>
- </dependency>
3、添加相关配置,sentinel
下面的dataSource
中配置nacos
- spring:
- application:
- # 应用名称
- name: ruoyi-xxxx
- cloud:
- nacos:
- config:
- # 配置中心地址
- server-addr: 127.0.0.1:8848
- # 配置文件格式
- file-extension: yml
- # 共享配置
- shared-configs:
- - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
- sentinel:
- # 取消控制台懒加载
- eager: true
- transport:
- # 控制台地址
- dashboard: 127.0.0.1:8718
- # nacos配置持久化
- datasource:
- ds1:
- nacos:
- server-addr: 127.0.0.1:8848
- dataId: sentinel-ruoyi-gateway
- groupId: DEFAULT_GROUP
- data-type: json
- rule-type: flow
4、启动sentinel
应用,可以看到我们在nacos
中配置的限流规则
“钱虽然没挣着,但是倒也没白干,起码累着了!” ——奥德彪
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。