我想的文章对你有用,公众号:关注极客挖掘机,可以得到更多干货推送:)
上一篇文章详细介绍了Sentinel的使用姿势。 如果您还没有见过合作伙伴,请访问以下链接。
Sentinel :分布式系统的流量防御兵基础实战《Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵进阶实战》但仍然不能满足我们日常的生产需求,其中,非常重要的是限流规则的配置存在于当前应用的内存中,每当我们重新开始应用,我们就会Sentinel 下面,我们介绍Sentinel规则的持续化方式。
Sentinel提供了两种修改规则的方法。
修改loadRules (通过API直接修改(loadRules )数据源适应不同数据源的修改loadRules ) )方法只接受内存状态的规则对象,但规则通常是文件、数据库DataSource接口提供了连接到任何配置源的功能。 实现DataSource接口比使用API直接修改规则更可靠。
DataSource扩展的典型实现方法是:
拉式模式:客户端定期向规则管理中心(如RDBMS、文件和VCS )轮询拉式规则。 这样做很简单,缺点是不能马上取得改变; 推送模式:由规则中心统一推送,客户机通过注册监听程序,随时拦截变化,如使用Nacos、Zookeeper等配置中心。 这种方式有更好的实时性和一致性保证。 英特尔目前支持以下数据源扩展:
基于推挽的:文件,控制台(since1.7.0)基于推送的: Zookeeper,Redis,Nacos,Apollo在这里,Sentinel基于Nacos
1. Sentinel基于Nacos的动态规则进行实战
1.1子工程sentinel_nacos的创建
工程依赖于pom.xml。
代码列表: Alibaba/sentinel-spring cloud -高/sentinel _ nacos/POM.XML
从属关系
groupid org.spring框架. boot/groupid
artifactidspring -启动-启动- web /影响id
/从属关系
从属关系
groupIdcom.alibaba.csp/groupId
artifactidsentinel -数据源-国家/地区/地区id
/从属关系
1.2轮廓application.yml如下所示。
代码列表: Alibaba/Sentinel-spring cloud -高/Sentinel _ Nacos/SRC /主/资源/应用程序. yml
服务器:
端口: 10000
spring:
APP 3:
name : spring-cloud-sentinel-nacos
云:
美国航空:
发现:
服务器- addr :192.168.44.12933608848
英特尔:
传输:
dashboard :本地主机:8080
端口: 8720
数据源:
ds:
美国航空:
服务器- addr :192.168.44.12933608848
dataid : spring-cloud-sentinel-nacos
组:默认组
规则类型:流量
美国航空33608282 c 713-DA90-486 a-8438-2a5a 212 EF 44f
spring.cloud.sentinel.transport.dashboard:sentinel控制台的访问地址。 spring.cloud.sentinel.data source.ds.nacos .服务器- addr:nacos的访问地址。 spring.cloud.sentinel.data source.ds.nacos.dataid :将规则存储在nacos中的组id。 spring.cloud.sentinel.data source.ds.nacos.groupid :将规则存储在nacos中的dataId。 spring.cloud.sentinel.data source.ds.nacos.rule-type :定义存储的规则类型。 不能为空。 spring.cloud.sentinel .数据源
.ds.nacos.namespace:nacos中存储规则的namespace。由于版本迭代关系,本示例中的配置信息不一定适用于所有版本,可以通过分析DataSourcePropertiesConfiguration、NacosDataSourceProperties和AbstractDataSourceProperties这三个配置来得出具体配置内容,会更为准确。
例如,本示例中的配置来源于NacosDataSourceProperties和AbstractDataSourceProperties。
NacosDataSourceProperties源码如下:
public class NacosDataSourceProperties extends AbstractDataSourceProperties { private String serverAddr; @NotEmpty private String groupId = "DEFAULT_GROUP"; @NotEmpty private String dataId; private String endpoint; private String namespace; private String accessKey; private String secretKey; // 代码省略... }AbstractDataSourceProperties源码如下:
public class AbstractDataSourceProperties { @NotEmpty private String dataType = "json"; @NotNull private RuleType ruleType; private String converterClass; @JsonIgnore private final String factoryBeanName; @JsonIgnore private Environment env; }笔者这里仅配置一个不可为空并且没有默认值的ruleType,有关ruleType的取值可以查看com.alibaba.cloud.sentinel.datasource.RuleType,这是一个枚举类型。
1.3 创建一个接口测试类HelloController.java如下:
代码清单:Alibaba/sentinel-springcloud-high/sentinel_nacos/src/main/java/com/springcloud/sentinel_nacos/controller/HelloController.java
@RestController public class HelloController { @GetMapping("/hello") public String hello(HttpServletRequest request) { return "Hello, port is: " + request.getLocalPort(); } }
1.4 配置Nacos配置中心
配置内容如图:
注意其中配置的Data ID和Group要和程序中配置的保持一致。格式选择JSON,填入的内容如下:
[ { "resource": "/hello", "limitApp": "default", "grade": 1, "count": 1, "strategy": 0, "controlBehavior": 0, "clusterMode": false } ]可以看到上面配置规则是一个数组类型,数组中的每个对象是针对每一个保护资源的配置对象,每个对象中的属性解释如下:
resource:资源名,即限流规则的作用对象。limitApp:流控针对的调用来源,若为 default 则不区分调用来源。grade:限流阈值类型,QPS 或线程数模式,0代表根据并发数量来限流,1代表根据QPS来进行流量控制。count:限流阈值strategy:判断的根据是资源自身,还是根据其它关联资源 (refResource),还是根据链路入口controlBehavior:流控效果(直接拒绝 / 排队等待 / 慢启动模式)clusterMode:是否为集群模式1.5 测试
正常启动子工程,打开浏览器访问几次http://localhost:10000/hello ,速度快一些可以发现已经限流了,限流后页面显示如下:
Blocked by Sentinel (flow limiting)正面限流配置成功,这时我们打开Sentinel控制台,看一下流量规则限制,已经有一条数据了,是我们在Nacos中配置的数据,如图:
注意:
在Sentinel动态规则整合了Nacos以后,对于修改接口流量控制就有两个地方了,一个是Sentinel的控制台,还有一个是Nacos的控制台。
但是要谨记,在当前版本中,在Sentinel控制台中修改了规则,将不会同步至Nacos的配置中心,而在Nacos中修改了配置规则,则会通过在客户端的Listener来是同步Sentinel控制台。所以,在整合了Nacos做动态规则存储后需要注意两点:
Sentinel控制台中修改规则:仅存在于服务的内存中,不会修改Nacos中的配置值,重启后恢复原来的值。Nacos控制台中修改规则:服务的内存中规则会更新,Nacos中持久化规则也会更新,重启后依然保持。建议各位堵住最好在Nacos控制台做规则的修改操作,尽量避免直接在Sentinel控制台中直接做规则修改。
2. 示例代码
Github-示例代码:https://github.com/meteor1993/SpringCloudLearning/tree/master/Alibaba/sentinel-springcloud-high
Gitee-示例代码:https://gitee.com/inwsy/SpringCloudLearning/tree/master/Alibaba/sentinel-springcloud-high