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 29b700b..296de96 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 @@ -2,36 +2,60 @@ package cn.ecpark.service.usergw.config; import java.io.InputStream; import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.net.URI; import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; 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.filter.NettyWriteResponseFilter; +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.http.MediaType; import org.springframework.stereotype.Component; +import org.springframework.stereotype.Controller; +import org.springframework.util.ReflectionUtils; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.reactive.config.WebFluxConfigurationSupport; +import org.springframework.web.reactive.result.method.RequestMappingInfo; +import org.springframework.web.reactive.result.method.annotation.RequestMappingHandlerMapping; import org.yaml.snakeyaml.Yaml; +import cn.ecpark.service.usergw.impl.http.Http2Dubbo; +import cn.ecpark.service.usergw.utils.Convert; import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Flux; +import reactor.netty.http.server.HttpServerRequest; +import reactor.netty.http.server.HttpServerResponse; /** * ConfigGateway */ @Component +@Controller @Slf4j public class ConfigGateway implements RouteDefinitionLocator { - List mediaTypes = new ArrayList<>(); + // List mediaTypes = new ArrayList<>(); + + @Autowired + private ApplicationContext applicationContext; + + @Autowired + private Http2Dubbo http2Dubbo; @Override - public Flux getRouteDefinitions() { - + public Flux getRouteDefinitions() { + // WebFluxConfigurationSupport a; + Object inputStream = null; String[] gatewayConfigPathList = { "gateway.yml", "gateway.yaml", "Gateway.yml", "Gateway.yaml" }; for (String gatewayConfigPath : gatewayConfigPathList) { @@ -62,11 +86,113 @@ public class ConfigGateway implements RouteDefinitionLocator { Map configDefault = (Map) configYaml.get("default"); Map configDubbo = (Map) configYaml.get("dubbo"); - // ConfigProperties.createHttp2Dubbo(configDubbo); - return Flux.fromIterable(ConfigProperties.getConfigDefault(configDefault)); + this.createHttp2Dubbo(configDubbo); + return Flux.fromIterable(this.getConfigDefault(configDefault)); } } return null; // return Flux.fromIterable(it); } + + private List getConfigDefault(Map configDefault) { + if (configDefault != null) { + List RDList = new ArrayList<>(); + + List filters = new ArrayList<>(); + List predicates = new ArrayList<>(); + + // default-filters: 下的相关设置 + Object unknownDefaultFilters = configDefault.get("default-filters"); + if (unknownDefaultFilters != null) { + List defaultFiltersYaml = (ArrayList) unknownDefaultFilters; + for (String filterString : defaultFiltersYaml) { + filters.add(new FilterDefinition(filterString)); + } + } + + Object unknownRoutes = configDefault.get("routes"); + if (unknownRoutes != null) { + List routes = (ArrayList) unknownRoutes; + for (LinkedHashMap iter : routes) { + RouteDefinition rd = new RouteDefinition(); + // 设置id + Object id = iter.get("id"); + if (id != null) { + rd.setId((String) id); + } + + // 设置uri + Object uri = iter.get("uri"); + if (uri != null) { + rd.setUri(URI.create((String) uri)); + } + + // 设置uri + Object order = iter.get("order"); + if (order != null) { + rd.setOrder((int) order); + } + + // predicates: 下的相关属性 + List unknownPredicatesYaml = (ArrayList) iter.get("predicates"); + if (unknownPredicatesYaml != null) { + List predicatesYaml = (ArrayList) unknownPredicatesYaml; + for (String predicateString : predicatesYaml) { + predicates.add(new PredicateDefinition(predicateString)); + } + } + + // filters: 下的相关属性 + List unknownFiltersYaml = (ArrayList) iter.get("filters"); + if (unknownFiltersYaml != null) { + List filtersYaml = (ArrayList) unknownFiltersYaml; + for (String filterString : filtersYaml) { + filters.add(new FilterDefinition(filterString)); + } + } + + rd.setPredicates(predicates); + rd.setFilters(filters); + + RDList.add(rd); + } + + return RDList; + } + } + + return null; + } + + private void createHttp2Dubbo(Map configDubbo) { + + try { + RequestMappingHandlerMapping requestMapping = (RequestMappingHandlerMapping) applicationContext.getBean("requestMappingHandlerMapping"); + + // Method targetMethod = ReflectionUtils.findMethod(Http2Dubbo.class, "H2DTest", HttpServerRequest.class, HttpServerResponse.class); // 找到处理该路由的方法 + requestMapping.registerMapping(RequestMappingInfo.paths("/test/xixi").methods(RequestMethod.POST).build(), + http2Dubbo, Http2Dubbo.class.getDeclaredMethod("H2DTest")); + + // 引用远程服务 + // try { + // ReferenceConfig reference = new ReferenceConfig(); // 该实例很重量,里面封装了所有与注册中心及服务提供方连接,请缓存 + + // reference.setInterface("com.xxx.XxxService"); // 弱类型接口名 + // reference.setVersion("2.0.0"); + // reference.setGeneric(true); // 声明为泛化接口 + // GenericService gs = reference.get(); + + } catch (Exception e) { + // TODO: 任何错误都直接终止退出 + SpringApplication.exit(applicationContext); + } + + // gs.$invoke(method, parameterTypes, args) + + } + + private static void callMethod(ReferenceConfig ref, String name, String params) throws Exception { + Method method = ref.getClass().getMethod("set" + Convert.firstUpperCase(name)); + method.invoke(ref, method.getParameterTypes(), params); + } } \ No newline at end of file diff --git a/usergw-service/src/main/java/cn/ecpark/service/usergw/config/ConfigProperties.java b/usergw-service/src/main/java/cn/ecpark/service/usergw/config/ConfigProperties.java deleted file mode 100644 index e997ed8..0000000 --- a/usergw-service/src/main/java/cn/ecpark/service/usergw/config/ConfigProperties.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright 2013-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cn.ecpark.service.usergw.config; - -import java.lang.reflect.Method; -import java.net.URI; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -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.context.ApplicationContext; -import org.springframework.util.ReflectionUtils; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.reactive.result.condition.PatternsRequestCondition; -import org.springframework.web.reactive.result.condition.RequestMethodsRequestCondition; -import org.springframework.web.reactive.result.method.RequestMappingInfo; -import org.springframework.web.reactive.result.method.annotation.RequestMappingHandlerMapping; -import org.springframework.web.util.pattern.PathPattern; -import org.springframework.web.util.pattern.PathPatternParser; - -import cn.ecpark.service.usergw.impl.http.Http2Dubbo; -import cn.ecpark.service.usergw.utils.Convert; -import lombok.extern.slf4j.Slf4j; - -/** - * ConfigProperties - */ -@Validated -@Slf4j -public class ConfigProperties { - - @Autowired - private static ApplicationContext applicationContext; - - @Autowired - private static RequestMappingHandlerMapping requestMapping; - - public static List getConfigDefault(Map configDefault) { - if (configDefault != null) { - List RDList = new ArrayList<>(); - - List filters = new ArrayList<>(); - List predicates = new ArrayList<>(); - - // default-filters: 下的相关设置 - Object unknownDefaultFilters = configDefault.get("default-filters"); - if (unknownDefaultFilters != null) { - List defaultFiltersYaml = (ArrayList) unknownDefaultFilters; - for (String filterString : defaultFiltersYaml) { - filters.add(new FilterDefinition(filterString)); - } - } - - Object unknownRoutes = configDefault.get("routes"); - if (unknownRoutes != null) { - List routes = (ArrayList) unknownRoutes; - for (LinkedHashMap iter : routes) { - RouteDefinition rd = new RouteDefinition(); - // 设置id - Object id = iter.get("id"); - if (id != null) { - rd.setId((String) id); - } - - // 设置uri - Object uri = iter.get("uri"); - if (uri != null) { - rd.setUri(URI.create((String) uri)); - } - - // 设置uri - Object order = iter.get("order"); - if (order != null) { - rd.setOrder((int) order); - } - - // predicates: 下的相关属性 - List unknownPredicatesYaml = (ArrayList) iter.get("predicates"); - if (unknownPredicatesYaml != null) { - List predicatesYaml = (ArrayList) unknownPredicatesYaml; - for (String predicateString : predicatesYaml) { - predicates.add(new PredicateDefinition(predicateString)); - } - } - - // filters: 下的相关属性 - List unknownFiltersYaml = (ArrayList) iter.get("filters"); - if (unknownFiltersYaml != null) { - List filtersYaml = (ArrayList) unknownFiltersYaml; - for (String filterString : filtersYaml) { - filters.add(new FilterDefinition(filterString)); - } - } - - rd.setPredicates(predicates); - rd.setFilters(filters); - - RDList.add(rd); - } - - return RDList; - } - } - - return null; - } - - private static void callMethod(ReferenceConfig ref, String name, String params) throws Exception { - Method method = ref.getClass().getMethod("set" + Convert.firstUpperCase(name)); - method.invoke(ref, method.getParameterTypes(), params); - } - - public static void createHttp2Dubbo(Map configDubbo) { - - - Method targetMethod = ReflectionUtils.findMethod(Http2Dubbo.class, "12"); // 找到处理该路由的方法 - requestMapping.registerMapping(RequestMappingInfo.paths("/test/xixi").methods(RequestMethod.POST).build(), - applicationContext, - targetMethod); - - // 引用远程服务 - try { - ReferenceConfig reference = new ReferenceConfig(); // 该实例很重量,里面封装了所有与注册中心及服务提供方连接,请缓存 - - reference.setInterface("com.xxx.XxxService"); // 弱类型接口名 - reference.setVersion("2.0.0"); - reference.setGeneric(true); // 声明为泛化接口 - GenericService gs = reference.get(); - - } catch (Exception e) { - //TODO: 任何错误都直接终止退出 - SpringApplication.exit(applicationContext); - } - - // gs.$invoke(method, parameterTypes, args) - - } -} diff --git a/usergw-service/src/main/java/cn/ecpark/service/usergw/impl/http/Http2Dubbo.java b/usergw-service/src/main/java/cn/ecpark/service/usergw/impl/http/Http2Dubbo.java index af78223..3e74c43 100644 --- a/usergw-service/src/main/java/cn/ecpark/service/usergw/impl/http/Http2Dubbo.java +++ b/usergw-service/src/main/java/cn/ecpark/service/usergw/impl/http/Http2Dubbo.java @@ -1,12 +1,23 @@ package cn.ecpark.service.usergw.impl.http; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; /** * Http2Dubbo */ -@RestController +@Controller public class Http2Dubbo { - + + @ResponseBody + public String H2DTest() { + + //Do clever stuff here + return "123"; + // return new ResponseEntity<>(HttpStatus.OK); + } } \ 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 2a37469..4eef7c2 100644 --- a/usergw-service/src/main/resources/gateway.yaml +++ b/usergw-service/src/main/resources/gateway.yaml @@ -14,5 +14,5 @@ dubbo: - id: test path: /dubbo/hello interface: com.xxx.xxx - version: 1 + version: 2.0.0 \ No newline at end of file