Sentinel是一个开源的云原生流量控制和熔断降级的组件,它可以实现对微服务架构中的服务进行实时监控、自动降级、熔断限流等功能。Sentinel的核心原理是通过滑动窗口的方式对请求进行控制,当请求超过阈值时,会自动触发熔断操作,避免因请求过多而导致服务崩溃。
目录
- Spring Cloud与Sentinel的集成方式
- Sentinel在Spring Cloud中的应用场景
- Alibaba Sentinel的优点
- 官方文档
- 与GateWay整合
- 运行
- 操作控制台
- 对具体API请求进行流控
- 自定义流控提醒
- 熔断
- 流控、熔断自定义提示:
- 持久化
Spring Cloud与Sentinel的集成方式
Spring Cloud与Sentinel可以通过Spring Cloud Gateway来实现集成。Spring Cloud Gateway是一个基于Spring Boot的API网关,它可以作为微服务架构中的入口,对外提供RESTful API服务。通过Spring Cloud Gateway可以将所有的请求都路由到Sentinel进行流量控制和熔断降级。
Sentinel在Spring Cloud中的应用场景
服务发现和注册:通过Spring Cloud Alibaba Nacos来实现服务的注册和发现,并将服务注册到Sentinel中进行管理。
负载均衡:通过Spring Cloud Alibaba Ribbon来实现负载均衡,并将请求转发到不同的服务实例上。
流量控制和熔断降级:通过Spring Cloud Alibaba Sentinel来实现流量控制和熔断降级,避免因请求过多而导致服务崩溃。
分布式跟踪:通过Spring Cloud Alibaba Dubbo来实现分布式跟踪,并将跟踪信息发送到Zipkin等工具中进行分析。
配置中心:通过Spring Cloud Alibaba Nacos来实现配置中心,并将配置信息存储到Nacos中进行管理。
Alibaba Sentinel的优点
简单易用:提供了丰富的文档和示例,开发人员可以快速上手使用。
高效稳定:经过大规模生产环境验证的开源项目,具有高效稳定的特性。
功能丰富:提供了丰富的功能模块,可以帮助开发人员快速构建高可用的分布式系统。
官方文档
中文文档
网关流控说明
下载地址:Releases · alibaba/Sentinel (github.com)
与GateWay整合
运行
java -Dserver.port=8050 -Dcsp.sentinel.dashboard.server=localhost:8050 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
依赖
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- 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>
</dependency>
添加properties配置
spring.cloud.sentinel.transport.dashboard=127.0.0.1:8050
进入后台
运行sentinel与gateway模块进入后台http://localhost:8050/#/login
随便访问一个存在的接口:
操作控制台
对具体API请求进行流控
自定义流控提醒
.properties方式
spring.cloud.sentinel.scg.fallback.mode=response
spring.cloud.sentinel.scg.fallback.response-body="{'code':201,'message':'限流了'}"
熔断
流控、熔断自定义提示:
配置类方式:
// 主体代码需自定义完成,以下代码未完善
import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.BlockRequestHandler;
import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.GatewayCallbackManager;
import com.alibaba.nacos.common.utils.StringUtils;
import io.netty.util.internal.StringUtil;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.server.ServerResponse;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import javax.annotation.PostConstruct;
import java.util.HashMap;
@Configuration
public class GatewayConfig {
@PostConstruct //初始化时配置
public void init(){
BlockRequestHandler blockRequestHandler = new BlockRequestHandler() {
@Override
public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
System.out.println(throwable+"-----");
String message = throwable.getMessage();
HashMap<String,String> map = new HashMap<>();
if (StringUtils.isNotBlank(message) &&message.equals("$D")){
map.put("code", HttpStatus.TOO_MANY_REQUESTS.toString());
map.put("message","限流了");
}else {
map.put("code", HttpStatus.TOO_MANY_REQUESTS.toString());
map.put("message","服务熔断了");
}
//自定义异常处理
return ServerResponse.status(HttpStatus.OK)
.contentType(MediaType.APPLICATION_JSON)
.body(BodyInserters.fromValue(map));
}
};
GatewayCallbackManager.setBlockHandler(blockRequestHandler);
}
}
持久化
为了解决Sentinel组件无法正常的与具有认证功能的Nacos整合的设计问题,最佳的做法是直接部署一个新的Nacos应用服务(为了大家看的清楚,讲解的时候还是分开。)
添加依赖
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
.properties配置
spring.cloud.sentinel.transport.dashboard=127.0.0.1:8050
spring.cloud.sentinel.datasource.ds2.nacos.server-addr=localhost:8848
spring.cloud.sentinel.datasource.ds2.nacos.data-id=sentinel-test
spring.cloud.sentinel.datasource.ds2.nacos.group-id=DEFAULT_GROUP
spring.cloud.sentinel.datasource.ds2.nacos.data-type=json
spring.cloud.sentinel.datasource.ds2.nacos.rule-type=flow
spring.cloud.sentinel.datasource.ds2.nacos.username=nacos
spring.cloud.sentinel.datasource.ds2.nacos.password=nacos
根据上面的data-id以及分组group-id,我们在nacos中新建配置如下:
[
{
"resource": "api-v8-order1",
"resourceMode": 0,
"count": 1,
"intervalSec": 10
},
{
"resource": "customized_api",
"resourceMode": 1,
//pattern没有效果,可能没有这个参数
"pattern": "/api/v5/**",
"count": 1,
"intervalSec": 10
}
]
resource: 资源名称
limitApp: 来源应用
grade:阈值类型,0表示线程数,1表示QPS;
count:单机阈值;
strategy: 流控模式,0表示直接,1表示关联,2表示链路
controlBehavior:流控效果,0表示快速失败,1表示Warm Up,2表示排队等待;
clusterMode:是否集群