本章主要内容
在SpringCloud GateWay服务网关中集成Sentinel来实现服务的限流功能。
首先,我们谈一下什么是服务限流。
在如今互联网的大环境下,我们后端的接口调用频次(QPS/TPS)动辄上百万,甚至达到千万级别,这对于服务端的承受能力是一个巨大的考验。那么限流在这个问题中起到什么作用呢?其实就是对于流量进行有策略的管理和限制。 比如说在一个系统中,有订单查询服务,商品查询服务,积分查询等,如果一个系统能支持的QPS(每秒查询次数)是100,那么这100该如何如何分配就是限流功能所考虑的事情。
根据这些服务的重要性,我们可能会把商品查询服务的QPS设置的比较高,因为这类用户查询到商品是有购买意向的,而订单查询、积分查询啥的管他呢!那么在一段时间内用户访问量过大时,我们就能尽量保证有购买意向的用户正常使用系统。这就是限流的作用。
什么是Sentinel
Sentinel 由阿里巴巴研发,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
文档:https://github.com/alibaba/Sentinel/wiki/主页
源码:https://github.com/alibaba/Sentinel
其实文档还是非常全面的,我也就不做搬运工了,主要是有目的性地讲述一下与SpringCloud GateWay的集成以及初步使用吧!
和SpringCloud GateWay 集成
添加依赖
先在我们之前搭建上的网关工程的pom.xml 中添加sentinel的网关依赖包
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
</dependency>
The managed version is 1.6.3 The artifact is managed in com.alibaba.cloud:spring-cloud-alibaba-dependencies:2.1.0.RELEASE
由于我们已经引入了 spring-cloud-alibaba-dependencies ,所以在上面就不用特意添加版本号了,默认就使用了1.6.3,与整体的SpringCloud版本对应。
注入Sentinel配置
我们写一个 @Configuration 配置类(放在Boot的类路径同级或者子级),里面的代码主要作用是设置需要限流的API (根据路径),以及限流的规则
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.codec.ServerCodecConfigurer;
import