共计 2151 个字符,预计需要花费 6 分钟才能阅读完成。
改造背景
前面我们讲解了如何对接 Apollo 来持久化限流的规则,对接后可以直接通过 Apollo 的后台进行规则的修改,推送到各个客户端实时生效。
但还有一个问题就是 Sentinel 控制台没有对接 Apollo,Sentinel 控制台本来就可以修改限流的规则,目前存在的情况就是通过 Sentinel 控制台修改的配置无法更新到 Apollo 中,所以今天我们的主题是改造 Sentinel 控制台源码,对接 Apollo。
配置变更模式
最原始的模式如下图:
Dashboard 的推送规则方式是通过 API 将规则推送至客户端并直接更新到内存中,这种做法的好处是简单,无依赖;坏处是应用重启规则就会消失,仅用于简单测试,不能用于生产环境。
我们在生产环境中需要用 Push 模式来进行,对于 push 模式的数据源, 如远程配置中心(ZooKeeper, Nacos, Apollo 等等),推送的操作不应由 Sentinel 客户端进行,而应该经控制台统一进行管理,直接进行推送,数据源仅负责获取配置中心推送的配置并更新到本地。因此推送规则正确做法应该是 配置中心控制台 /Sentinel 控制台 → 配置中心 → Sentinel 数据源 → Sentinel,而不是经 Sentinel 数据源推送至配置中心。这样的流程就非常清晰了:
改造步骤
从 Sentinel 1.4.0 开始,我们抽取出了接口用于向远程配置中心推送规则以及拉取规则:
DynamicRuleProvider<T>: 拉取规则
DynamicRulePublisher<T>: 推送规则
我们只需要实现上面的两个规则即可实现我们想要的效果,官方对于 Nacos 和 Apollo 的推送和拉取规则已经有实现好了的代码,在 Dashboard 源码的 test 目录下,我们自己改造下就可以了。
首先我们需要把源代码拉到本地,导入开发工具中,找到下面的 Apollo 的代码:
这部分代码是在 test 包下,我们需要复制到 main 包下才行:
复制过去后会发现一个问题,所有 Apollo 相关的 import 都报错,需要改下 pom.xml 中的配置,把 scope 注释掉:
<!– for Apollo rule publisher sample –>
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-openapi</artifactId>
<version>1.2.0</version>
<!–<scope>test</scope>–>
</dependency>
ApolloConfig 中需要修改的有 PortalUrl 和 token:
@Bean
public ApolloOpenApiClient apolloOpenApiClient() {
ApolloOpenApiClient client = ApolloOpenApiClient.newBuilder()
.withPortalUrl(“http://localhost:10034”)
.withToken(“token”)
.build();
return client;
}
token 的生成需要去 Apollo 的 Portal 中进行生成
创建应用信息,生成 token,绑定 appid
FlowRuleApolloProvider 和 FlowRuleApolloPublisher 需要把 Apollo 的 appId,env,命名空间等改成你自己想用的才行。这边就不贴代码了。
改造完之后,我们需要让控制器使用这两个新的规则,修改 FlowControllerV2 的 @Qualifier 的值,注入对应的规则对象
@Autowired
@Qualifier(“flowRuleApolloProvider”)
private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;
@Autowired
@Qualifier(“flowRuleApolloPublisher”)
private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;
这样改完其实还没效果,因为页面上用的是 FlowControllerV1 的代码,你可以直接在访问 uri 后面加上 v2 来访问,但这不是很好,最好是改下页面的代码,让菜单直接跳转到新的页面去,找到下面的代码:
改成下面的样子:
<li ui-sref-active=”active”>
<a ui-sref=”dashboard.flow({app: entry.app})”>
<i class=”glyphicon glyphicon-filter”></i> 流控规则 </a>
</li>
默认用的是 dashboard.flowV1,这个代码可以在 app.js 中找到:
改完之后你就可以重新将 Dashboard 打包啦,这样在 Dashboard 中修改规则的时候就会直接修改 Apollo 中的配置,Apollo 再推送给客户端。
欢迎加入我的知识星球,一起交流技术,免费学习猿天地的课程(http://cxytiandi.com/course)
PS:目前星球中正在星主的带领下组队学习 Sentinel,等你哦!