Skip to content

Commit e69df8c

Browse files
feat:upgrade api circuit-break. (#544)
1 parent b5ef058 commit e69df8c

File tree

92 files changed

+5146
-2107
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

92 files changed

+5146
-2107
lines changed

polaris-assembly/polaris-assembly-factory/pom.xml

+10-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<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">
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">
55
<parent>
66
<artifactId>polaris-assembly</artifactId>
77
<groupId>com.tencent.polaris</groupId>
@@ -72,6 +72,14 @@
7272
<artifactId>trace-otel</artifactId>
7373
<version>${project.version}</version>
7474
</dependency>
75+
76+
<!--事件上报插件-->
77+
<dependency>
78+
<groupId>com.tencent.polaris</groupId>
79+
<artifactId>event-logger</artifactId>
80+
<version>${project.version}</version>
81+
</dependency>
82+
7583
<!--测试依赖插件-->
7684
<dependency>
7785
<groupId>com.tencent.polaris</groupId>

polaris-circuitbreaker/polaris-circuitbreaker-api/src/main/java/com/tencent/polaris/circuitbreak/api/pojo/FunctionalDecoratorRequest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121

2222
public class FunctionalDecoratorRequest extends InvokeContext.RequestContext {
2323

24-
public FunctionalDecoratorRequest(ServiceKey service, String method) {
25-
super(service, method);
24+
public FunctionalDecoratorRequest(ServiceKey service, String protocol, String method, String path) {
25+
super(service, protocol, method, path);
2626
}
2727

2828
@Override

polaris-circuitbreaker/polaris-circuitbreaker-api/src/main/java/com/tencent/polaris/circuitbreak/api/pojo/InvokeContext.java

+15-1
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,19 @@ public static class RequestContext {
3232

3333
private final ServiceKey service;
3434

35+
private final String protocol;
36+
3537
private final String method;
3638

39+
private final String path;
40+
3741
private ResultToErrorCode resultToErrorCode;
3842

39-
public RequestContext(ServiceKey service, String method){
43+
public RequestContext(ServiceKey service, String protocol, String method, String path) {
4044
this.service = service;
45+
this.protocol = protocol;
4146
this.method = method;
47+
this.path = path;
4248
}
4349

4450
public ServiceKey getSourceService() {
@@ -53,10 +59,18 @@ public ServiceKey getService() {
5359
return service;
5460
}
5561

62+
public String getProtocol() {
63+
return protocol;
64+
}
65+
5666
public String getMethod() {
5767
return method;
5868
}
5969

70+
public String getPath() {
71+
return path;
72+
}
73+
6074
public ResultToErrorCode getResultToErrorCode() {
6175
return resultToErrorCode;
6276
}

polaris-circuitbreaker/polaris-circuitbreaker-client/src/main/java/com/tencent/polaris/circuitbreak/client/api/DefaultInvokeHandler.java

+71-71
Original file line numberDiff line numberDiff line change
@@ -32,83 +32,83 @@
3232

3333
public class DefaultInvokeHandler implements InvokeHandler {
3434

35-
private final CircuitBreakAPI circuitBreakAPI;
35+
private final CircuitBreakAPI circuitBreakAPI;
3636

37-
private final InvokeContext.RequestContext requestContext;
37+
private final InvokeContext.RequestContext requestContext;
3838

39-
public DefaultInvokeHandler(InvokeContext.RequestContext requestContext, CircuitBreakAPI circuitBreakAPI) {
40-
this.requestContext = requestContext;
41-
this.circuitBreakAPI = circuitBreakAPI;
42-
}
39+
public DefaultInvokeHandler(InvokeContext.RequestContext requestContext, CircuitBreakAPI circuitBreakAPI) {
40+
this.requestContext = requestContext;
41+
this.circuitBreakAPI = circuitBreakAPI;
42+
}
4343

44-
@Override
45-
public void acquirePermission() {
46-
CheckResult check = commonCheck(requestContext);
47-
if (check != null){
48-
throw new CallAbortedException(check.getRuleName(), check.getFallbackInfo());
49-
}
50-
}
44+
@Override
45+
public void acquirePermission() {
46+
CheckResult check = commonCheck(requestContext);
47+
if (check != null) {
48+
throw new CallAbortedException(check.getRuleName(), check.getFallbackInfo());
49+
}
50+
}
5151

52-
@Override
53-
public void onSuccess(InvokeContext.ResponseContext responseContext) {
54-
long delay = responseContext.getDurationUnit().toMillis(responseContext.getDuration());
55-
ResultToErrorCode resultToErrorCode = requestContext.getResultToErrorCode();
56-
int code = 0;
57-
RetStatus retStatus = RetStatus.RetUnknown;
58-
if (null != resultToErrorCode) {
59-
code = resultToErrorCode.onSuccess(responseContext.getResult());
60-
}
61-
commonReport(requestContext, delay, code, retStatus);
62-
}
52+
@Override
53+
public void onSuccess(InvokeContext.ResponseContext responseContext) {
54+
long delay = responseContext.getDurationUnit().toMillis(responseContext.getDuration());
55+
ResultToErrorCode resultToErrorCode = requestContext.getResultToErrorCode();
56+
int code = 0;
57+
RetStatus retStatus = RetStatus.RetUnknown;
58+
if (null != resultToErrorCode) {
59+
code = resultToErrorCode.onSuccess(responseContext.getResult());
60+
}
61+
commonReport(requestContext, delay, code, retStatus);
62+
}
6363

64-
@Override
65-
public void onError(InvokeContext.ResponseContext responseContext) {
66-
long delay = responseContext.getDurationUnit().toMillis(responseContext.getDuration());
67-
ResultToErrorCode resultToErrorCode = requestContext.getResultToErrorCode();
68-
int code = -1;
69-
RetStatus retStatus = RetStatus.RetUnknown;
70-
if (null != resultToErrorCode) {
71-
code = resultToErrorCode.onError(responseContext.getError());
72-
}
73-
if (responseContext.getError() instanceof CallAbortedException) {
74-
retStatus = RetStatus.RetReject;
75-
}
76-
commonReport(requestContext, delay, code, retStatus);
77-
}
64+
@Override
65+
public void onError(InvokeContext.ResponseContext responseContext) {
66+
long delay = responseContext.getDurationUnit().toMillis(responseContext.getDuration());
67+
ResultToErrorCode resultToErrorCode = requestContext.getResultToErrorCode();
68+
int code = -1;
69+
RetStatus retStatus = RetStatus.RetUnknown;
70+
if (null != resultToErrorCode) {
71+
code = resultToErrorCode.onError(responseContext.getError());
72+
}
73+
if (responseContext.getError() instanceof CallAbortedException) {
74+
retStatus = RetStatus.RetReject;
75+
}
76+
commonReport(requestContext, delay, code, retStatus);
77+
}
7878

79-
private CheckResult commonCheck(InvokeContext.RequestContext requestContext) {
80-
// check service
81-
Resource svcResource = new ServiceResource(requestContext.getService(),
82-
requestContext.getSourceService());
83-
CheckResult check = circuitBreakAPI.check(svcResource);
84-
if (!check.isPass()) {
85-
return check;
86-
}
87-
// check method
88-
if (StringUtils.isNotBlank(requestContext.getMethod())) {
89-
Resource methodResource = new MethodResource(requestContext.getService(),
90-
requestContext.getMethod(), requestContext.getSourceService());
91-
check = circuitBreakAPI.check(methodResource);
92-
if (!check.isPass()) {
93-
return check;
94-
}
95-
}
96-
return null;
97-
}
79+
private CheckResult commonCheck(InvokeContext.RequestContext requestContext) {
80+
// check service
81+
Resource svcResource = new ServiceResource(requestContext.getService(),
82+
requestContext.getSourceService());
83+
CheckResult check = circuitBreakAPI.check(svcResource);
84+
if (!check.isPass()) {
85+
return check;
86+
}
87+
// check method
88+
if (StringUtils.isNotBlank(requestContext.getPath())) {
89+
Resource methodResource = new MethodResource(requestContext.getService(), requestContext.getProtocol(),
90+
requestContext.getMethod(), requestContext.getPath(), requestContext.getSourceService());
91+
check = circuitBreakAPI.check(methodResource);
92+
if (!check.isPass()) {
93+
return check;
94+
}
95+
}
96+
return null;
97+
}
9898

99-
private void commonReport(InvokeContext.RequestContext requestContext, long delayMills, int code, RetStatus retStatus) {
100-
// report service
101-
Resource svcResource = new ServiceResource(requestContext.getService(),
102-
requestContext.getSourceService());
103-
ResourceStat resourceStat = new ResourceStat(svcResource, code, delayMills, retStatus);
104-
circuitBreakAPI.report(resourceStat);
105-
// report method
106-
if (StringUtils.isNotBlank(requestContext.getMethod())) {
107-
Resource methodResource = new MethodResource(requestContext.getService(),
108-
requestContext.getMethod(), requestContext.getSourceService());
109-
resourceStat = new ResourceStat(methodResource, code, delayMills, retStatus);
110-
circuitBreakAPI.report(resourceStat);
111-
}
112-
}
99+
private void commonReport(InvokeContext.RequestContext requestContext, long delayMills, int code, RetStatus retStatus) {
100+
// report service
101+
Resource svcResource = new ServiceResource(requestContext.getService(),
102+
requestContext.getSourceService());
103+
ResourceStat resourceStat = new ResourceStat(svcResource, code, delayMills, retStatus);
104+
circuitBreakAPI.report(resourceStat);
105+
// report method
106+
if (StringUtils.isNotBlank(requestContext.getPath())) {
107+
Resource methodResource = new MethodResource(requestContext.getService(), requestContext.getProtocol(),
108+
requestContext.getMethod(), requestContext.getPath(), requestContext.getSourceService());
109+
resourceStat = new ResourceStat(methodResource, code, delayMills, retStatus);
110+
circuitBreakAPI.report(resourceStat);
111+
}
112+
}
113113

114114
}

polaris-circuitbreaker/polaris-circuitbreaker-factory/pom.xml

+9-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3-
xmlns="http://maven.apache.org/POM/4.0.0"
4-
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3+
xmlns="http://maven.apache.org/POM/4.0.0"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
55
<parent>
66
<artifactId>polaris-circuitbreaker</artifactId>
77
<groupId>com.tencent.polaris</groupId>
@@ -95,6 +95,13 @@
9595
<version>${project.version}</version>
9696
</dependency>
9797

98+
<!--依赖事件上报插件-->
99+
<dependency>
100+
<groupId>com.tencent.polaris</groupId>
101+
<artifactId>event-logger</artifactId>
102+
<version>${project.version}</version>
103+
</dependency>
104+
98105
<!--健康检查插件-->
99106
<dependency>
100107
<groupId>com.tencent.polaris</groupId>

polaris-circuitbreaker/polaris-circuitbreaker-factory/src/test/java/com/tencent/polaris/circuitbreaker/factory/test/CircuitBreakerMultiTest.java

+7-4
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,11 @@ public void testMultipleUrlsNoRule() {
100100
configurationImpl.getConsumer().getCircuitBreaker().setCountersExpireInterval(5000);
101101
try (CircuitBreakAPI circuitBreakAPI = CircuitBreakAPIFactory.createCircuitBreakAPIByConfig(configurationImpl)) {
102102
for (int i = 0; i < 50; i++) {
103+
if (i == 1) {
104+
Utils.sleepUninterrupted(5 * 1000);
105+
}
103106
FunctionalDecoratorRequest makeDecoratorRequest = new FunctionalDecoratorRequest(
104-
new ServiceKey(NAMESPACE_TEST, SERVICE_CIRCUIT_BREAKER), "/test/" + i);
107+
new ServiceKey(NAMESPACE_TEST, SERVICE_CIRCUIT_BREAKER), "", "", "/test/" + i);
105108
FunctionalDecorator decorator = circuitBreakAPI.makeFunctionalDecorator(makeDecoratorRequest);
106109
int finalI = i;
107110
Consumer<Integer> integerConsumer = decorator.decorateConsumer(num -> {
@@ -135,7 +138,7 @@ public void testMultipleUrlsMethodRule() {
135138
Utils.sleepUninterrupted(5 * 1000);
136139
}
137140
FunctionalDecoratorRequest makeDecoratorRequest = new FunctionalDecoratorRequest(
138-
matchMethodService, "/test1/path/" + i);
141+
matchMethodService, "", "", "/test1/path/" + i);
139142
FunctionalDecorator decorator = circuitBreakAPI.makeFunctionalDecorator(makeDecoratorRequest);
140143
int finalI = i;
141144
Consumer<Integer> integerConsumer = decorator.decorateConsumer(num -> {
@@ -182,7 +185,7 @@ public void testCircuitBreakerRuleChanged() throws IOException {
182185
method = "/test1/path/" + i;
183186
}
184187
FunctionalDecoratorRequest makeDecoratorRequest = new FunctionalDecoratorRequest(
185-
matchMethodDetectService, method);
188+
matchMethodDetectService, "", "", method);
186189
FunctionalDecorator decorator = circuitBreakAPI.makeFunctionalDecorator(makeDecoratorRequest);
187190
int finalI = i;
188191
Consumer<Integer> integerConsumer = decorator.decorateConsumer(num -> {
@@ -214,7 +217,7 @@ public void testCircuitBreakerRuleChanged() throws IOException {
214217
for (int i = 0; i < 10; i++) {
215218
String method = "/test1/path/" + i;
216219
FunctionalDecoratorRequest makeDecoratorRequest = new FunctionalDecoratorRequest(
217-
matchMethodDetectService, method);
220+
matchMethodDetectService, "", "", method);
218221
FunctionalDecorator decorator = circuitBreakAPI.makeFunctionalDecorator(makeDecoratorRequest);
219222
int finalI = i;
220223
Consumer<Integer> integerConsumer = decorator.decorateConsumer(num -> {

polaris-circuitbreaker/polaris-circuitbreaker-factory/src/test/java/com/tencent/polaris/circuitbreaker/factory/test/CircuitBreakerTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ public void testFunctionalDecorator() {
269269
Configuration configuration = TestUtils.configWithEnvAddress();
270270
try (CircuitBreakAPI circuitBreakAPI = CircuitBreakAPIFactory.createCircuitBreakAPIByConfig(configuration)) {
271271
FunctionalDecoratorRequest makeDecoratorRequest = new FunctionalDecoratorRequest(
272-
new ServiceKey(NAMESPACE_TEST, SERVICE_CIRCUIT_BREAKER), "'");
272+
new ServiceKey(NAMESPACE_TEST, SERVICE_CIRCUIT_BREAKER), "", "", "");
273273
FunctionalDecorator decorator = circuitBreakAPI.makeFunctionalDecorator(makeDecoratorRequest);
274274
Consumer<Integer> integerConsumer = decorator.decorateConsumer(num -> {
275275
if (num % 2 == 0) {

polaris-circuitbreaker/polaris-circuitbreaker-factory/src/test/java/com/tencent/polaris/circuitbreaker/factory/test/FaultDetectorTest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ public void testFaultDetectRuleChanged() throws IOException {
9696
method = "/test1/path/" + i;
9797
}
9898
FunctionalDecoratorRequest makeDecoratorRequest = new FunctionalDecoratorRequest(
99-
matchMethodDetectService, method);
99+
matchMethodDetectService, "*", "*", method);
100100
FunctionalDecorator decorator = circuitBreakAPI.makeFunctionalDecorator(makeDecoratorRequest);
101101
int finalI = i;
102102
Consumer<Integer> integerConsumer = decorator.decorateConsumer(num -> {
@@ -132,7 +132,7 @@ public void testFaultDetectRuleChanged() throws IOException {
132132
method = "/test1/path/" + i;
133133
}
134134
FunctionalDecoratorRequest makeDecoratorRequest = new FunctionalDecoratorRequest(
135-
matchMethodDetectService, method);
135+
matchMethodDetectService, "", "", method);
136136
FunctionalDecorator decorator = circuitBreakAPI.makeFunctionalDecorator(makeDecoratorRequest);
137137
int finalI = i;
138138
Consumer<Integer> integerConsumer = decorator.decorateConsumer(num -> {

polaris-common/polaris-client/src/main/java/com/tencent/polaris/client/flow/BaseFlow.java

+23
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import com.tencent.polaris.api.plugin.compose.DefaultRouterChainGroup;
2828
import com.tencent.polaris.api.plugin.compose.Extensions;
2929
import com.tencent.polaris.api.plugin.compose.RouterChainGroup;
30+
import com.tencent.polaris.api.plugin.event.EventReporter;
31+
import com.tencent.polaris.api.plugin.event.FlowEvent;
3032
import com.tencent.polaris.api.plugin.loadbalance.LoadBalancer;
3133
import com.tencent.polaris.api.plugin.registry.LocalRegistry;
3234
import com.tencent.polaris.api.plugin.registry.ResourceFilter;
@@ -322,4 +324,25 @@ public static void buildFlowControlParam(RequestBaseEntity entity, Configuration
322324
controlParam.setRetryIntervalMs(config.getGlobal().getAPI().getRetryInterval());
323325
}
324326

327+
/**
328+
* 上报流程事件
329+
*
330+
* @param extensions 插件上下文
331+
* @param flowEvent 流程事件
332+
*/
333+
public static void reportFlowEvent(Extensions extensions, FlowEvent flowEvent) {
334+
List<EventReporter> eventReporterList = extensions.getEventReporterList();
335+
if (LOG.isDebugEnabled()) {
336+
LOG.debug("Reporting flow event: {}", flowEvent);
337+
}
338+
for (EventReporter eventReporter : eventReporterList) {
339+
try {
340+
if (!eventReporter.reportEvent(flowEvent)) {
341+
LOG.warn("Report event by {} failed. Flow event detail: {}", eventReporter.getName(), flowEvent);
342+
}
343+
} catch (Throwable throwable) {
344+
LOG.warn("Report event by {} failed. Flow event detail: {}", eventReporter.getName(), flowEvent, throwable);
345+
}
346+
}
347+
}
325348
}

polaris-common/polaris-config-default/src/main/resources/conf/default-config.yml

+7
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,13 @@ global:
7979
enable: false
8080
#描述: 调用链实现
8181
reporter: otel
82+
# 事件上报相关的配置
83+
eventReporter:
84+
#描述: 是否启动事件上报
85+
enable: true
86+
#描述: 事件上报插件名列表
87+
reporters:
88+
- logger
8289
#描述: 监控及日志数据上报相关配置
8390
statReporter:
8491
#描述: 是否启用上报

0 commit comments

Comments
 (0)