3分钟彻底弄懂Sentinel集群限流探索( 二 )


缺点一:需要独立部署,会产生额外的资源(钱)和运维复杂度
缺点二:server默认是单机,需要自己实现高可用方案
缺点二很致命啊,官方的server实现默认就是单机的,单点问题大家懂的都懂,自己实现高可用,我真的是有点服了 。
这么说Sentinel这个集群限流就是简单的实现了一下,真正复杂的部分他都没管,你可以这么理解 。
run起来那基本原理大概了解之后,还是要真正跑起来看看效果的,毕竟开头我就说了,网上这方面真的是感觉啥也搜不到,下面以嵌入式集群的方式举例 。
无论集群限流还是单机限流的方式,官方都支持写死配置和动态数据源的配置方式,写的话下面的代码中也都有,被我注释掉了,至于动态数据源的配置,会基于Apollo来实现 。
理解一下动态数据源的配置方式,基于这个我们可以实现限流规则的动态刷新,还有重点的一点可以做到基于修改配置方式的半自动故障转移 。
动态数据源支持推和拉两种方式,比如文件系统和Eureka就是拉取的方式,定时读取文件内容的变更,Eureka则是建立HTTP连接,定时获取元数据的变更 。
推送的方式主要是基于事件监听机制,比如Apollo和Nacos,redis官方则是基于Pub/Sub来实现,默认的实现方式是基于Lettuce,如果想用其他的客户端要自己实现 。

3分钟彻底弄懂Sentinel集群限流探索

文章插图
 
限流-集群工作模式
首先,该引入的包还是引入 。
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-annotation-aspectj</artifactId><version>1.8.4</version></dependency><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-transport-simple-http</artifactId><version>1.8.4</version></dependency><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-cluster-client-default</artifactId><version>1.8.4</version></dependency><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-cluster-server-default</artifactId><version>1.8.4</version></dependency><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-apollo</artifactId><version>1.8.4</version></dependency>实现SPI,在resources目录的META-INF/services下新增名为com.alibaba.csp.sentinel.init.InitFunc的文件,内容写上我们自己实现的类名,比如我的com.irving.demo.init.DemoClusterInitFunc 。
3分钟彻底弄懂Sentinel集群限流探索

文章插图
 
实现InitFunc接口,重写init方法,代码直接贴出来,这里整体依赖的是Apollo的配置方式,注释的部分是我在测试的时候写死代码的配置方式,也是可以用的 。
public class DemoClusterInitFunc implements InitFunc {private final String namespace = "Application";private final String ruleKey = "demo_sentinel";private final String ruleServerKey = "demo_cluster";private final String defaultRuleValue = https://www.isolves.com/it/cxkf/bk/2022-05-10/"[]";@Overridepublic void init() throws Exception {// 初始化 限流规则initDynamicRuleProperty();//初始化 客户端配置initClientConfigProperty();// 初始化 服务端配置信息initClientServerAssignProperty();registerClusterRuleSupplier();// token-server的传输规则initServerTransportConfigProperty();// 初始化 客户端和服务端状态initStateProperty();}/*** 限流规则和热点限流规则配置*/private void initDynamicRuleProperty() {ReadableDataSource> ruleSource = new ApolloDataSource<>(namespace, ruleKey,defaultRuleValue, source -> JSON.parseobject(source, new TypeReference>() {}));FlowRuleManager.register2Property(ruleSource.getProperty());ReadableDataSource> paramRuleSource = new ApolloDataSource<>(namespace, ruleKey,defaultRuleValue, source -> JSON.parseObject(source, new TypeReference>() {}));ParamFlowRuleManager.register2Property(paramRuleSource.getProperty());}/*** 客户端配置,注释的部分是通过Apollo配置,只有一个配置我就省略了*/private void initClientConfigProperty() {//ReadableDataSource clientConfigDs = new ApolloDataSource<>(namespace, ruleKey,//defaultRuleValue, source -> JSON.parseObject(source, new TypeReference() {//}));//ClusterClientConfigManager.registerClientConfigProperty(clientConfigDs.getProperty());ClusterClientConfig clientConfig = new ClusterClientConfig();clientConfig.setRequestTimeout(1000);ClusterClientConfigManager.applyNewConfig(clientConfig);}/*** client->server 传输配置,设置端口号,注释的部分是写死的配置方式*/private void initServerTransportConfigProperty() {ReadableDataSource


推荐阅读