Sentinel入门与进阶:微服务流量控制的最佳实践 ( 六 )

8.Gateway 整合 Sentinel(熔断、限流)

8.1.引入依赖

在 Spring Cloud Alibaba 2.1.6之前的版本,引入的是 sentinel-spring-cloud-gateway-adapter 包,并且需要自己实现好多配置类,2.1.6 之后的版本内部已经帮我们实现好了,所以使用起来比较简单了。

xml 复制代码
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!--2.1.6之前的版本是 adapter 的包,整合比较麻烦,需要写配置类-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>

8.2.配置 application.yml

需要 配置的是 gateway 和 sentinel

yaml 复制代码
        
 server:
  port: 19999       
 spring:
  application:
    name: sentinel-gateway
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: 10001
        group: DEFAULT_GROUP 
    gateway:   #配置gateway
      discovery:
        locator:
          lowerCaseServiceId: true
          enabled: true  #默认为false,true:开启通过微服务名访问
      routes:
        - id: nacos-route
          uri: lb://nacos-demo
          predicates:
            - Path=/nacosdemo/**
          filters:
            - StripPrefix=1

    sentinel:
      transport:
        dashboard: localhost:8080
      eager: true
      filter:
        enabled: false

8.3.sentinel 启动

sentinel 启动成功后界面发生变化

8.4.sentinel 配置限流规则

8.4.1.规则配置

以下配置说明:

API 名称:这个相当于一个服务的一个API的唯一ID;

阈值类型:1个 QPS 是完整的一次请求,发出请求并且拿到完成的请求结果;

QPS 阈值:每秒最大的QPS数;

间隔:请求间隔最大时间;

Burst size:宽容次数,比如我配置的是每秒访问3次以上进行流控,如果这个参数设置为 1 ,则每秒访问 4 次以上进行流控。

8.4.2.测试结果

测试,则返回 429 (429 是 Too Many Request 错误码)。

8.5.sentinel 配置熔断规则

8.5.1.规则配置

以 异常数 降级来举例

熔断策略:以什么样的策略熔断;

慢调用比例:请求超过最大RT值,比如 1ms;

熔断时长:接口发生异常后熔断时长;

最小请求次数:每秒请求最少的失败次数;

统计时长:在一定的时间段内最少请求 2 次,每个请求超过1ms, 请求数量大于 50%;

8.5.2.测试结果

测试,则会熔断,返回 DegradeException 异常,降级异常。

8.6.自定义流控降级异常信息

8.6.1.通过配置类配置

在 SentinelConfig 类中加入 init() 初始化方法(要用 @PostConstruct 注解进行初始化),定义异常处理提示信息即可。

java 复制代码
import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.BlockRequestHandler;
import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.GatewayCallbackManager;
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;
import java.util.Map;

@Configuration
public class SentinelConfig {
    @PostConstruct
    public void init(){
        BlockRequestHandler blockRequestHandler = new BlockRequestHandler() {
            @Override
            public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
                Map<String, String> result = new HashMap<>();
                result.put("code", HttpStatus.TOO_MANY_REQUESTS.toString());
                result.put("msg", "服务压力过大,请稍后重试!");
                return ServerResponse.status(HttpStatus.TOO_MANY_REQUESTS).contentType(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(result));
            }
        };
        GatewayCallbackManager.setBlockHandler(blockRequestHandler);
    }

}

8.6.2.通过application.yml 配置

主要配置 spring.cloud.sentinel.scg.fallback 即可。

yaml 复制代码
 server:
  port: 19999       
 spring:
  application:
    name: sentinel-gateway
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: 10001
        group: DEFAULT_GROUP 
    gateway:   #配置gateway
      discovery:
        locator:
          lowerCaseServiceId: true
          enabled: true  #默认为false,true:开启通过微服务名访问
      routes:
        - id: nacos-route
          uri: lb://nacos-demo
          predicates:
            - Path=/nacosdemo/**
          filters:
            - StripPrefix=1

    sentinel:
      transport:
        dashboard: localhost:8080
      eager: true
      filter:
        enabled: false
        
      scg:
        fallback:
          mode: response
          response-body: '{"code":"429 TOO_MANY_REQUEST", "msg":"服务压力过大,请稍后重试!"}'

8.6.3.测试结果

配置服务流控或者降级,阈值设置为1(总之小一点),快速发送请求返回自定义服务流控降级信息。

相关推荐
yuanbenshidiaos21 分钟前
c++---------数据类型
java·jvm·c++
向宇it25 分钟前
【从零开始入门unity游戏开发之——C#篇25】C#面向对象动态多态——virtual、override 和 base 关键字、抽象类和抽象方法
java·开发语言·unity·c#·游戏引擎
Lojarro38 分钟前
【Spring】Spring框架之-AOP
java·mysql·spring
莫名其妙小饼干41 分钟前
网上球鞋竞拍系统|Java|SSM|VUE| 前后端分离
java·开发语言·maven·mssql
isolusion1 小时前
Springboot的创建方式
java·spring boot·后端
Yvemil71 小时前
《开启微服务之旅:Spring Boot Web开发举例》(一)
前端·spring boot·微服务
zjw_rp1 小时前
Spring-AOP
java·后端·spring·spring-aop
Oneforlove_twoforjob2 小时前
【Java基础面试题033】Java泛型的作用是什么?
java·开发语言
TodoCoder2 小时前
【编程思想】CopyOnWrite是如何解决高并发场景中的读写瓶颈?
java·后端·面试
向宇it2 小时前
【从零开始入门unity游戏开发之——C#篇24】C#面向对象继承——万物之父(object)、装箱和拆箱、sealed 密封类
java·开发语言·unity·c#·游戏引擎