服务端整合 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即可。