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

相关推荐
阿伟*rui1 小时前
配置管理,雪崩问题分析,sentinel的使用
java·spring boot·sentinel
XiaoLeisj3 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
paopaokaka_luck3 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
dayouziei3 小时前
java的类加载机制的学习
java·学习
Yaml45 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~5 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616885 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
aloha_7896 小时前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot
记录成长java6 小时前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet
睡觉谁叫~~~6 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust