From 6b32e160a8651053624cc4c436368888ccbe95e8 Mon Sep 17 00:00:00 2001 From: huangsimin Date: Fri, 5 Jul 2019 16:08:59 +0800 Subject: [PATCH] =?UTF-8?q?TODO:=20=E5=87=BD=E6=95=B0=E9=85=8D=E7=BD=AE,?= =?UTF-8?q?=20=E5=8F=82=E6=95=B0=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../factory/DubboGatewayFilterFactory.java | 36 +----- .../service/usergw/config/ConfigGateway.java | 106 +++++++++--------- .../usergw/config/ConfigSpecialFunction.java | 17 ++- .../ecpark/service/usergw/utils/Convert.java | 1 + .../ecpark/service/usergw/utils/Extract.java | 29 +++++ .../src/main/resources/gateway.yaml | 1 + 6 files changed, 93 insertions(+), 97 deletions(-) create mode 100644 usergw-service/src/main/java/cn/ecpark/service/usergw/utils/Extract.java diff --git a/usergw-service/src/main/java/cn/ecpark/service/usergw/biz/filters/factory/DubboGatewayFilterFactory.java b/usergw-service/src/main/java/cn/ecpark/service/usergw/biz/filters/factory/DubboGatewayFilterFactory.java index fddaea5..76e3fef 100644 --- a/usergw-service/src/main/java/cn/ecpark/service/usergw/biz/filters/factory/DubboGatewayFilterFactory.java +++ b/usergw-service/src/main/java/cn/ecpark/service/usergw/biz/filters/factory/DubboGatewayFilterFactory.java @@ -50,42 +50,8 @@ public class DubboGatewayFilterFactory extends AbstractGatewayFilterFactory { - 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 rparamTypes = new ArrayList(); - List rparams = new ArrayList(); - - 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 reference = new ReferenceConfig(); // 该实例很重量,里面封装了所有与注册中心及服务提供方连接,请缓存 - 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); diff --git a/usergw-service/src/main/java/cn/ecpark/service/usergw/config/ConfigGateway.java b/usergw-service/src/main/java/cn/ecpark/service/usergw/config/ConfigGateway.java index 74992ff..d34325a 100644 --- a/usergw-service/src/main/java/cn/ecpark/service/usergw/config/ConfigGateway.java +++ b/usergw-service/src/main/java/cn/ecpark/service/usergw/config/ConfigGateway.java @@ -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 defaultFilters = new ArrayList<>(); HashMap , String>> specialField = new HashMap , String>>(); + Set 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 reference = new ReferenceConfig(); // 该实例很重量,里面封装了所有与注册中心及服务提供方连接,请缓存 - // 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 reference = new ReferenceConfig(); - String UriString = "dubbo://"; + reference.setConnections(3); + String UriString = "dubbo://"; Object application = iter.get("application"); if (application != null) { BiConsumer, 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, 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> 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, 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 predicates, LinkedHashMap> iter, @@ -340,7 +335,7 @@ public class ConfigGateway implements RouteDefinitionLocator { } } - private void ParseAndAddDubboFilters(List filters, LinkedHashMap> iter, + private void ParseAndAddDubboFilters(String dubboUri, List filters, LinkedHashMap> iter, String yamlField) { List 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)); } } diff --git a/usergw-service/src/main/java/cn/ecpark/service/usergw/config/ConfigSpecialFunction.java b/usergw-service/src/main/java/cn/ecpark/service/usergw/config/ConfigSpecialFunction.java index 4f07186..4fa19d7 100644 --- a/usergw-service/src/main/java/cn/ecpark/service/usergw/config/ConfigSpecialFunction.java +++ b/usergw-service/src/main/java/cn/ecpark/service/usergw/config/ConfigSpecialFunction.java @@ -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 ref, String cfgValue) { - ref.setApplication(new ApplicationConfig(cfgValue)); + public static void setApplication(ReferenceConfig ref, Object cfgValue) { + ref.setApplication(new ApplicationConfig((String)cfgValue)); } - public static void setDefault(ReferenceConfig 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 ref, Object cfgValue) { + ref.setRegistry(new RegistryConfig((String)cfgValue)); + } + + public static void setDefault(ReferenceConfig 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); } } \ No newline at end of file diff --git a/usergw-service/src/main/java/cn/ecpark/service/usergw/utils/Convert.java b/usergw-service/src/main/java/cn/ecpark/service/usergw/utils/Convert.java index 4a794a1..fa93654 100644 --- a/usergw-service/src/main/java/cn/ecpark/service/usergw/utils/Convert.java +++ b/usergw-service/src/main/java/cn/ecpark/service/usergw/utils/Convert.java @@ -13,4 +13,5 @@ public class Convert { } return new String(ch); } + } \ No newline at end of file diff --git a/usergw-service/src/main/java/cn/ecpark/service/usergw/utils/Extract.java b/usergw-service/src/main/java/cn/ecpark/service/usergw/utils/Extract.java new file mode 100644 index 0000000..108b414 --- /dev/null +++ b/usergw-service/src/main/java/cn/ecpark/service/usergw/utils/Extract.java @@ -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 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(); + } +} \ No newline at end of file diff --git a/usergw-service/src/main/resources/gateway.yaml b/usergw-service/src/main/resources/gateway.yaml index 6815ec6..9a12b24 100644 --- a/usergw-service/src/main/resources/gateway.yaml +++ b/usergw-service/src/main/resources/gateway.yaml @@ -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