项目git地址:https://gitee.com/lpengs/cloud-demo.git
前面我们学习sentinel熔断和降级时,如果服务器重启,那么配置的规则都会消失。这就很不友好。这里我们尝试把规则持久化到nacos中。
我们先看看没有把sentinel集成到nacos中是什么样子的。
我们先修改下service-order里面的yml配置如下:
server:
port: 8000
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/order_tbl?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: xxxx
password: yyyy
profiles:
active: dev
include: feign
application:
name: service-order
cloud:
nacos:
discovery:
namespace: ${spring.profiles.active:dev}
server-addr: 127.0.0.1:8848
config:
import-check:
enabled: false
namespace: ${spring.profiles.active:dev}
logging:
level:
com.atguigu.order.feign: debug
---
spring:
config:
import:
- nacos:common.properties?group=order
- nacos:database.properties?group=order
activate:
on-profile: dev
---
spring:
config:
import:
- nacos:common.properties?group=order
- nacos:database.properties?group=order
activate:
on-profile: test
---
spring:
config:
import:
- nacos:common.properties?group=order
- nacos:database.properties?group=order
activate:
on-profile: prod
mybatis-plus:
mapper-locations: classpath*:/mapper/**/*.xml
configuration:
map-underscore-to-camel-case: true # 驼峰映射(建议开启)
我们启动微服务。(在此之前先启动nacos和sentinel)
http://localhost:8848/nacos 用户名和密码都是nacos
http://localhost:8080/ 用户名和密码都是sentinel
页面输入 http://localhost:8000/readDb 回车
然后频繁刷新页面,可以看到每次都可以获取到数据:
然后我们在sentinel后台页面可以看到调用的这个接口信息(看不到就刷新下)
我们对这个接口进行下流控配置:
点击流控:
弹出的页面,选择QPS 单击阈值改为1。代表最多1次/秒的访问频率限制。点击新增
这样就生效了。
这时可以在流控规则里面看到这个规则
接下来我们刷新页面频繁的话,超过1QPS,就会报错。如下
说明被限流了。
但是当我们重启下微服务,再次频繁刷新时,就会发现没有报错,说明规则失效了。
这时候我们去后台sentinel看(先刷新下),流控规则已经消失了。
这是因为,流控规则是保存在内存中的,如果重启微服务,内存中的规则就消失了。这是个不可接受的痛点,哪能每次重启服务把规则重新配置一遍呢。所以把规则配置到nacos里面去。
我们首先,在services里面引入依赖,这样order微服务作为子项目也会自动引入这个依赖了:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<version>1.8.8</version>
</dependency>
记得右上角刷新下使依赖引入生效。
然后我们修改下yml配置如下:
spring:
cloud:
openfeign:
client:
config:
default:
logger-level: full
connect-timeout: 3000
read-timeout: 5000
service-product:
logger-level: full
connect-timeout: 3000
read-timeout: 5000
sentinel:
transport:
dashboard: localhost:8080
eager: true
web-context-unify: false
datasource:
flow:
nacos:
server-addr: 127.0.0.1:8848
data-id: ${spring.application.name}-flow-rules
group-id: SENTINEL_GROUP
rule-type: flow
data-type: json
namespace: ${spring.profiles.active:dev}
feign:
sentinel:
enabled: true
大家记得命名空间是区分服务和properties配置的范围,一定要一一对应,比如dev、prod、test,都要保持跟项目启动配置一致。
data-id是应用名字拼接上-flow-rules。
下面我们去nacos配置下这个data-id数据集:
如上创建配置,记得这是在dev下创建配置的,跟yml中的命名空间需要一致。
service-order-flow-rules 注意这里是应用的名字拼接的,根据自己的项目的实际名字来
SENTINEL_GROUP
order服务流控规则
[
{
"resource": "/readDb",
"limitApp": "default",
"grade": 1,
"count": 1,
"clusterMode": false
}
]
右下角发布,即可。
然后我们重启服务,刷新页面:
可以看到频繁刷新的话,被限流了。
下面重点看看,我们重启微服务,再次刷新操作,看看还生效吗
如上图所示,重启服务后,规则还是生效的,这样就做到了持久化。
授人以鱼不如授人以渔,更多流控规则配置,可以问问豆包小姐姐,或者deepseek
真的超级好用的ai工具。推荐大家多利用。