商城:Sentinel 流控
Sentinel:
使用Sentinel
整合springboot/cloud: https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel
整合
1.引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2.下载对应版本的控制台jar包
3.配置sentinel控制台的地址信息
spring:
cloud:
sentinel:
transport:
port: 8719
dashboard: localhost:8080
实时监控图表
1.导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2.配置
management.endpoints.web.exposure.include=*
自定义返回数据
@Configuration
public class SeckillSentinelConfig {
public SeckillSentinelConfig(){
WebCallbackManager.setUrlBlockHandler(new UrlBlockHandler() {
@Override
public void blocked(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws IOException {
R error = R.error(10001, "系统流量过大");
httpServletResponse.setCharacterEncoding("UTF-8");
httpServletResponse.setContentType("application/json");
httpServletResponse.getWriter().write(JSON.toJSONString(error));
}
});
}
}
全服务引入
每个服务都配置entinel控制台的信息与实时监控图表
熔断降级
使用Sentinel来保护feign远程调用
- 调用方的熔断保护:feign.sentinel.enabled=true
- 调用方手动指定远程服务的降级策略,远程服务被降级处理,触发我们的熔断回调方法
- 超大浏览的时候,必须牺牲一下远程服务,在服务的提供方(远程服务)指定降级策略;提供方在运行,但是不运行自己的业务逻辑,返回的是默认的降级数据(限流的数据);
如 product调用seckill的feign
@FeignClient(value = "gulimall-seckill",fallback = SeckillFeignFallback.class)
public interface SeckillFeignService {
@GetMapping("/sku/seckill/{skuId}")
R getSkuSeckillInfo(@PathVariable("skuId") Long skuId);
}
Fallback
@Component
public class SeckillFeignFallback implements SeckillFeignService {
@Override
public R getSkuSeckillInfo(Long skuId) {
return R.error(10001,"失败");
}
}
如上如果商品调用秒杀的时候,停掉秒杀服务模拟宕机。之前会报错,加入fallback后不会报错,会执行fallback方法,直接返回一个数据
自定义受保护的资源
1.基于代码 这样在sentinel后台就可以操作 这个自定义名字 的链路进行流量控制
try{Entry entry = SphU.entry("自定义名字"){
//业务逻辑
}catch(Execption e){
}
2.基于注解 @SentinelResource
无论是1,2方式 一定要配置被限流后的默认返回
URL请求可以设置,同一返回:WebCallbackManager
网关流控
1.网关中引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
1.7版本之后的sentinel 网关中有一个API管理
2.定制网关流控返回
@Configuration
public class SentinelGatewayConfig {
public SentinelGatewayConfig(){
GatewayCallbackManager.setBlockHandler(new BlockRequestHandler() {
@Override
public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
R error = R.error(1, "网关流控返回");
String s = JSON.toJSONString(error);
Mono<ServerResponse> body = ServerResponse.ok().body(Mono.just(s), String.class);
return body;
}
});
}
}
阅读剩余
版权声明:
作者:Tin
链接:http://www.tinstu.com/2740.html
文章版权归作者所有,未经允许请勿转载。
THE END