Skip to content

Commit afa9565

Browse files
authored
Merge pull request #19 from andrewshan/main
fix the force exception when plugin not found
2 parents 95f3b35 + 58dfc84 commit afa9565

File tree

6 files changed

+62
-18
lines changed

6 files changed

+62
-18
lines changed

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public static Instance commonGetOneInstance(Extensions extensions, ServiceKey se
102102
LOG.info("[ConnectionManager]success to discover service {}", svcEventKey);
103103
ServiceInstances serviceInstances = resourcesResponse.getServiceInstances(svcEventKey);
104104
RouterChainGroup sysRouterChainGroup = extensions.getSysRouterChainGroup();
105-
List<ServiceRouter> coreRouters = Extensions.loadServiceRouters(coreRouterNames, extensions.getPlugins());
105+
List<ServiceRouter> coreRouters = Extensions.loadServiceRouters(coreRouterNames, extensions.getPlugins(), false);
106106
RouterChainGroup routerChainGroup = new DefaultRouterChainGroup(sysRouterChainGroup.getBeforeRouters(),
107107
coreRouters, sysRouterChainGroup.getAfterRouters());
108108
ServiceInstances instancesAfterRoute = BaseFlow

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ consumer:
144144
#描述:节点熔断相关配置
145145
circuitBreaker:
146146
#描述: 是否启用本地节点熔断功能
147-
enable: false
147+
enable: true
148148
#描述: 故障检测周期,根据周期内故障进行熔断
149149
checkPeriod: 1m
150150
#描述: 首次熔断时间,后续熔断时间=重试次数*sleepWindow

polaris-plugins/polaris-plugin-api/src/main/java/com/tencent/polaris/api/plugin/Supplier.java

+10-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
public interface Supplier {
3030

3131
/**
32-
* 获取插件实例
32+
* 获取插件实例,获取不到会报异常
3333
*
3434
* @param type 插件类型
3535
* @param name 插件名
@@ -38,6 +38,15 @@ public interface Supplier {
3838
*/
3939
Plugin getPlugin(PluginType type, String name) throws PolarisException;
4040

41+
/**
42+
* 获取可选的插件,获取不到返回null
43+
*
44+
* @param type 插件类型
45+
* @param name 插件名
46+
* @return 插件实例
47+
*/
48+
Plugin getOptionalPlugin(PluginType type, String name);
49+
4150
/**
4251
* 获取某类型下的所有插件
4352
*

polaris-plugins/polaris-plugin-api/src/main/java/com/tencent/polaris/api/plugin/compose/Extensions.java

+34-11
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.tencent.polaris.api.config.consumer.OutlierDetectionConfig.When;
2222
import com.tencent.polaris.api.config.consumer.ServiceRouterConfig;
2323
import com.tencent.polaris.api.exception.PolarisException;
24+
import com.tencent.polaris.api.plugin.Plugin;
2425
import com.tencent.polaris.api.plugin.Supplier;
2526
import com.tencent.polaris.api.plugin.cache.FlowCache;
2627
import com.tencent.polaris.api.plugin.circuitbreaker.CircuitBreaker;
@@ -35,6 +36,8 @@
3536
import java.util.ArrayList;
3637
import java.util.Collections;
3738
import java.util.List;
39+
import org.slf4j.Logger;
40+
import org.slf4j.LoggerFactory;
3841

3942
/**
4043
* 流程编排所需要用到的插件实例列表
@@ -43,6 +46,8 @@
4346
*/
4447
public class Extensions {
4548

49+
private static final Logger LOG = LoggerFactory.getLogger(Extensions.class);
50+
4651
private LocalRegistry localRegistry;
4752

4853
private ServerConnector serverConnector;
@@ -89,28 +94,32 @@ public void init(Configuration config, Supplier plugins, ValueContext valueConte
8994
loadBalancer = (LoadBalancer) plugins.getPlugin(PluginTypes.LOAD_BALANCER.getBaseType(), loadBalanceType);
9095

9196
List<ServiceRouter> beforeRouters = loadServiceRouters(config.getConsumer().getServiceRouter().getBeforeChain(),
92-
plugins);
97+
plugins, true);
9398
List<ServiceRouter> coreRouters = loadServiceRouters(config.getConsumer().getServiceRouter().getChain(),
94-
plugins);
99+
plugins, false);
95100
List<ServiceRouter> afterRouters = loadServiceRouters(config.getConsumer().getServiceRouter().getAfterChain(),
96-
plugins);
101+
plugins, true);
97102
configRouterChainGroup = new DefaultRouterChainGroup(beforeRouters, coreRouters, afterRouters);
98103
//加载系统路由链
99104
List<String> sysBefore = new ArrayList<>();
100105
sysBefore.add(ServiceRouterConfig.DEFAULT_ROUTER_ISOLATED);
101106
List<String> sysAfter = new ArrayList<>();
102107
sysAfter.add(ServiceRouterConfig.DEFAULT_ROUTER_RECOVER);
103-
List<ServiceRouter> sysBeforeRouters = loadServiceRouters(sysBefore, plugins);
104-
List<ServiceRouter> sysAfterRouters = loadServiceRouters(sysAfter, plugins);
108+
List<ServiceRouter> sysBeforeRouters = loadServiceRouters(sysBefore, plugins, true);
109+
List<ServiceRouter> sysAfterRouters = loadServiceRouters(sysAfter, plugins, true);
105110
sysRouterChainGroup = new DefaultRouterChainGroup(sysBeforeRouters, Collections.emptyList(), sysAfterRouters);
106111

107112
//加载熔断器
108113
boolean enable = config.getConsumer().getCircuitBreaker().isEnable();
109114
List<String> cbChain = config.getConsumer().getCircuitBreaker().getChain();
110115
if (enable && CollectionUtils.isNotEmpty(cbChain)) {
111116
for (String cbName : cbChain) {
112-
circuitBreakers.add((CircuitBreaker) plugins.getPlugin(
113-
PluginTypes.CIRCUIT_BREAKER.getBaseType(), cbName));
117+
Plugin pluginValue = plugins.getOptionalPlugin(PluginTypes.CIRCUIT_BREAKER.getBaseType(), cbName);
118+
if (null == pluginValue) {
119+
LOG.warn("circuitBreaker plugin {} not found", cbName);
120+
continue;
121+
}
122+
circuitBreakers.add((CircuitBreaker) pluginValue);
114123
}
115124
}
116125

@@ -126,11 +135,21 @@ public ValueContext getValueContext() {
126135
return valueContext;
127136
}
128137

129-
public static List<ServiceRouter> loadServiceRouters(List<String> routerChain, Supplier plugins) {
138+
public static List<ServiceRouter> loadServiceRouters(List<String> routerChain, Supplier plugins, boolean force) {
130139
List<ServiceRouter> routers = new ArrayList<>();
131140
if (CollectionUtils.isNotEmpty(routerChain)) {
132141
for (String routerName : routerChain) {
133-
routers.add((ServiceRouter) plugins.getPlugin(PluginTypes.SERVICE_ROUTER.getBaseType(), routerName));
142+
Plugin routerPlugin;
143+
if (force) {
144+
routerPlugin = plugins.getPlugin(PluginTypes.SERVICE_ROUTER.getBaseType(), routerName);
145+
} else {
146+
routerPlugin = plugins.getOptionalPlugin(PluginTypes.SERVICE_ROUTER.getBaseType(), routerName);
147+
}
148+
if (null == routerPlugin) {
149+
LOG.warn("router {} not found", routerName);
150+
continue;
151+
}
152+
routers.add((ServiceRouter) routerPlugin);
134153
}
135154
}
136155
return Collections.unmodifiableList(routers);
@@ -141,8 +160,12 @@ private void loadOutlierDetector(Configuration config, Supplier plugins) throws
141160
List<String> detectionChain = config.getConsumer().getOutlierDetection().getChain();
142161
if (enable && CollectionUtils.isNotEmpty(detectionChain)) {
143162
for (String detectorName : detectionChain) {
144-
outlierDetectors.add((OutlierDetector) plugins.getPlugin(
145-
PluginTypes.OUTLIER_DETECTOR.getBaseType(), detectorName));
163+
Plugin pluginValue = plugins.getOptionalPlugin(PluginTypes.OUTLIER_DETECTOR.getBaseType(), detectorName);
164+
if (null == pluginValue) {
165+
LOG.warn("outlierDetector plugin {} not found", detectorName);
166+
continue;
167+
}
168+
outlierDetectors.add((OutlierDetector) pluginValue);
146169
}
147170
}
148171
}

polaris-plugins/polaris-plugin-api/src/main/java/com/tencent/polaris/api/plugin/impl/PluginManager.java

+12
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,18 @@ public Plugin getPlugin(PluginType type, String name) throws PolarisException {
133133
return plugins.get(name);
134134
}
135135

136+
@Override
137+
public Plugin getOptionalPlugin(PluginType type, String name) {
138+
if (!typedPlugins.containsKey(type)) {
139+
return null;
140+
}
141+
Map<String, Plugin> plugins = typedPlugins.get(type);
142+
if (!plugins.containsKey(name)) {
143+
return null;
144+
}
145+
return plugins.get(name);
146+
}
147+
136148
@Override
137149
public Collection<Plugin> getPlugins(PluginType type) throws PolarisException {
138150
if (!typedPlugins.containsKey(type)) {

polaris-router/polaris-router-client/src/main/java/com/tencent/polaris/router/client/api/DefaultRouterAPI.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -75,27 +75,27 @@ protected void subInit() {
7575

7676
@Override
7777
public ProcessRoutersResponse processRouters(ProcessRoutersRequest request) throws PolarisException {
78-
checkAvailable("EngineAPI");
78+
checkAvailable("RouterAPI");
7979
RouterValidator.validateProcessRouterRequest(request);
8080
RouterNamesGroup requestRouterGroup = request.getRouters();
8181
List<ServiceRouter> beforeRouters;
8282
if (null != requestRouterGroup && CollectionUtils.isNotEmpty(requestRouterGroup.getBeforeRouters())) {
8383
beforeRouters = Extensions.loadServiceRouters(
84-
requestRouterGroup.getBeforeRouters(), extensions.getPlugins());
84+
requestRouterGroup.getBeforeRouters(), extensions.getPlugins(), true);
8585
} else {
8686
beforeRouters = extensions.getConfigRouterChainGroup().getBeforeRouters();
8787
}
8888
List<ServiceRouter> afterRouters;
8989
if (null != requestRouterGroup && CollectionUtils.isNotEmpty(requestRouterGroup.getAfterRouters())) {
9090
afterRouters = Extensions.loadServiceRouters(
91-
requestRouterGroup.getAfterRouters(), extensions.getPlugins());
91+
requestRouterGroup.getAfterRouters(), extensions.getPlugins(), true);
9292
} else {
9393
afterRouters = extensions.getConfigRouterChainGroup().getAfterRouters();
9494
}
9595
List<ServiceRouter> coreRouters;
9696
if (null != requestRouterGroup && CollectionUtils.isNotEmpty(requestRouterGroup.getCoreRouters())) {
9797
coreRouters = Extensions.loadServiceRouters(
98-
requestRouterGroup.getCoreRouters(), extensions.getPlugins());
98+
requestRouterGroup.getCoreRouters(), extensions.getPlugins(), true);
9999
} else {
100100
coreRouters = extensions.getConfigRouterChainGroup().getCoreRouters();
101101
}

0 commit comments

Comments
 (0)