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(总之小一点),快速发送请求返回自定义服务流控降级信息。

相关推荐
李慕婉学姐6 小时前
【开题答辩过程】以《基于JAVA的校园即时配送系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·开发语言·数据库
奋进的芋圆7 小时前
Java 延时任务实现方案详解(适用于 Spring Boot 3)
java·spring boot·redis·rabbitmq
sxlishaobin8 小时前
设计模式之桥接模式
java·设计模式·桥接模式
model20058 小时前
alibaba linux3 系统盘网站迁移数据盘
java·服务器·前端
荒诞硬汉8 小时前
JavaBean相关补充
java·开发语言
提笔忘字的帝国8 小时前
【教程】macOS 如何完全卸载 Java 开发环境
java·开发语言·macos
2501_941882488 小时前
从灰度发布到流量切分的互联网工程语法控制与多语言实现实践思路随笔分享
java·开发语言
華勳全栈9 小时前
两天开发完成智能体平台
java·spring·go
alonewolf_999 小时前
Spring MVC重点功能底层源码深度解析
java·spring·mvc
沛沛老爹9 小时前
Java泛型擦除:原理、实践与应对策略
java·开发语言·人工智能·企业开发·发展趋势·技术原理