服务熔断降级组建sentinel 整合apollo
服务端整合 apollo
第一步,我们先从官方git库把源码给拉下来,然后根据官方文档来进行改造
https://github.com/alibaba/Sentinel/wiki/Sentinel-控制台(集群流控管理)#规则配置
在dashboard的pom文件中引入apollo包的依赖 <dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-openapi</artifactId> <version>1.2.0</version> <!--<scope>test</scope>--> </dependency>
第二步,我们在java包下面的com.alibaba.csp.sentinel.dashboard.rule创建一个apollo包,然后把test目录下的
com.alibaba.csp.sentinel.dashboard.rule.apollo包里的4个类ApolloConfig,FlowRuleApolloProvider,FlowRuleApolloPublisher,ApolloConfigUtil拷贝到apollo包里。
1.ApolloConfig类修改
ApolloOpenApiClient client = ApolloOpenApiClient.newBuilder() .withPortalUrl("http://120.55.242.14:8070") .withToken("2f932aeca19b1300a7665b19e926c528b10160e3") .build();
其中http://120.55.242.14:8070 是你的apollo的portal服务地址
2f932aeca19b1300a7665b19e926c528b10160e3 是你登录portal后,系统里的开放平台授权管理的token值
2、FlowRuleApolloProvider类修改
String appId = "100079"; String flowDataId = ApolloConfigUtil.getFlowDataId(appName); OpenNamespaceDTO openNamespaceDTO = apolloOpenApiClient.getNamespace(appId, "PRO", "default", "TEST2.cc"); String rules = openNamespaceDTO .getItems() .stream() .filter(p -> p.getKey().equals(flowDataId)) .map(OpenItemDTO::getValue) .findFirst() .orElse("");
其中100079新建了一个appid,PRO是正式环境,TEST2.cc是key值。 后续dashboard改的参数,会push到appid=100079,apollo的pro环境的,TEST2.cc 为key下。
3、FlowRuleApolloPublisher类修改
AssertUtil.notEmpty(app, "app name cannot be empty"); if (rules == null) { return; } // Increase the configuration String appId = "100079"; String flowDataId = ApolloConfigUtil.getFlowDataId(app); //String flowDataId = "sentinel-rules"; OpenItemDTO openItemDTO = new OpenItemDTO(); openItemDTO.setKey(flowDataId); openItemDTO.setValue(converter.convert(rules)); openItemDTO.setComment("Program auto-join"); openItemDTO.setDataChangeCreatedBy("apollo"); apolloOpenApiClient.createOrUpdateItem(appId, "PRO", "default", "TEST2.cc", openItemDTO); // Release configuration NamespaceReleaseDTO namespaceReleaseDTO = new NamespaceReleaseDTO(); namespaceReleaseDTO.setEmergencyPublish(true); namespaceReleaseDTO.setReleaseComment("Modify or add configurations"); namespaceReleaseDTO.setReleasedBy("apollo"); namespaceReleaseDTO.setReleaseTitle("Modify or add configurations"); apolloOpenApiClient.publishNamespace(appId, "PRO", "default", "TEST2.cc", namespaceReleaseDTO); 类似的apollo的应用id,环境,key
第四步,修改resources/app/scripts/directives/sidebar/sidebar.html文件
将
<li ui-sref-active="active">
<a ui-sref="dashboard.flowV1({app: entry.app})">
<i class="glyphicon glyphicon-filter"></i> 流控规则
</a>
</li>
修改为
<li ui-sref-active="active">
<a ui-sref="dashboard.flow({app: entry.app})">
<i class="glyphicon glyphicon-filter"></i> 流控规则
</a>
</li>
第五步,修改com.alibaba.csp.sentinel.dashboard.controller.v2.FlowControllerV2,将刚才我们修改的provide和publisher注入
@Autowired
@Qualifier("flowRuleApolloProvider")
private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;
@Autowired
@Qualifier("flowRuleApolloPublisher")
private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;
到此完工了。
以上只是对于flow这种类型的规则进行了修改,其他类型的规则也需要对接apollo的话,也需要进行如上述扩展。
客户端整合 apollo
1. pom.xml增加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-alibaba-sentinel</artifactId> <version>0.9.0.RELEASE</version> </dependency> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-apollo</artifactId> <version>1.6.3</version> </dependency> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-annotation-aspectj</artifactId> <version>1.6.3</version> </dependency> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-cluster-server-default</artifactId> <version>1.6.0</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.61</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.0</version> </dependency> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-core</artifactId> <version>1.6.3</version> </dependency> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-transport-simple-http</artifactId> <version>1.6.0</version> </dependency> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-parameter-flow-control</artifactId> <version>1.6.0</version> </dependency> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-cluster-client-default</artifactId> <version>1.6.0</version> </dependency>
2、application.yml
project: name: demoTestF2apollo spring: cloud: sentinel: transport: dashboard: localhost:8080 app: id: 100079 apollo: meta: http://120.55.242.14:8080 server: port: 8072 其中http://120.55.242.14:8080为apollo的正式环境的meta地址,上述服务端的时候,绑定了正式环境。
3、新建3个类,这块可以百度下,改成自己的配置即可。
AopConfiguration,
ApolloConfiguration,
ApolloConstants Apollo中规则的Key
在资源中使用注解
@SentinelResource即可。