Skip to content

Commit bfba508

Browse files
authored
Merge pull request #18 from andrewshan/main
feat: 支持熔断插件与路由插件解耦合
2 parents be62010 + 1c49bf0 commit bfba508

File tree

15 files changed

+178
-33
lines changed

15 files changed

+178
-33
lines changed

README.md

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,38 +15,31 @@ dubbo-java-polaris 是dubbo框架的扩展,便于使用dubbo框架开发的应
1515

1616
实现dubbo服务往北极星上进行注册,以及服务调用时从北极星拉取服务实例的功能。相关插件:
1717

18-
- Apache Dubbo:com.tencent.polaris.dubbo.registry.PolarisRegistry
19-
- DubboX:com.tencent.polaris.dubbox.registry.PolarisRegistry
18+
- Apache Dubbo:dubbo-registry-polaris
19+
- DubboX:dubbox-registry-polaris
2020

2121
### 动态路由
2222

2323
实现按照请求头、方法等参数,对请求进行按版本、标签的调度。相关插件:
2424

25-
- Apache Dubbo:com.tencent.polaris.dubbo.router.PolarisRouter
26-
- DubboX:com.tencent.polaris.dubbox.router.PolarisRouter
25+
- Apache Dubbo:dubbo-router-polaris
26+
- DubboX:dubbox-router-polaris
2727

2828
### 访问限流
2929

3030
实现按照请求头、方法等参数,对流量进行限频。相关插件:
3131

32-
- Apache Dubbo:com.tencent.polaris.dubbo.ratelimit.RateLimitFilter
33-
- DubboX:com.tencent.polaris.dubbox.ratelimit.RateLimitFilter
32+
- Apache Dubbo:dubbo-ratelimit-polaris
33+
- DubboX:dubbox-ratelimit-polaris
3434

3535
### 节点熔断
3636

37-
实现按请求调用的回包统计(连续错误数、错误率等)指标,对故障节点进行隔离和熔断。
37+
实现按请求调用的回包统计(连续错误数、错误率等)指标,对故障节点进行隔离和熔断。相关插件:
3838

3939
节点级熔断所需要的指标是复用服务调用的回包,接入北极星就会默认开启。相关插件:
4040

41-
*** 上报回包统计的插件 ***
42-
43-
- Apache Dubbo:com.tencent.polaris.dubbo.report.ReportFilter
44-
- DubboX:com.tencent.polaris.dubbox.report.ReportFilter
45-
46-
*** 过滤熔断节点插件 ***
47-
48-
- Apache Dubbo:com.tencent.polaris.dubbo.router.PolarisRouter
49-
- DubboX:com.tencent.polaris.dubbox.router.PolarisRouter
41+
- Apache Dubbo:dubbo-circuitbreaker-polaris
42+
- DubboX:dubbox-circuitbreaker-polaris
5043

5144
## 使用指南
5245

common-polaris/src/main/java/com/tencent/polaris/common/registry/PolarisOperator.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,10 +176,11 @@ public void unwatchService(String service, ServiceListener serviceListener) {
176176
* @param service 服务的service
177177
* @return Polaris选择的Instance对象
178178
*/
179-
public Instance[] getAvailableInstances(String service) {
179+
public Instance[] getAvailableInstances(String service, boolean includeCircuitBreakInstances) {
180180
GetHealthyInstancesRequest request = new GetHealthyInstancesRequest();
181181
request.setNamespace(polarisConfig.getNamespace());
182182
request.setService(service);
183+
request.setIncludeCircuitBreakInstances(includeCircuitBreakInstances);
183184
InstancesResponse instances = consumerAPI.getHealthyInstances(request);
184185
return instances.getInstances();
185186
}

common-polaris/src/main/java/com/tencent/polaris/common/utils/ExtensionConsts.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public interface ExtensionConsts {
2323

2424
String PLUGIN_ROUTER_NAME = "polaris_router";
2525

26-
String ENV_METADATA_TRANSFER = "POLARIS_TRAFFIC_CONTENT_RAW_TRANSHEADERS";
26+
String PLUGIN_CIRCUITBREAKER_NAME = "polaris_circuitbreaker";
27+
2728

2829
}

dubbo/dubbo-examples/dubbo-circuitbreak-example/dubbo-circuitbreak-consumer/pom.xml

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,7 @@
5050

5151
<dependency>
5252
<groupId>com.tencent.polaris</groupId>
53-
<artifactId>dubbo-registry-polaris</artifactId>
54-
<version>${project.version}</version>
55-
</dependency>
56-
<dependency>
57-
<groupId>com.tencent.polaris</groupId>
58-
<artifactId>dubbo-router-polaris</artifactId>
53+
<artifactId>dubbo-circuitbreaker-polaris</artifactId>
5954
<version>${project.version}</version>
6055
</dependency>
6156
</dependencies>
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<artifactId>dubbo-plugins</artifactId>
7+
<groupId>com.tencent.polaris</groupId>
8+
<version>${revision}</version>
9+
<relativePath>../pom.xml</relativePath>
10+
</parent>
11+
<modelVersion>4.0.0</modelVersion>
12+
13+
<artifactId>dubbo-circuitbreaker-polaris</artifactId>
14+
15+
<dependencies>
16+
<dependency>
17+
<groupId>com.tencent.polaris</groupId>
18+
<artifactId>dubbo-registry-polaris</artifactId>
19+
<version>${project.version}</version>
20+
</dependency>
21+
<dependency>
22+
<groupId>org.apache.dubbo</groupId>
23+
<artifactId>dubbo</artifactId>
24+
<scope>provided</scope>
25+
</dependency>
26+
<dependency>
27+
<groupId>org.slf4j</groupId>
28+
<artifactId>slf4j-api</artifactId>
29+
<scope>provided</scope>
30+
</dependency>
31+
</dependencies>
32+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* Tencent is pleased to support the open source community by making Polaris available.
3+
*
4+
* Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
5+
*
6+
* Licensed under the BSD 3-Clause License (the "License");
7+
* you may not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* https://opensource.org/licenses/BSD-3-Clause
11+
*
12+
* Unless required by applicable law or agreed to in writing, software distributed
13+
* under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
14+
* CONDITIONS OF ANY KIND, either express or implied. See the License for the
15+
* specific language governing permissions and limitations under the License.
16+
*/
17+
18+
package com.tencent.polaris.dubbo.circuitbreaker;
19+
20+
import org.apache.dubbo.common.constants.CommonConstants;
21+
import org.apache.dubbo.common.extension.Activate;
22+
import org.apache.dubbo.rpc.Filter;
23+
import org.apache.dubbo.rpc.Invocation;
24+
import org.apache.dubbo.rpc.Invoker;
25+
import org.apache.dubbo.rpc.Result;
26+
import org.apache.dubbo.rpc.RpcException;
27+
28+
@Activate(group = CommonConstants.CONSUMER)
29+
public class CircuitBreakerFilter implements Filter {
30+
31+
@Override
32+
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
33+
return invoker.invoke(invocation);
34+
}
35+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
polaris_circuitbreaker=com.tencent.polaris.dubbo.circuitbreaker.CircuitBreakerFilter

dubbo/dubbo-plugins/dubbo-registry-polaris/src/main/java/com/tencent/polaris/dubbo/registry/PolarisRegistry.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import org.apache.dubbo.common.utils.ConcurrentHashSet;
4646
import org.apache.dubbo.registry.NotifyListener;
4747
import org.apache.dubbo.registry.support.FailbackRegistry;
48+
import org.apache.dubbo.rpc.Filter;
4849
import org.apache.dubbo.rpc.cluster.Constants;
4950
import org.apache.dubbo.rpc.cluster.RouterFactory;
5051
import org.slf4j.Logger;
@@ -64,16 +65,23 @@ public class PolarisRegistry extends FailbackRegistry {
6465

6566
private final PolarisOperator polarisOperator;
6667

68+
private final boolean hasCircuitBreaker;
69+
70+
private final boolean hasRouter;
71+
6772
public PolarisRegistry(URL url) {
6873
super(url);
6974
polarisOperator = new PolarisOperator(url.getHost(), url.getPort(), url.getParameters());
7075
PolarisOperators.INSTANCE.addPolarisOperator(polarisOperator);
76+
ExtensionLoader<RouterFactory> routerExtensionLoader = ExtensionLoader.getExtensionLoader(RouterFactory.class);
77+
hasRouter = routerExtensionLoader.hasExtension(ExtensionConsts.PLUGIN_ROUTER_NAME);
78+
ExtensionLoader<Filter> filterExtensionLoader = ExtensionLoader.getExtensionLoader(Filter.class);
79+
hasCircuitBreaker = filterExtensionLoader.hasExtension(ExtensionConsts.PLUGIN_CIRCUITBREAKER_NAME);
7180
}
7281

7382
private URL buildRouterURL(URL consumerUrl) {
74-
ExtensionLoader<RouterFactory> extensionLoader = ExtensionLoader.getExtensionLoader(RouterFactory.class);
7583
URL routerURL = null;
76-
if (extensionLoader.hasExtension(ExtensionConsts.PLUGIN_ROUTER_NAME)) {
84+
if (hasRouter) {
7785
URL registryURL = getUrl();
7886
routerURL = new URL(RegistryConstants.ROUTE_PROTOCOL, registryURL.getHost(), registryURL.getPort());
7987
routerURL = routerURL.setServiceInterface(CommonConstants.ANY_VALUE);
@@ -147,7 +155,7 @@ public void destroy() {
147155
@Override
148156
public void doSubscribe(URL url, NotifyListener listener) {
149157
String service = url.getServiceInterface();
150-
Instance[] instances = polarisOperator.getAvailableInstances(service);
158+
Instance[] instances = polarisOperator.getAvailableInstances(service, !hasCircuitBreaker);
151159
onInstances(url, listener, instances);
152160
LOGGER.info("[POLARIS] submit watch task for service {}", service);
153161
taskScheduler.submitWatchTask(new WatchTask(url, listener, service));
@@ -206,7 +214,7 @@ public FetchTask(URL url, NotifyListener listener) {
206214
public void run() {
207215
Instance[] instances;
208216
try {
209-
instances = polarisOperator.getAvailableInstances(service);
217+
instances = polarisOperator.getAvailableInstances(service, !hasCircuitBreaker);
210218
} catch (PolarisException e) {
211219
LOGGER.error("[POLARIS] fail to fetch instances for service {}: {}", service, e.toString());
212220
return;

dubbo/dubbo-plugins/pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
<module>dubbo-registry-polaris</module>
2121
<module>dubbo-router-polaris</module>
2222
<module>dubbo-ratelimit-polaris</module>
23+
<module>dubbo-circuitbreaker-polaris</module>
2324
</modules>
2425

2526
</project>
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<artifactId>dubbox-plugins</artifactId>
7+
<groupId>com.tencent.polaris</groupId>
8+
<version>${revision}</version>
9+
<relativePath>../pom.xml</relativePath>
10+
</parent>
11+
<modelVersion>4.0.0</modelVersion>
12+
13+
<artifactId>dubbox-circuitbreaker-polaris</artifactId>
14+
15+
<dependencies>
16+
<dependency>
17+
<groupId>com.tencent.polaris</groupId>
18+
<artifactId>dubbox-registry-polaris</artifactId>
19+
<version>${project.version}</version>
20+
</dependency>
21+
<dependency>
22+
<groupId>com.alibaba</groupId>
23+
<artifactId>dubbo</artifactId>
24+
<scope>provided</scope>
25+
</dependency>
26+
<dependency>
27+
<groupId>org.slf4j</groupId>
28+
<artifactId>slf4j-api</artifactId>
29+
<scope>provided</scope>
30+
</dependency>
31+
</dependencies>
32+
</project>

0 commit comments

Comments
 (0)