整合三部曲 添加依赖 ,添加配置,添加注解
下载Sentinel
java -jar 启动 进入控制台
添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!--gateway整合sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
<!-- sentinel Push模式依赖 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<exclusions>
<exclusion>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</exclusion>
</exclusions>
</dependency>
添加配置
# 熔断限流
sentinel:
transport:
dashboard: ${wfx.ip}:8080
#取消控制台懒加载
eager: true
datasource:
#这里用的是Push模式 把配置推送到nacos上 防止重启之后 限流配置失效
ds1:
nacos:
#流控规则
server-addr: ${wfx.ip}:8848
data-id: ${spring.application.name}-${spring.profiles.active}-flow
groupId: ${spring.application.name}-group
data-type: json
rule-type: flow
Nacos配置管理添加 gateway-server-dev-flow
[
{
#资源名,即限流规则的作用对象
"resource": "search-server",
#限流阈值类型,QPS 或线程数,0 代表根据并发数量来限流,1 代表根据 QPS 来进行流量控制
"grade": 1,
#限流阈值
"count": 1,
#根据调用关系选择策略 0直连 1关联 2链路
"strategy": 0,
#流控效果(0直接拒绝 / 1排队等待 / 2慢启动模式),不支持按调用关系限流
"controlBehavior": 0
}
]
gateway只做上游服务的流控规则 上游调用下游服务的时候,可以单独在下游服务做流控,降级或者来源访问控制
整合gateway网关sentinel统一返回熔断信息
@Slf4j
@Configuration
@RequiredArgsConstructor
public class MyUrlBlockHandler {
private final BaseBean baseBean;
@PostConstruct
public void init() {
BlockRequestHandler blockRequestHandler = new BlockRequestHandler() {
@Override
public Mono<ServerResponse> handleRequest(ServerWebExchange exchange, Throwable t) {
Route gatewayUrl = exchange.getRequiredAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);
URI uri = gatewayUrl.getUri();
String authority = uri.getAuthority();
log.info("系统环境:{},限流=====Ip:{},请求服务名:{},url:{},路径:{}"
, baseBean.getEv()
, IpUtil.getIp(exchange.getRequest())
, authority
, exchange.getRequest().getURI()
, exchange.getRequest().getPath());
Map map = new HashMap();
map.put("code", ErrorEnum.SYSTEM_OFTEN.code());
map.put("msg", ErrorEnum.SYSTEM_OFTEN.value());
map.put("data", "");
return ServerResponse.status(HttpStatus.OK)
.contentType(MediaType.APPLICATION_JSON)
.body(BodyInserters.fromValue(map));
}
};
GatewayCallbackManager.setBlockHandler(blockRequestHandler);
}
}
启动gateway
sentinel控制台会出现一下信息
测试
search-server服务下期搭建