商城:Sentinel 流控

Sentinel:

SpringCloud:Sentinel实现熔断与限流(1)

使用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;
            }
        });
    }
}

 

 

 

阅读剩余
THE END