spring-cloudAlibaba使用sentinel实现熔断限流的步骤

一、sentinel的熔断、降级
a、远程调用

熔断是要结合远程调用来实现的(Feign或者openFeign),OpenFeign是Spring Cloud 在Feign的基础上支持了Spring MVC的注解,如@RequesMapping等等。
①导包:

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

② 开启注解 @EnableFeignClients ③远程调用(在下面的sentinel一起讲解)

b、服务熔断降级

1、导包

<!--sentinel-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

2、在yml中配置,开启sentinel的熔断机制
#开启远程调用sentinel熔断

feign:
  sentinel:
    enabled: true

3、远程调用并熔断降级
调用处:

@FeignClient(value = "service-provider",fallback = BeautyFeignFallBack.class)
public interface BeautyFeignClients {
    @PostMapping(value = "/provider/beauty/querybycondition")
     R queryBeauty(@RequestBody Beauty beauty);
}

回调处:

@Component
@Slf4j
public class BeautyFeignFallBack implements BeautyFeignClients {
    @Override
    public R queryBeauty(Beauty beauty) {
        log.info("服务熔断……………………");
        return R.error(CommonConstant.reCodeMessage.VISIT_FAIL.getCode(),"sentinel调用熔断降级了");
    }
}

到这里就可以算完成了熔断降级。

二、流量监控与限流
① 导包
<!--审计-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>2.3.3.RELEASE</version>
        </dependency>
②、下载sentinel控制台
https://github.com/alibaba/Sentinel/releases

例如下载了:sentinel-dashboard-1.7.1.jar

启动sentinel控制台(windows):
 java -jar sentinel-dashboard-1.7.1.jar --server.port=8333
③、配置控制台地址信息,在yml中

①:对外暴露

management.endpoints.web.exposure.include=*

②:连接sentinel控制台

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8333
        port: 8719
④、访问localhost:8333(这里根据实际sentinel地址来配置)就可以看到效果了。

在控制台调整参数【所有设置默认是在内存中,重启失效】,限流就是在这里进行

三、这里额外讲解一下 被调用方限流与网管限流
1、被调用方限流

在超大浏览时必须牺牲一些远程服务,在服务提供方制定降级策略。(在服务提供方)
在sentinel的控制台–>簇点电路里面限制某接口的流量 。
例如:单机阈值为1 即QPS 为1。
那么QPS超过 1:就会停止提供服务
这里可以手动制定返回数据内容:
写一个配置类

/**
 * @author Admin
 * sentinel控制限流,超过限流次数,返回自定义文字
 */
@Configuration
public class SentinelLimitFlowConfig {
    public SentinelLimitFlowConfig(){
        WebCallbackManager.setUrlBlockHandler(new UrlBlockHandler() {
            @Override
            public void blocked(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws IOException {
                R error = R.error(CommonConstant.reCodeMessage.LIMIT_TIMES.getCode(),"在服务提供方限制访问流量");
                httpServletResponse.setCharacterEncoding("UTF-8");
                httpServletResponse.setContentType("application/json");
                httpServletResponse.getWriter().write(JSON.toJSONString(error));
            }
        });
    }
}

总结:在服务提供端限流的步骤
第一、其他步骤跟在服务调用方一致,只需在sentinel控制台,对服务提供者的微服务的具体接口进行限流设置。
第二、写一个配置类,用于返回超流量后的返回信息。不写的话返回自带的限流信息,不规范。

2、网关限流(gateway限流)

① 给网关微服务导包

<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
            <version>2.1.0.RELEASE</version>
        </dependency>

② 网关微服务 配置yml
对外暴露

management.endpoints.web.exposure.include=*

连接sentinel控制台地址

spring:
  cloud:
   sentinel:
      transport:
        dashboard: localhost:8333
        port: 8719

③自定义网关限流返回内容

@Configuration
public class SentinelGatewayConfig {
    public SentinelGatewayConfig(){
        GatewayCallbackManager.setBlockHandler(new BlockRequestHandler() {
            @Override 
            public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
                R error = R.error(CommonConstant.reCodeMessage.VISIT_FAIL.getCode(), "我是网关限流,你已超流量了,被我拦截了,哈哈哈");
                String s = JSON.toJSONString(error);
                Mono<ServerResponse> body = ServerResponse.ok().body(Mono.just(s), String.class);
                return body;
            }
        });
    }
}

④启动后在sentinel控制台设置限流
控制台界面---->网关微服务---->
流控规则---->新增网关流控规则,API 名称 填写网关yml里面的路由配置的 - id对应的内容(例如:- id: provider-route)
这里就填provider-route 。即对该- id对应的路由微服务进行限流。QPS阈值和间隔 分别对应访问次数和时间。
再次访问:在设定时间里超过QPS ,则不能进入该微服务。