Sentinel 系列教程,现已上传到 github 和 gitee 中:
GitHub:https://github.com/all4you/sentinel-tutorial
Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流环境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章节
下面我们来看一下如何快速使用集群流控功能。接入集群流控模块的步骤如下:
启动配置中心
要想使用集群流控功能,我们需要在应用端配置动态规则源,并通过 Sentinel 控制台实时进行推送。如下图所示:
本次我们通过 Nacos 作为我们的规则源的配置中心,首先我们先下载 Nacos 然后在本地启动一个 Nacos 的服务,我是通过源码编译的 Nacos 服务:
## 解压源码
unzip nacos-master.zip
cd nacos-master
## 编译可执行文件
mvn -Prelease-nacos clean install -U
## 进入编译好的可执行文件中启动服务
cd distribution/target/nacos-server-0.8.0/nacos/bin
sh startup.sh -m standalone
如上图所示,启动成功后,我们可以访问 Nacos 的控制台来进行控制了:
PS:控制台默认的用户名,密码都是:nacos
启动服务端
这里我们以独立模式来运行 token server,即单独启动某台机器作为 token server,其它的机器为 token client。
引入服务端依赖
首先我们引入集群流控服务端所需的相关依赖:
com.alibaba.csp
sentinel-transport-simple-http
1.4.1
com.alibaba.csp
sentinel-cluster-server-default
1.4.1
com.alibaba.csp
sentinel-datasource-nacos
1.4.1
org.apache.logging.log4j
log4j-slf4j-impl
2.9.1
服务端配置
引入了依赖之后,就需要创建一个 ClusterTokenServer 的实例了,然后启动该实例。不过要启动 ClusterTokenServer 还需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手动载入配置
手动载入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代码所示:
private static final int CLUSTER_SERVER_PORT = 11111;
private static final String APP_NAME = "appA";
// 加载namespace
ClusterServerConfigManager.loadServerNamespaceSet(Collections.singleton(APP_NAME));
// 加载ServerTransportConfig
ClusterServerConfigManager.loadGlobalTransportConfig(new ServerTransportConfig()
.setIdleSeconds(600)
.setPort(CLUSTER_SERVER_PORT));
载入了这些配置到 ClusterServerConfigManager 中之后,ClusterTokenServer 在启动的时候,就会去 ClusterServerConfigManager 获取启动所需的配置信息。
注册监听器(可选)
如果 ClusterTokenServer 启动之后想要更新一些设置,例如我想更换一个 namespace 或者我想更新 ServerTransportConfig,那该怎么办呢,这时我们可以通过为他们注册一个 SentinelProperty ,将配置信息保存到配置中心,当配置中心中的内容发生变更时,SentinelProperty 会通过 PropertyListener 来通知到 SentinelProperty 的注册方,此时就可以动态的更新配置信息了。
为 namespace 注册一个 SentinelProperty:
String namespaceSetDataId = "cluster-server-namespace-set";
// 初始化一个配置 namespace 的 Nacos 数据源
ReadableDataSource<String, Set<