我正在参与掘金创作者训练营第6期,点击了解活动详情
在微服务项目中,网关一般用作服务的路由以及转发,同时也可以整合Sentinel做服务的限流降级、熔断等功能
环境:
- Nacos
- Gateway
- Sentinel
- SpringBoot
pom
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
</dependency>
yml
spring:
application:
name: gateway
cloud:
nacos:
discovery:
server-addr: localhost # nacos注册地址
config:
server-addr: localhost # 远程配置地址
sentinel:
transport:
dashboard: localhost:8080 # sentinel注册地址
# 直接建立心跳
eager: true
scg:
# 限流后的响应配置
fallback:
content-type: application/json
# 模式 response、redirect
mode: response
# 响应状态码
response-status: 440
# 响应信息
response-body: 限流中
gateway:
# spring cloud gateway 路由配置方式
discovery:
locator:
enabled: true # 表明gateway开启服务注册和发现的功能
lower-case-service-id: true # 将请求路径上的服务名配置为小写
route-id-prefix: order # 配置routeId的前缀,最终为 route-id-注册服务名
配置完成之后直接启动项目 在启动项目之前需要先启动Sentinel,可以直接去官网下载Sentinel的启动控制台,一个jar包 直接启动即可,默认的端口是8080,可以自行配置成与本地不冲突的端口。
规则配置
sentinel参数
- 资源名:服务名
- 阙值类型:每秒访问量QPS或者线程数
- 单机阙值:就是具体访问量
- 是否集群这个需要单独再去配置
如果想要更直观的去测试这个话,建议去下载一个jmeter,可以设置一定的访问量和线程数去测试限流,sentinel默认是懒加载需要先请求一次接口才能在控制台显示服务信息,不过也可以在配置里面关闭这个eager: true
如果只是在sentinel上面去配置的话,当Sentinel重启之后这些配置就会丢失,所以就有了下一步,把配置整合至nacos,实现动态读取和配置持久化。
#sentinel数据源配置(从哪里获取限流规则)
datasource: #整合nacos,下发配置
flow:
nacos:
server-addr: localhost:8848
namespace: test
dataId: gateway-flow-sentinel-test
groupId: test
data-type: json
rule-type: flow
username: nacos
password: nacos
#降级类型配置
degrade:
nacos:
server-addr: localhost:8848
namespace: test
dataId: gateway-degrade-sentinel-test
groupId: test
data-type: json
rule-type: degrade
username: nacos
password: nacos
把上述配置添加至nacos后需要给限流和降级单独建立一个配置文件,因为我定义的是json类型 所以我的配置文件建立的时候就需要是json的格式
配置完成之后重启服务,这时就会在sentinel控制台看到自己的配置已经读取到了,同时在 nacos上修改之后也会在sentinel上实时的去刷新。
题外话:其实在网关上面可以单独去配置限流,这个使用的是令牌桶限流,不过是针对具体的访问路径以及或者方法,依据网关的路由匹配针对每个服务路由时做限流,下次有机会在更