【笔记于学习尚硅谷课程所作】
1、 高并发方法论&简介
- 熔断:A服务调用B服务的某个功能,由于网络不稳定问题,或者B服务卡机,导致功能时间超长。如果这样子的次数太多。我们就可以直接将B断路了(A不再请求B接口),凡是调用B的直接返回降级数据,不必等待B的超长执行。这样 B的故障问题,就不会级联影响到A。
- 降级:整个网站处于流量高峰期,服务器压力剧增,根据当前业务情祝及流量,对一些服务和页面进行有策略的降级(停止服务,所有的调用直接返回降级数据)。以此缓解服务器资源的的压力,以保证核心业务的正常运行,同时也保持了客户和大部分客户的得到正确的相应。
- 限流:对打入服务的请求流量进行控制,使服务能够承担不超过自己能力的流量压力
熔断和降级异同:
- 相同点:
- 为了保证集群大部分服务的可用性和可靠性,防止崩溃,牺牲小我
- 用户最终都是体验到某个功能不可用
- 不同点:
- 熔断是被调用方故障,触发的系统主动规则
- 降级是基于全局考虑,停止一些正常服务,释放资源
2、 Sentinel整合
(1)导入依赖
<!--Sentinel场景启动器 - 流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
(2)下载对应版本的控制台
(3)启动控制台,在控制台的目录下
java -jar sentinel-dashboard-1.7.1.jar --server.port=9999
(4)访问localhost:9999,默认用户名密码sentinel/sentinel
(5)在需要保护的服务的application.properties添加配置
spring.cloud.sentinel.transport.dashboard=localhost:9999
spring.cloud.sentinel.transport.port=8719
(6)导入actuator
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
(7)在application.properties添加配置
management.endpoints.web.exposure.include=*
(8)自定义sentinel的流控返回规则(核心包1.6.x之前有效,1.7开始内部依赖出现改版,参考Spring Cloud Alibaba v2.2.0 升级问题整理)
@Configuration
public class MySentinelConfig {
public MySentinelConfig() {
WebCallbackManager.setUrlBlockHandler(new UrlBlockHandler() {
@Override
public void blocked(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws IOException {
R error = R.error(BizCodeEnume.TO_MANY_REQUEST.getCode(), BizCodeEnume.TO_MANY_REQUEST.getMsg());
httpServletResponse.setCharacterEncoding("UTF-8");
httpServletResponse.setContentType("application/json");
httpServletResponse.getWriter().write(JSON.toJSONString(error));
}
});
}
}
(9)整合网关
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-alibaba-sentinel-gateway -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
(10) 定制网关流控返回
@Configuration
public class MySentinelGatewayConfig {
public MySentinelGatewayConfig() {
GatewayCallbackManager.setBlockHandler(new BlockRequestHandler() {
/**
* 网关限流了请求,就会调用此回调
* @param serverWebExchange
* @param throwable
* @return
*/
@Override
public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
R error = R.error(BizCodeEnume.TO_MANY_REQUEST.getCode(), BizCodeEnume.TO_MANY_REQUEST.getMsg());
String errJson = JSON.toJSONString(error);
Mono<ServerResponse> responseMono = ServerResponse.ok().body(Mono.just(errJson), String.class);
return responseMono;
}
});
}
}