From ce404ecf6bbba54e37513bf44ffc7d706cee2f72 Mon Sep 17 00:00:00 2001 From: huangsimin Date: Tue, 13 Aug 2019 18:28:05 +0800 Subject: [PATCH] TODO: ConfigApollo Created In Bean. --- pom.xml | 2 +- usergw-service/pom.xml | 2 +- .../java/cn/ecpark/service/usergw/App.java | 3 - .../service/usergw/biz/events/Change.java | 23 ++++ .../service/usergw/config/ConfigApollo.java | 50 +++++--- .../service/usergw/config/ConfigGateway.java | 109 ++++++++++++------ .../usergw/config/bean/ConfigBean.java | 8 ++ .../src/main/resources/application.properties | 13 ++- 8 files changed, 151 insertions(+), 59 deletions(-) create mode 100644 usergw-service/src/main/java/cn/ecpark/service/usergw/biz/events/Change.java diff --git a/pom.xml b/pom.xml index 2c69996..9f89c20 100644 --- a/pom.xml +++ b/pom.xml @@ -18,7 +18,7 @@ Demo project for Yame User Gateway - 1.11 + 1.8 UTF-8 UTF-8 Greenwich.SR2 diff --git a/usergw-service/pom.xml b/usergw-service/pom.xml index 71110c8..44ae320 100644 --- a/usergw-service/pom.xml +++ b/usergw-service/pom.xml @@ -16,7 +16,7 @@ Demo project for Gateway Service - 1.11 + 1.8 diff --git a/usergw-service/src/main/java/cn/ecpark/service/usergw/App.java b/usergw-service/src/main/java/cn/ecpark/service/usergw/App.java index b22f7b2..4894246 100644 --- a/usergw-service/src/main/java/cn/ecpark/service/usergw/App.java +++ b/usergw-service/src/main/java/cn/ecpark/service/usergw/App.java @@ -1,7 +1,5 @@ package cn.ecpark.service.usergw; -import com.ctrip.framework.apollo.spring.annotation.EnableApolloConfig; - import org.apache.dubbo.config.spring.context.annotation.EnableDubboConfig; import org.springframework.beans.factory.annotation.Configurable; import org.springframework.boot.SpringApplication; @@ -20,7 +18,6 @@ import org.springframework.context.annotation.Configuration; @EnableAutoConfiguration @EnableDubboConfig @ComponentScan("cn.ecpark.service.usergw") -@EnableApolloConfig public class App { public static void main(String[] args) { diff --git a/usergw-service/src/main/java/cn/ecpark/service/usergw/biz/events/Change.java b/usergw-service/src/main/java/cn/ecpark/service/usergw/biz/events/Change.java new file mode 100644 index 0000000..9271c54 --- /dev/null +++ b/usergw-service/src/main/java/cn/ecpark/service/usergw/biz/events/Change.java @@ -0,0 +1,23 @@ +package cn.ecpark.service.usergw.biz.events; + +import org.springframework.cloud.gateway.event.RefreshRoutesEvent; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.context.ApplicationEventPublisherAware; +import org.springframework.stereotype.Service; + +@Service +public class Change implements ApplicationEventPublisherAware { + + private ApplicationEventPublisher publisher; + + @Override + public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { + this.publisher = applicationEventPublisher; + } + + public void notifyChanged() { + this.publisher.publishEvent(new RefreshRoutesEvent(this)); + } + + +} \ No newline at end of file diff --git a/usergw-service/src/main/java/cn/ecpark/service/usergw/config/ConfigApollo.java b/usergw-service/src/main/java/cn/ecpark/service/usergw/config/ConfigApollo.java index e24642f..0bd1f1d 100644 --- a/usergw-service/src/main/java/cn/ecpark/service/usergw/config/ConfigApollo.java +++ b/usergw-service/src/main/java/cn/ecpark/service/usergw/config/ConfigApollo.java @@ -3,6 +3,7 @@ package cn.ecpark.service.usergw.config; import javax.annotation.Resource; import org.springframework.beans.factory.annotation.Configurable; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.gateway.event.RefreshRoutesEvent; import org.springframework.cloud.gateway.route.RouteDefinitionWriter; import org.springframework.context.ApplicationEventPublisher; @@ -11,30 +12,47 @@ import org.springframework.stereotype.Service; import lombok.extern.slf4j.Slf4j; +import com.ctrip.framework.apollo.Config; +import com.ctrip.framework.apollo.ConfigService; +import com.ctrip.framework.apollo.model.ConfigChange; import com.ctrip.framework.apollo.model.ConfigChangeEvent; +import com.ctrip.framework.apollo.spring.annotation.ApolloConfig; import com.ctrip.framework.apollo.spring.annotation.ApolloConfigChangeListener; import com.ctrip.framework.apollo.spring.annotation.EnableApolloConfig; -@Slf4j -@Configurable -@Service -@EnableApolloConfig -public class ConfigApollo implements ApplicationEventPublisherAware { - private ApplicationEventPublisher publisher; - public void notifyChanged() { - this.publisher.publishEvent(new RefreshRoutesEvent(this)); +// @EnableApolloConfig("gateway.yml") +// @ConditionalOnProperty(prefix="app", value="id", matchIfMissing=true) +// @Configurable + +public class ConfigApollo { + + // private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ConfigApollo.class); + + // @ApolloConfig("gateway.yml") + private Config config; + + public ConfigApollo() { + } - - @ApolloConfigChangeListener("gateway.yml") + // @ApolloConfigChangeListener("gateway.yml") private void listenApolloChange(ConfigChangeEvent changeEvent) { - log.warn(changeEvent.getNamespace()); + + } + + /** + * @return Config return the config + */ + public Config getConfig() { + return config; + } + + /** + * @param config the config to set + */ + public void setConfig(Config config) { + this.config = config; } - @Override - public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { - this.publisher = applicationEventPublisher; - } - } \ No newline at end of file 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 e072cf0..58ce415 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 @@ -1,6 +1,8 @@ package cn.ecpark.service.usergw.config; +import java.io.ByteArrayInputStream; import java.io.InputStream; +import java.lang.reflect.Field; import java.net.URI; import java.util.ArrayList; import java.util.HashMap; @@ -12,6 +14,11 @@ import java.util.Map.Entry; import java.util.Set; import java.util.function.BiConsumer; +import com.ctrip.framework.apollo.internals.ConfigRepository; +import com.ctrip.framework.apollo.internals.DefaultConfig; +import com.ctrip.framework.apollo.internals.PropertiesCompatibleFileConfigRepository; +import com.ctrip.framework.apollo.internals.YmlConfigFile; + import org.apache.dubbo.config.ReferenceConfig; import org.apache.dubbo.rpc.service.GenericService; import org.springframework.beans.factory.annotation.Autowired; @@ -27,21 +34,26 @@ import org.yaml.snakeyaml.Yaml; import cn.ecpark.service.usergw.biz.filters.bean.GenericServicePool; import cn.ecpark.service.usergw.utils.Extract; -import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Flux; /** * ConfigGateway */ @Component -@Slf4j public class ConfigGateway implements RouteDefinitionLocator { // List mediaTypes = new ArrayList<>(); + private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ConfigGateway.class); - @Value("${yame.config}") + @Value("${yame.config:}") private String yameConfigPath; + @Value("${apollo.meta:}") + private String apolloMeta; + + @Value("${app.id:}") + private String appID; + private List defaultFilters = new ArrayList<>(); private HashMap, Object>> specialField = new HashMap, Object>>(); private Set ignoreKey = new HashSet<>(); @@ -67,7 +79,7 @@ public class ConfigGateway implements RouteDefinitionLocator { private InputStream loadLocalFileConfig() { Object inputStream = null; String[] gatewayConfigPathList; - if (yameConfigPath == null) { + if (yameConfigPath.equals("")) { gatewayConfigPathList = new String[] { "gateway.yml", "gateway.yaml", "Gateway.yml", "Gateway.yaml" }; } else { gatewayConfigPathList = new String[] { yameConfigPath }; @@ -79,20 +91,47 @@ public class ConfigGateway implements RouteDefinitionLocator { break; } } - return (InputStream)inputStream; + return (InputStream) inputStream; } - - private InputStream loadApolloConfige() { + + + private InputStream loadApolloConfig() { + if (true) return null; + ConfigApollo configApollo = appContext.getBean(ConfigApollo.class); + DefaultConfig config = (DefaultConfig) configApollo.getConfig(); + try { + Field m_configRepository = DefaultConfig.class.getDeclaredField("m_configRepository"); + m_configRepository.setAccessible(true); + ConfigRepository cr = (ConfigRepository) m_configRepository.get(config); + Field configFile = PropertiesCompatibleFileConfigRepository.class.getDeclaredField("configFile"); + configFile.setAccessible(true); + YmlConfigFile ymlConfigFile = (YmlConfigFile) configFile.get(cr); + String content = ymlConfigFile.getContent(); + log.info("Load Apollo YAML Config: \n{}", content); + return new ByteArrayInputStream(content.getBytes()); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } return null; } @Override @SuppressWarnings("unchecked") public Flux getRouteDefinitions() { - // WebFluxConfigurationSupport a; defaultFilters.clear(); - InputStream inputStream = loadLocalFileConfig(); - + InputStream inputStream; + if(!this.apolloMeta.equals("") && !this.appID.equals("")) { + inputStream = loadApolloConfig(); + } else { + inputStream = loadLocalFileConfig(); + } + if (inputStream != null) { Map configYaml = new Yaml().load(inputStream); if (configYaml != null) { @@ -100,7 +139,7 @@ public class ConfigGateway implements RouteDefinitionLocator { List defaultFiltersYaml = null; Map restfulYaml = null; Map dubboYaml = null; - + Object unknown; unknown = configYaml.get("default-filters"); if (unknown != null) { @@ -264,7 +303,7 @@ public class ConfigGateway implements RouteDefinitionLocator { /** * - * @param rd {@link RouteDefinition} + * @param rd {@link RouteDefinition} * @param iter Yaml.dubbo.routes * @return dubboUri 字符串标识 eg. dubbo://application/group/com.a.b:1.0.0 */ @@ -294,12 +333,11 @@ public class ConfigGateway implements RouteDefinitionLocator { // 设置uri Object order = iter.get("order"); if (order != null) { - rd.setOrder((int)order); + rd.setOrder((int) order); iter.remove("order"); } else { rd.setOrder(0); } - ReferenceConfig reference = new ReferenceConfig(); reference.setConnections(3); @@ -358,9 +396,9 @@ public class ConfigGateway implements RouteDefinitionLocator { /** * - * @param predicates List<{@link PredicateDefinition}> 断言列表 - * @param iter restful.routes.predicates - * @param yamlField 根据域的key 获取 predicates 字符串列 + * @param predicates List<{@link PredicateDefinition}> 断言列表 + * @param iter restful.routes.predicates + * @param yamlField 根据域的key 获取 predicates 字符串列 */ private void parseAndAddPredicates(List predicates, LinkedHashMap> iter, String yamlField) { @@ -374,9 +412,9 @@ public class ConfigGateway implements RouteDefinitionLocator { /** * - * @param filters List<{@link FilterDefinition}> 过滤器列表 - * @param iter restful.routes.filters - * @param yamlField 根据域的key 获取 filters 字符串列 + * @param filters List<{@link FilterDefinition}> 过滤器列表 + * @param iter restful.routes.filters + * @param yamlField 根据域的key 获取 filters 字符串列 */ private void parseAndAddFilters(List filters, LinkedHashMap> iter, String yamlField) { @@ -391,43 +429,44 @@ public class ConfigGateway implements RouteDefinitionLocator { /** * - * @param dubboUri 获取返回的字符串 {@link #parseDubboUriAndSetBase(RouteDefinition, LinkedHashMap)} - * @param filters List<{@link FilterDefinition}> 过滤器列表 - * @param iter dubbo.routes.filters + * @param dubboUri 获取返回的字符串 + * {@link #parseDubboUriAndSetBase(RouteDefinition, LinkedHashMap)} + * @param filters List<{@link FilterDefinition}> 过滤器列表 + * @param iter dubbo.routes.filters * @param yamlField 根据域的key 获取 filters 字符串列 */ @SuppressWarnings("unchecked") private void parseAndAddDubboFilters(String dubboUri, List filters, LinkedHashMap> iter, String yamlField) { List filtersYaml = iter.get(yamlField); - + filters.addAll(defaultFilters); if (filtersYaml != null) { for (Object filterObject : filtersYaml) { // 现阶段只支持两种情况 - if(filterObject.getClass() == String.class) { - String filterString = (String)filterObject; + if (filterObject.getClass() == String.class) { + String filterString = (String) filterObject; FilterDefinition fd = new FilterDefinition(filterString); log.info(fd.getName()); if (!fd.getName().equals("Dubbo")) { filters.add(fd); } } else if (filterObject.getClass() == LinkedHashMap.class) { - Map filterMap = (LinkedHashMap)filterObject; + Map filterMap = (LinkedHashMap) filterObject; FilterDefinition fd = new FilterDefinition(); - - fd.setName((String)filterMap.get("name")); - if(filterMap.containsKey("args")) { + + fd.setName((String) filterMap.get("name")); + if (filterMap.containsKey("args")) { Object args = filterMap.get("args"); - for( Entry kv : ((Map)args).entrySet()) { - if(kv.getValue().getClass() != String.class) { - kv.setValue( String.valueOf(kv.getValue())); + for (Entry kv : ((Map) args).entrySet()) { + if (kv.getValue().getClass() != String.class) { + kv.setValue(String.valueOf(kv.getValue())); } } - fd.setArgs((Map)args); + fd.setArgs((Map) args); } - + log.info(fd.getName()); if (!fd.getName().equals("Dubbo")) { filters.add(fd); diff --git a/usergw-service/src/main/java/cn/ecpark/service/usergw/config/bean/ConfigBean.java b/usergw-service/src/main/java/cn/ecpark/service/usergw/config/bean/ConfigBean.java index 3fae651..bb3774e 100644 --- a/usergw-service/src/main/java/cn/ecpark/service/usergw/config/bean/ConfigBean.java +++ b/usergw-service/src/main/java/cn/ecpark/service/usergw/config/bean/ConfigBean.java @@ -6,6 +6,7 @@ import org.springframework.stereotype.Component; import cn.ecpark.service.usergw.biz.filters.bean.GenericServicePool; import cn.ecpark.service.usergw.biz.filters.factory.DubboGatewayFilterFactory; +import cn.ecpark.service.usergw.config.ConfigApollo; import reactor.core.publisher.Mono; @Component @@ -24,4 +25,11 @@ public class ConfigBean { KeyResolver ipResolver() { return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostString()); } + + @Bean + ConfigApollo configApollo() { + ConfigApollo ca = new ConfigApollo(); + + return ca; + } } \ No newline at end of file diff --git a/usergw-service/src/main/resources/application.properties b/usergw-service/src/main/resources/application.properties index adfa478..bb2bb48 100644 --- a/usergw-service/src/main/resources/application.properties +++ b/usergw-service/src/main/resources/application.properties @@ -1,8 +1,16 @@ spring.application.name=gateway -app.id=gateway -apollo.meta=http://127.0.0.1:8180 +# app.id=gateway +# apollo.meta=http://localhost:8180 +# local.meta=http://localhost:8180 +# dev.meta=http://localhost:8180 +# fat.meta=http://localhost:8180 +# uat.meta=http://localhost:8180 +# lpt.meta=http://localhost:8180 +# pro.meta=http://localhost:8180 +# eureka.instance.ip-address=http://localhost:8180 + dubbo.scan.base-packages=cn.ecpark.service.usergw.impl dubbo.protocol.name=dubbo @@ -14,7 +22,6 @@ server.port=8888 # logging.level.org.springframework.cloud.gateway=debug logging.file=logs/log - yame.config=gateway.yaml