- 下面就看看Gateway 如何与Sentinel进行服务的统一流控
- 创建一个统一的父工程,管理Gateway项目以及微服务项目
- 创建Gateway Module
- 到这,gateway的配置结束,紧接着创建一个普通的微服务
- 至此,基础测试环境搭建完毕,下面进行流控的测试
- 如看到如下的情况,则证明,测试环境已经搭建完毕,下面可以进行网关的集群测试
- 至此,网关的集群流控,就已经配置结束,同一微服务的集群的流控已经生效
- http://localhost:9527/test/flowLimit">但是,进而发现一件事,当网关服务进行重启之后, 模拟宕机之后重启, 在此访问 http://localhost:9527/test/flowLimit
- 至此,Sentinel与Nacos的流控规则生效,与网关的整合也生效了
Spring Cloud Sentinel 与 Spring Cloud Gateway 整合,实现微服务的集群流控
下面就看看Gateway 如何与Sentinel进行服务的统一流控
创建一个统一的父工程,管理Gateway项目以及微服务项目
修改父工程的pom,创建统一的依赖管理
<!--统一管理jar包版本-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<junit.version>4.12</junit.version>
<log4j.version>1.2.17</log4j.version>
<lombok.version>1.16.18</lombok.version>
<mysql.version>8.0.19</mysql.version>
<druid.version>1.1.16</druid.version>
<spring.boot.version>2.2.2.RELEASE</spring.boot.version>
<spring.cloud.version>Hoxton.SR1</spring.cloud.version>
<spring.cloud.alibaba.version>2.1.0.RELEASE</spring.cloud.alibaba.version>
<mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
<knife4j.version>2.0.4</knife4j.version>
</properties>
<!--子模块继承后,提供作用:锁定版本+子module不用groupId和version-->
<dependencyManagement>
<dependencies>
<!--springboot 2.2.2-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--Spring cloud Hoxton.SR1-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--Spring cloud alibaba 2.1.0.RELEASE-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.github.xiaoymin/knife4j-micro-spring-boot-starter -->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-micro-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.boot.version}</version>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
<!--第三方maven私服-->
<repositories>
<repository>
<id>nexus-aliyun</id>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
创建Gateway Module
导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
修改application.yml
spring:
application:
# 应用名称
name: sentinel-gateway
cloud:
nacos:
discovery:
server-addr: localhost:8848
sentinel:
transport:
dashboard: localhost:8080
gateway:
discovery:
locator:
enabled: true # 开启从注册中心动态创建路由的功能,利用微服务名称j进行路由
routes:
- id: MICRO_SERVICE # 路由id,建议配合服务名
uri: lb://MICRO-SERVICE #匹配路由名
predicates:
- Path=/test/** # 断言,路径相匹配的进行路由
server:
port: 9527
# 目前无效
management:
endpoints:
web:
exposure:
include: "*"
# 配置日志级别,方别调试
logging:
level:
org.springframework.cloud.gateway: debug
到这,gateway的配置结束,紧接着创建一个普通的微服务
修改pom.xml依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
修改application.yml
server:
port: 8401
spring:
application:
name: MICRO-SERVICE
cloud:
nacos:
discovery:
server-addr: localhost:8848
sentinel:
transport:
dashboard: localhost:8080
port: 8719
management:
endpoints:
web:
exposure:
include: "*"
编写Controller,模拟业务请求
@RestController
@RequestMapping("/test")
public class FlowLimitController {
@GetMapping("/flowLimit")
public String flowLimitTest() {
return "flowLimitTest";
}
}
至此,基础测试环境搭建完毕,下面进行流控的测试
测试前提
- 启动Nacos服务注册中心
- 启动Sentinel-DashBoard
启动程序
- 启动Gateway
- 启动micro-service
- 访问 http://localhost:9527/test/flowLimit
- 查看Sentinel-DashBoard
如看到如下的情况,则证明,测试环境已经搭建完毕,下面可以进行网关的集群测试
点击流控,进行流控规则的配置
流控规则解释
如下图的配置中,代表,针对 MICRO-SERVICE这个微服务的请求,流控的类型为QPS,每10秒中,只能通过10个请求,多余的请求,会直接快速失败,抛出BlockException
配置完成之后,可以在流控规则中,看到配置的规则列表
配置完成之后,可以进行测试
详见以下的gif,可以看到,当在10秒中,超过10次请求,将会 返回 Blocked by Sentinel: ParamFlowException,进行流控
至此,网关的集群流控,就已经配置结束,同一微服务的集群的流控已经生效
但是,进而发现一件事,当网关服务进行重启之后, 模拟宕机之后重启, 在此访问 http://localhost:9527/test/flowLimit
此时,Sentinel-DashBoard 中 网关服务的流控规则已经没了,因为,Sentinel默认是内存存储,当服务宕机之后,内存中的东西,就已经丢失了
这个就十分头痛,难道每次都得重新配置嘛!!! ,答案是,当然不是,Sentinel提供了一个maven依赖,可以将Sentinel的配置,存储到Nacos配置中心中,当服务启动时
从Nacos配置中心拉去流控规则,进行流控,其依赖为
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
其通过此依赖,拉取规则的配置如下,修改application.yml
主要添加datasource那段配置,配置从nacos上拉取的文件名,所在组等信息
spring:
application:
# 应用名称
name: sentinel-gateway
cloud:
nacos:
discovery:
server-addr: localhost:8848
sentinel:
transport:
dashboard: localhost:8080
datasource:
gw-flow:
nacos:
server-addr: localhost:8848
dataId: ${spring.application.name}-gateway-flow
groupId: SENTINEL_GROUP
rule-type: gw-flow
gw-api-group:
nacos:
server-addr: localhost:8848
dataId: ${spring.application.name}-gateway-api
groupId: SENTINEL_GROUP
rule-type: gw-api-group
在Nacos配置中心中创建如下的配置
创建完成之后,重启网关,访问一下 接口
http://localhost:9527/test/flowLimit
访问完成之后,查看Sentinel-DashBoard,看流控规则是否生效
可以看到,从Nacos上的配置已经生效,如果不信,可以将Nacos上的配置中的count修改为一个奇怪的值,如下,修改为123,可以看到,流控规则已经生效