TODO: 函数配置, 参数配置

This commit is contained in:
huangsimin 2019-07-05 16:08:59 +08:00
parent 342e18766e
commit 6b32e160a8
6 changed files with 93 additions and 97 deletions

View File

@ -50,42 +50,8 @@ public class DubboGatewayFilterFactory extends AbstractGatewayFilterFactory<Dubb
return (exchange, chain) -> {
String application = "dubbo-exchange"; // 必须
// reference.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));
String rgroup = "group";
String rinterface = "ocean.demo.api.IExchange"; // 弱类型接口名 必须
String rversion = "1.0.0";
String rmethod = "Say";
int rconnections = 3;
List<String> rparamTypes = new ArrayList<String>();
List<String> rparams = new ArrayList<String>();
String rkey = "";
rkey += application;
if (rgroup != null && !rgroup.isEmpty()) {
rkey += "/" + rgroup;
}
rkey += "/" + rinterface;
rkey += ":" + rversion;
GenericServicePool gsPool = appContext.getBean(GenericServicePool.class);
GenericService gs = gsPool.get(rkey);
if(gs == null) {
ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>(); // 该实例很重量里面封装了所有与注册中心及服务提供方连接请缓存
reference.setApplication(new ApplicationConfig("dubbo-exchange")); // 必须
// reference.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));
reference.setGroup("test");
reference.setInterface("ocean.demo.api.IExchange"); // 弱类型接口名 必须
reference.setVersion("1.0.0"); // 必须
reference.setConnections(rconnections);
reference.setGeneric(true); // 声明为泛化接口
// gsPool.add(rkey, reference.get());
gs = reference.get();
gsPool.put(rkey, gs);
}
GenericService gs = gsPool.get(uri);
// special
Object result = gs.$invoke("Say", new String[] { "java.lang.String" }, new Object[] { "222" });
// gsPool.add(rkey, gs);

View File

@ -5,22 +5,23 @@ import java.lang.reflect.Method;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Function;
import org.apache.dubbo.config.ReferenceConfig;
import org.apache.dubbo.rpc.service.GenericService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.cloud.gateway.filter.FilterDefinition;
import org.springframework.cloud.gateway.handler.predicate.PredicateDefinition;
import org.springframework.cloud.gateway.route.RouteDefinition;
import org.springframework.cloud.gateway.route.RouteDefinitionLocator;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
@ -28,8 +29,8 @@ import org.yaml.snakeyaml.Yaml;
import cn.ecpark.service.usergw.biz.filters.bean.GenericServicePool;
import cn.ecpark.service.usergw.biz.filters.factory.DubboGatewayFilterFactory;
import cn.ecpark.service.usergw.impl.http.Http2Dubbo;
import cn.ecpark.service.usergw.utils.Convert;
import cn.ecpark.service.usergw.utils.Extract;
import lombok.extern.slf4j.Slf4j;
import reactor.core.publisher.Flux;
@ -45,6 +46,7 @@ public class ConfigGateway implements RouteDefinitionLocator {
List<FilterDefinition> defaultFilters = new ArrayList<>();
HashMap<String, BiConsumer<ReferenceConfig<GenericService> , String>> specialField = new HashMap<String, BiConsumer<ReferenceConfig<GenericService> , String>>();
Set<String> ignoreKey = new HashSet<>();
@Autowired
private ApplicationContext appContext;
@ -59,9 +61,12 @@ public class ConfigGateway implements RouteDefinitionLocator {
return new DubboGatewayFilterFactory();
}
public ConfigGateway() {
specialField.put("application", ConfigSpecialFunction::setApplication);
specialField.put("registry", ConfigSpecialFunction::setRegistry);
ignoreKey.add("predicates");
ignoreKey.add("filters");
}
@Override
@ -180,13 +185,13 @@ public class ConfigGateway implements RouteDefinitionLocator {
RouteDefinition rd = new RouteDefinition();
// 设置基础属性
String uri = this.ParseDubboUriAndSetBase(rd, iter);
String dubboUri = this.ParseDubboUriAndSetBase(rd, iter);
// predicates: 下的相关属性
this.ParseAndAddPredicates(predicates, iter, "predicates");
// filters: 下的相关属性
this.ParseAndAddDubboFilters(filters, iter, "filters");
this.ParseAndAddDubboFilters(dubboUri, filters, iter, "filters");
rd.setPredicates(predicates);
rd.setFilters(filters);
@ -198,9 +203,9 @@ public class ConfigGateway implements RouteDefinitionLocator {
}
} catch (Exception e) {
// TODO: 任何错误都直接终止退出
log.error(e.toString());
SpringApplication.exit(appContext);
log.warn("App is exit");
((ConfigurableApplicationContext)appContext).close();
}
// gs.$invoke(method, parameterTypes, args)
@ -233,6 +238,7 @@ public class ConfigGateway implements RouteDefinitionLocator {
if (id != null) {
rd.setId((String) id);
}
iter.remove("id");
// 设置uri
Object uri = iter.get("uri");
@ -246,12 +252,14 @@ public class ConfigGateway implements RouteDefinitionLocator {
} else {
rd.setUri(URI.create("dubbo://yame"));
}
iter.remove("uri");
// 设置uri
Object order = iter.get("order");
if (order != null) {
rd.setOrder((int) order);
}
iter.remove("order");
if (uri != null) {
String uriString = (String) uri;
@ -261,62 +269,49 @@ public class ConfigGateway implements RouteDefinitionLocator {
}
}
// GenericServicePool gsPool = appContext.getBean(GenericServicePool.class);
// GenericService gs = gsPool.get(rkey);
// if(gs == null) {
// ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>(); // 该实例很重量里面封装了所有与注册中心及服务提供方连接请缓存
// reference.setApplication(new ApplicationConfig("dubbo-exchange")); // 必须
// // reference.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));
// reference.setGroup("test");
// reference.setInterface("ocean.demo.api.IExchange"); // 弱类型接口名 必须
// reference.setVersion("1.0.0"); // 必须
// reference.setConnections(rconnections);
// reference.setGeneric(true); // 声明为泛化接口
// // gsPool.add(rkey, reference.get());
// gs = reference.get();
// gsPool.put(rkey, gs);
// }
ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();
String UriString = "dubbo://";
reference.setConnections(3);
String UriString = "dubbo://";
Object application = iter.get("application");
if (application != null) {
BiConsumer<ReferenceConfig<GenericService>, String> doFunc = specialField.get("application");
if(doFunc != null) {
doFunc.accept(reference, (String)application);
}
UriString += (String)application + "/";
}
Object group = iter.get("group");
if (group != null) {
BiConsumer<ReferenceConfig<GenericService>, String> doFunc = specialField.get((String)group);
if(doFunc != null) {
doFunc.accept(reference, (String)application);
} else {
try {
ConfigSpecialFunction.setDefault(reference, "group", (String)group);
} catch (Exception e) {
log.error("配置解析错误 字段: {}:{}", "group", group);
}
iter.remove("application");
for( Entry<String, List<String>> entry : iter.entrySet() ) {
// Object group = iter.get("group");
String key = entry.getKey();
if(ignoreKey.contains(key)) {
continue;
}
Object value = entry.getValue();
if (value != null) {
BiConsumer<ReferenceConfig<GenericService>, String> doFunc = specialField.get((String)key);
if(doFunc != null) {
doFunc.accept(reference, (String)value);
} else {
try {
ConfigSpecialFunction.setDefault(reference, key, value);
} catch (Exception e) {
log.error("配置解析错误 字段: {}:{}\n{}", key, value, e.toString());
log.warn("App is exit");
((ConfigurableApplicationContext)appContext).close();
}
}
}
UriString += (String)application + "/";
}
UriString += Extract.getReferenceConfigKey(reference);
GenericServicePool gsPool = appContext.getBean(GenericServicePool.class);
reference.setGeneric(true);
gsPool.put(UriString, reference.get());
Object registry = iter.get("registry");
if (registry != null) {
rd.setOrder((int) registry);
}
return "";
return UriString;
}
private void ParseAndAddPredicates(List<PredicateDefinition> predicates, LinkedHashMap<String, List<String>> iter,
@ -340,7 +335,7 @@ public class ConfigGateway implements RouteDefinitionLocator {
}
}
private void ParseAndAddDubboFilters(List<FilterDefinition> filters, LinkedHashMap<String, List<String>> iter,
private void ParseAndAddDubboFilters(String dubboUri, List<FilterDefinition> filters, LinkedHashMap<String, List<String>> iter,
String yamlField) {
List<String> filtersYaml = iter.get(yamlField);
if (filtersYaml != null) {
@ -350,10 +345,9 @@ public class ConfigGateway implements RouteDefinitionLocator {
log.info(fd.getName());
if (!fd.getName().equals("Dubbo")) {
filters.add(fd);
} else {
filters.add(fd);
}
}
filters.add(new FilterDefinition("Dubbo=" + dubboUri));
}
}

View File

@ -8,6 +8,7 @@ import javax.el.MethodNotFoundException;
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.ReferenceConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.rpc.service.GenericService;
import cn.ecpark.service.usergw.utils.Convert;
@ -24,14 +25,18 @@ public class ConfigSpecialFunction {
// ref.setApplication(new ApplicationConfig(cfgValue));
// };
public static void setApplication(ReferenceConfig<GenericService> ref, String cfgValue) {
ref.setApplication(new ApplicationConfig(cfgValue));
public static void setApplication(ReferenceConfig<GenericService> ref, Object cfgValue) {
ref.setApplication(new ApplicationConfig((String)cfgValue));
}
public static void setDefault(ReferenceConfig<GenericService> ref, String methodName, String cfgValue) throws Exception {
cfgValue = "set" + Convert.firstUpperCase(methodName);
log.info(methodName,cfgValue);
Method method = ref.getClass().getMethod(methodName);
public static void setRegistry(ReferenceConfig<GenericService> ref, Object cfgValue) {
ref.setRegistry(new RegistryConfig((String)cfgValue));
}
public static void setDefault(ReferenceConfig<GenericService> ref, String methodName, Object cfgValue) throws Exception {
methodName = "set" + Convert.firstUpperCase(methodName);
log.info("method:{}, value:{}",methodName,cfgValue);
Method method = ref.getClass().getMethod(methodName, cfgValue.getClass());
method.invoke(ref, cfgValue);
}
}

View File

@ -13,4 +13,5 @@ public class Convert {
}
return new String(ch);
}
}

View File

@ -0,0 +1,29 @@
package cn.ecpark.service.usergw.utils;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.config.ReferenceConfig;
import org.apache.dubbo.rpc.service.GenericService;
public class Extract {
public static String getReferenceConfigKey(ReferenceConfig<GenericService> referenceConfig) {
String iName = referenceConfig.getInterface();
if (StringUtils.isBlank(iName)) {
Class<?> clazz = referenceConfig.getInterfaceClass();
iName = clazz.getName();
}
if (StringUtils.isBlank(iName)) {
throw new IllegalArgumentException("No interface info in ReferenceConfig" + referenceConfig);
}
StringBuilder ret = new StringBuilder();
ret.append(referenceConfig.getApplication().getName()).append("/");
if (!StringUtils.isBlank(referenceConfig.getGroup())) {
ret.append(referenceConfig.getGroup()).append("/");
}
ret.append(iName);
if (!StringUtils.isBlank(referenceConfig.getVersion())) {
ret.append(":").append(referenceConfig.getVersion());
}
return ret.toString();
}
}

View File

@ -20,6 +20,7 @@ dubbo:
- id: test
order: 10
application: dubbo-exchange
group: test
registry: zookeeper://127.0.0.1:2181
interface: ocean.demo.api.IExchange
version: 1.0.0