前言
我不知道你有没有看上一篇sentinel-apollo拉模式,相信看过的同学对于那么复杂结构的数据很头疼,起码我们运维小哥明确表态了不会用的,那么有没有通过在sentinel-dashboard直接修改然后同步到apollo上呢,也就是推模式.我也是经过了一番痛苦折腾后才知道有.改起来也不是很复杂.
相关文章
参考文档
sentinel-dashboard 修改步骤
修改好的代码地址: https://github.com/zhaoyunxing92/sentinel-dashboard-apollo
如果你对需改代码不感兴趣可以直接跳过到整合部分,这个代码你需要编译一份可以运行就可以了
如果你看过sentinel的源码就会发现其实人家已经实现了一小部分推模式的代码
前端
如果你很熟悉mvc并且做过mvc模式的开发那么看前端angular代码我敢保证你仅仅需要半个小时就能掌握它甚至更少时间
app.js文件 resources/app/scripts/app.js
.state('dashboard.flow', { templateUrl: 'app/views/flow_v2.html', url: '/v2/flow/:app', // 这对应的地址栏的url controller: 'FlowControllerV2', // 这个说明用的那个控制器,你只需要找到对应的文件就可以 resolve: { loadMyFiles: ['$ocLazyLoad', function ($ocLazyLoad) { return $ocLazyLoad.load({ name: 'sentinelDashboardApp', files: [ 'app/scripts/controllers/flow_v2.js' // 打开这个文件 ] }); }] } })
flow_v2.js resources/app/scripts/controllers/flow_v2.js
这个时候发现注入了一个 FlowServiceV2服务,可以打开FlowServiceV2服务的文件了
app.controller('FlowControllerV2', ['$scope', '$stateParams', 'FlowServiceV2', 'ngDialog', 'MachineService', function ($scope, $stateParams, FlowService, ngDialog, MachineService) { $scope.app = $stateParams.app; $scope.rulesPageConfig = { pageSize: 10, currentPageIndex: 1, totalPage: 1, totalCount: 0, };
FlowServiceV2 resources/app/scripts/services/flow_service_v2.js
打开后你会发现里面都是跟后端通信的逻辑是不是很简单.app.js > controller > service 三步骤
app.service('FlowServiceV2', ['$http', function ($http) { this.queryMachineRules = function (app, ip, port) { var param = { app: app, ip: ip, port: port }; return $http({ url: '/v2/flow/rules', params: param, method: 'GET' }); };
后端
后端部分由于我修改的太多不可能都写出来,我就总结下我在修改的时候遇到的问题吧
数据push到了apollo,sentinel-dashboard界面也能看到数据,但是配置的规则就是不生效
这个问题是由于我们给apollo注入了不必要的属性,可以参考issues
伪代码 @JSONField(serialize = false)后数据就不会到apollo了
public class FlowRuleEntity implements RuleEntity { @JSONField(serialize = false) private Long id; @JSONField(serialize = false) private String app; @JSONField(serialize = false) private String ip; @JSONField(serialize = false) private Integer port;}
整合流程
pom.xml 如果看过拉模式可以跳过
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>0.9.0.RELEASE</version> </dependency> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-apollo</artifactId> <version>1.6.0</version> </dependency>
application.yml
注意里面的key不用随意修改,除非你很清楚你在干什么
spring: application: name: spring-boot-sentinel-apollo cloud: sentinel: transport: port: 8719 # 向sentinel-dashboard传输数据的端口 默认:8719 dashboard: localhost:8100 # sentinel-dashboard log: dir: ./logs # 默认值${home}/logs/csp/ switch-pid: true # 日志带上线程id datasource: flow: # 流控规则 apollo: namespaceName: application flowRulesKey: sentinel.flowRules rule-type: flow #flow,degrade,authority,system, param-flow degrade: # 熔断降级规则 apollo: namespaceName: application flowRulesKey: sentinel.degradeRules rule-type: degrade authority: # 授权规则 未验证,官方不推荐 apollo: namespaceName: application flowRulesKey: sentinel.authorityRules rule-type: authority system: # 系统规则 apollo: namespaceName: application flowRulesKey: sentinel.systemRules rule-type: system param-flow: # 热点规则 apollo: namespaceName: application flowRulesKey: sentinel.paramFlowRules rule-type: param-flowapp: id: ${spring.application.name}apollo: meta: http://127.0.0.1:8080 cacheDir: ./apolloconfig # 缓存文件位置
java
@SpringBootApplication@EnableApolloConfig // 开启apollopublic class SpringSentinelApolloServer { public static void main(String[] args) { SpringApplication.run(SpringSentinelApolloServer.class, args); }}
jvm参数配置
-Denv=DEV
apollo申请token

sentinel-dashboard 设置token
java -jar sentinel-dashboard.jar --apollo.portal.token= apollo申请的token
测试接口
http://localhost:7853/sentinel/hello
apollo效果图

最后
如果你想了解更多的文章可以微信搜索zhaoyx92
,或者扫码关注,7*24的技术支持

文章同步
原著是一个有趣的人,若有侵权,请通知删除
还没有人抢沙发呢~