- 下面就看看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-gatewaycloud:nacos:discovery:server-addr: localhost:8848sentinel:transport:dashboard: localhost:8080gateway: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: 8401spring:application:name: MICRO-SERVICEcloud:nacos:discovery:server-addr: localhost:8848sentinel:transport:dashboard: localhost:8080port: 8719management: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-gatewaycloud:nacos:discovery:server-addr: localhost:8848sentinel:transport:dashboard: localhost:8080datasource:gw-flow:nacos:server-addr: localhost:8848dataId: ${spring.application.name}-gateway-flowgroupId: SENTINEL_GROUPrule-type: gw-flowgw-api-group:nacos:server-addr: localhost:8848dataId: ${spring.application.name}-gateway-apigroupId: SENTINEL_GROUPrule-type: gw-api-group
在Nacos配置中心中创建如下的配置

创建完成之后,重启网关,访问一下 接口
http://localhost:9527/test/flowLimit
访问完成之后,查看Sentinel-DashBoard,看流控规则是否生效
可以看到,从Nacos上的配置已经生效,如果不信,可以将Nacos上的配置中的count修改为一个奇怪的值,如下,修改为123,可以看到,流控规则已经生效
