浏览代码

网关动态路由

by su 3 年之前
父节点
当前提交
9a654d0cab

+ 6 - 0
4dkankan-center-scene/src/main/java/com/fdkankan/scene/config/ExceptionConfig.java

@@ -1,6 +1,7 @@
 package com.fdkankan.scene.config;
 
 import com.fdkankan.common.exception.GlobalExceptionHandler;
+import com.fdkankan.common.response.ResultEnhanceAdvice;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
@@ -12,5 +13,10 @@ public class ExceptionConfig {
         return new GlobalExceptionHandler();
     }
 
+    @Bean
+    public ResultEnhanceAdvice resultEnhanceAdvice(){
+        return new ResultEnhanceAdvice();
+    }
+
 
 }

+ 38 - 0
4dkankan-common/src/main/java/com/fdkankan/common/response/ResultEnhanceAdvice.java

@@ -0,0 +1,38 @@
+package com.fdkankan.common.response;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.MethodParameter;
+import org.springframework.http.MediaType;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.server.ServerHttpRequest;
+import org.springframework.http.server.ServerHttpResponse;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
+
+@ControllerAdvice
+public class ResultEnhanceAdvice implements ResponseBodyAdvice<Object> {
+
+    @Autowired
+    private ResultData resultData;
+
+    @Override
+    public boolean supports(MethodParameter returnType,
+                            Class<? extends HttpMessageConverter<?>> converterType) {
+
+        //true 转换 false 不转换
+        Class<?> returnType1 = returnType.getMethod().getReturnType();
+        String returnTypeName = returnType1.getName();
+        return !returnTypeName.equals(ResultData.class.getName());
+    }
+
+    @Override
+    public Object beforeBodyWrite(Object body,
+                                  MethodParameter returnType,
+                                  MediaType selectedContentType,
+                                  Class<? extends HttpMessageConverter<?>> selectedConverterType,
+                                  ServerHttpRequest request,
+                                  ServerHttpResponse response) {
+
+        return resultData.ok(body);
+    }
+}

+ 111 - 111
4dkankan-gateway/src/main/java/com/fdkankan/gateway/config/DynamicRouteServiceImpl.java

@@ -1,111 +1,111 @@
-package com.fdkankan.gateway.config;
-
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.cloud.gateway.event.RefreshRoutesEvent;
-import org.springframework.cloud.gateway.route.RouteDefinition;
-import org.springframework.cloud.gateway.route.RouteDefinitionLocator;
-import org.springframework.cloud.gateway.route.RouteDefinitionWriter;
-import org.springframework.context.ApplicationEventPublisher;
-import org.springframework.context.ApplicationEventPublisherAware;
-import org.springframework.stereotype.Service;
-import org.springframework.util.CollectionUtils;
-import reactor.core.publisher.Mono;
-
-import java.util.List;
-
-/**
- * 动态更新路由网关service
- * 1)实现一个Spring提供的事件推送接口ApplicationEventPublisherAware
- * 2)提供动态路由的基础方法,可通过获取bean操作该类的方法。该类提供新增路由、更新路由、删除路由,然后实现发布的功能。
- */
-@Slf4j
-@Service
-public class DynamicRouteServiceImpl implements ApplicationEventPublisherAware {
-    @Autowired
-    private RouteDefinitionWriter routeDefinitionWriter;
-    @Autowired
-    private RouteDefinitionLocator routeDefinitionLocator;
-
-    /**
-     * 发布事件
-     */
-    @Autowired
-    private ApplicationEventPublisher publisher;
-
-    @Override
-    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
-        this.publisher = applicationEventPublisher;
-    }
-
-    /**
-     * 删除路由
-     * @param id
-     * @return
-     */
-    public String delete(String id) {
-        try {
-            log.info("gateway delete route id {}",id);
-            this.routeDefinitionWriter.delete(Mono.just(id)).subscribe();
-            this.publisher.publishEvent(new RefreshRoutesEvent(this));
-            return "delete success";
-        } catch (Exception e) {
-            return "delete fail";
-        }
-    }
-
-    /**
-     * 更新路由
-     * @param definitions
-     * @return
-     */
-    public String updateList(List<RouteDefinition> definitions) {
-        log.info("gateway update route {}",definitions);
-        // 删除缓存routerDefinition
-        List<RouteDefinition> routeDefinitionsExits =  routeDefinitionLocator.getRouteDefinitions().buffer().blockFirst();
-        if (!CollectionUtils.isEmpty(routeDefinitionsExits)) {
-            routeDefinitionsExits.forEach(routeDefinition -> {
-                log.info("delete routeDefinition:{}", routeDefinition);
-                delete(routeDefinition.getId());
-            });
-        }
-        definitions.forEach(definition -> {
-            updateById(definition);
-        });
-        return "success";
-    }
-
-    /**
-     * 更新路由
-     * @param definition
-     * @return
-     */
-    public String updateById(RouteDefinition definition) {
-        try {
-            log.info("gateway update route {}",definition);
-            this.routeDefinitionWriter.delete(Mono.just(definition.getId()));
-        } catch (Exception e) {
-            return "update fail,not find route  routeId: "+definition.getId();
-        }
-        try {
-            routeDefinitionWriter.save(Mono.just(definition)).subscribe();
-            this.publisher.publishEvent(new RefreshRoutesEvent(this));
-            return "success";
-        } catch (Exception e) {
-            return "update route fail";
-        }
-    }
-
-    /**
-     * 增加路由
-     * @param definition
-     * @return
-     */
-    public String add(RouteDefinition definition) {
-        log.info("gateway add route {}",definition);
-        routeDefinitionWriter.save(Mono.just(definition)).subscribe();
-        this.publisher.publishEvent(new RefreshRoutesEvent(this));
-        return "success";
-    }
-}
-
+//package com.fdkankan.gateway.config;
+//
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.cloud.gateway.event.RefreshRoutesEvent;
+//import org.springframework.cloud.gateway.route.RouteDefinition;
+//import org.springframework.cloud.gateway.route.RouteDefinitionLocator;
+//import org.springframework.cloud.gateway.route.RouteDefinitionWriter;
+//import org.springframework.context.ApplicationEventPublisher;
+//import org.springframework.context.ApplicationEventPublisherAware;
+//import org.springframework.stereotype.Service;
+//import org.springframework.util.CollectionUtils;
+//import reactor.core.publisher.Mono;
+//
+//import java.util.List;
+//
+///**
+// * 动态更新路由网关service
+// * 1)实现一个Spring提供的事件推送接口ApplicationEventPublisherAware
+// * 2)提供动态路由的基础方法,可通过获取bean操作该类的方法。该类提供新增路由、更新路由、删除路由,然后实现发布的功能。
+// */
+//@Slf4j
+//@Service
+//public class DynamicRouteServiceImpl implements ApplicationEventPublisherAware {
+//    @Autowired
+//    private RouteDefinitionWriter routeDefinitionWriter;
+//    @Autowired
+//    private RouteDefinitionLocator routeDefinitionLocator;
+//
+//    /**
+//     * 发布事件
+//     */
+//    @Autowired
+//    private ApplicationEventPublisher publisher;
+//
+//    @Override
+//    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
+//        this.publisher = applicationEventPublisher;
+//    }
+//
+//    /**
+//     * 删除路由
+//     * @param id
+//     * @return
+//     */
+//    public String delete(String id) {
+//        try {
+//            log.info("gateway delete route id {}",id);
+//            this.routeDefinitionWriter.delete(Mono.just(id)).subscribe();
+//            this.publisher.publishEvent(new RefreshRoutesEvent(this));
+//            return "delete success";
+//        } catch (Exception e) {
+//            return "delete fail";
+//        }
+//    }
+//
+//    /**
+//     * 更新路由
+//     * @param definitions
+//     * @return
+//     */
+//    public String updateList(List<RouteDefinition> definitions) {
+//        log.info("gateway update route {}",definitions);
+//        // 删除缓存routerDefinition
+//        List<RouteDefinition> routeDefinitionsExits =  routeDefinitionLocator.getRouteDefinitions().buffer().blockFirst();
+//        if (!CollectionUtils.isEmpty(routeDefinitionsExits)) {
+//            routeDefinitionsExits.forEach(routeDefinition -> {
+//                log.info("delete routeDefinition:{}", routeDefinition);
+//                delete(routeDefinition.getId());
+//            });
+//        }
+//        definitions.forEach(definition -> {
+//            updateById(definition);
+//        });
+//        return "success";
+//    }
+//
+//    /**
+//     * 更新路由
+//     * @param definition
+//     * @return
+//     */
+//    public String updateById(RouteDefinition definition) {
+//        try {
+//            log.info("gateway update route {}",definition);
+//            this.routeDefinitionWriter.delete(Mono.just(definition.getId()));
+//        } catch (Exception e) {
+//            return "update fail,not find route  routeId: "+definition.getId();
+//        }
+//        try {
+//            routeDefinitionWriter.save(Mono.just(definition)).subscribe();
+//            this.publisher.publishEvent(new RefreshRoutesEvent(this));
+//            return "success";
+//        } catch (Exception e) {
+//            return "update route fail";
+//        }
+//    }
+//
+//    /**
+//     * 增加路由
+//     * @param definition
+//     * @return
+//     */
+//    public String add(RouteDefinition definition) {
+//        log.info("gateway add route {}",definition);
+//        routeDefinitionWriter.save(Mono.just(definition)).subscribe();
+//        this.publisher.publishEvent(new RefreshRoutesEvent(this));
+//        return "success";
+//    }
+//}
+//

+ 99 - 99
4dkankan-gateway/src/main/java/com/fdkankan/gateway/config/DynamicRouteServiceImplByNacos.java

@@ -1,99 +1,99 @@
-package com.fdkankan.gateway.config;
-
-import com.alibaba.fastjson.JSON;
-import com.alibaba.nacos.api.NacosFactory;
-import com.alibaba.nacos.api.config.ConfigService;
-import com.alibaba.nacos.api.config.listener.Listener;
-import com.alibaba.nacos.api.exception.NacosException;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.cloud.gateway.route.RouteDefinition;
-import org.springframework.context.annotation.DependsOn;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.PostConstruct;
-import java.util.List;
-import java.util.Properties;
-import java.util.concurrent.Executor;
-
-/**
- *
- * 通过nacos下发动态路由配置,监听Nacos中gateway-route配置
- *
- */
-@Component
-@Slf4j
-@DependsOn({"gatewayConfig"}) // 依赖于gatewayConfig bean
-public class DynamicRouteServiceImplByNacos {
-
-    @Autowired
-    private DynamicRouteServiceImpl dynamicRouteService;
-
-
-    private ConfigService configService;
-
-    @PostConstruct
-    public void init() {
-        log.info("gateway route init...");
-        try{
-            configService = initConfigService();
-            if(configService == null){
-                log.warn("initConfigService fail");
-                return;
-            }
-            String configInfo = configService.getConfig(GatewayConfig.NACOS_ROUTE_DATA_ID, GatewayConfig.NACOS_ROUTE_GROUP, GatewayConfig.DEFAULT_TIMEOUT);
-            log.info("获取网关当前配置:\r\n{}",configInfo);
-            List<RouteDefinition> definitionList = JSON.parseArray(configInfo, RouteDefinition.class);
-            for(RouteDefinition definition : definitionList){
-                log.info("update route : {}",definition.toString());
-                dynamicRouteService.add(definition);
-            }
-        } catch (Exception e) {
-            log.error("初始化网关路由时发生错误",e);
-        }
-        dynamicRouteByNacosListener(GatewayConfig.NACOS_ROUTE_DATA_ID,GatewayConfig.NACOS_ROUTE_GROUP);
-    }
-
-    /**
-     * 监听Nacos下发的动态路由配置
-     * @param dataId
-     * @param group
-     */
-    public void dynamicRouteByNacosListener (String dataId, String group){
-        try {
-            configService.addListener(dataId, group, new Listener()  {
-                @Override
-                public void receiveConfigInfo(String configInfo) {
-                    log.info("进行网关更新:\n\r{}",configInfo);
-                    List<RouteDefinition> definitionList = JSON.parseArray(configInfo, RouteDefinition.class);
-                    log.info("update route : {}",definitionList.toString());
-                    dynamicRouteService.updateList(definitionList);
-                }
-                @Override
-                public Executor getExecutor() {
-                    log.info("getExecutor\n\r");
-                    return null;
-                }
-            });
-        } catch (NacosException e) {
-            log.error("从nacos接收动态路由配置出错!!!",e);
-        }
-    }
-
-    /**
-     * 初始化网关路由 nacos config
-     * @return
-     */
-    private ConfigService initConfigService(){
-        try{
-            Properties properties = new Properties();
-            properties.setProperty("serverAddr",GatewayConfig.NACOS_SERVER_ADDR);
-            properties.setProperty("namespace",GatewayConfig.NACOS_NAMESPACE);
-            return configService= NacosFactory.createConfigService(properties);
-        } catch (Exception e) {
-            log.error("初始化网关路由时发生错误",e);
-            return null;
-        }
-    }
-}
-
+//package com.fdkankan.gateway.config;
+//
+//import com.alibaba.fastjson.JSON;
+//import com.alibaba.nacos.api.NacosFactory;
+//import com.alibaba.nacos.api.config.ConfigService;
+//import com.alibaba.nacos.api.config.listener.Listener;
+//import com.alibaba.nacos.api.exception.NacosException;
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.cloud.gateway.route.RouteDefinition;
+//import org.springframework.context.annotation.DependsOn;
+//import org.springframework.stereotype.Component;
+//
+//import javax.annotation.PostConstruct;
+//import java.util.List;
+//import java.util.Properties;
+//import java.util.concurrent.Executor;
+//
+///**
+// *
+// * 通过nacos下发动态路由配置,监听Nacos中gateway-route配置
+// *
+// */
+//@Component
+//@Slf4j
+//@DependsOn({"gatewayConfig"}) // 依赖于gatewayConfig bean
+//public class DynamicRouteServiceImplByNacos {
+//
+//    @Autowired
+//    private DynamicRouteServiceImpl dynamicRouteService;
+//
+//
+//    private ConfigService configService;
+//
+//    @PostConstruct
+//    public void init() {
+//        log.info("gateway route init...");
+//        try{
+//            configService = initConfigService();
+//            if(configService == null){
+//                log.warn("initConfigService fail");
+//                return;
+//            }
+//            String configInfo = configService.getConfig(GatewayConfig.NACOS_ROUTE_DATA_ID, GatewayConfig.NACOS_ROUTE_GROUP, GatewayConfig.DEFAULT_TIMEOUT);
+//            log.info("获取网关当前配置:\r\n{}",configInfo);
+//            List<RouteDefinition> definitionList = JSON.parseArray(configInfo, RouteDefinition.class);
+//            for(RouteDefinition definition : definitionList){
+//                log.info("update route : {}",definition.toString());
+//                dynamicRouteService.add(definition);
+//            }
+//        } catch (Exception e) {
+//            log.error("初始化网关路由时发生错误",e);
+//        }
+//        dynamicRouteByNacosListener(GatewayConfig.NACOS_ROUTE_DATA_ID,GatewayConfig.NACOS_ROUTE_GROUP);
+//    }
+//
+//    /**
+//     * 监听Nacos下发的动态路由配置
+//     * @param dataId
+//     * @param group
+//     */
+//    public void dynamicRouteByNacosListener (String dataId, String group){
+//        try {
+//            configService.addListener(dataId, group, new Listener()  {
+//                @Override
+//                public void receiveConfigInfo(String configInfo) {
+//                    log.info("进行网关更新:\n\r{}",configInfo);
+//                    List<RouteDefinition> definitionList = JSON.parseArray(configInfo, RouteDefinition.class);
+//                    log.info("update route : {}",definitionList.toString());
+//                    dynamicRouteService.updateList(definitionList);
+//                }
+//                @Override
+//                public Executor getExecutor() {
+//                    log.info("getExecutor\n\r");
+//                    return null;
+//                }
+//            });
+//        } catch (NacosException e) {
+//            log.error("从nacos接收动态路由配置出错!!!",e);
+//        }
+//    }
+//
+//    /**
+//     * 初始化网关路由 nacos config
+//     * @return
+//     */
+//    private ConfigService initConfigService(){
+//        try{
+//            Properties properties = new Properties();
+//            properties.setProperty("serverAddr",GatewayConfig.NACOS_SERVER_ADDR);
+//            properties.setProperty("namespace",GatewayConfig.NACOS_NAMESPACE);
+//            return configService= NacosFactory.createConfigService(properties);
+//        } catch (Exception e) {
+//            log.error("初始化网关路由时发生错误",e);
+//            return null;
+//        }
+//    }
+//}
+//

+ 4 - 4
4dkankan-gateway/src/main/java/com/fdkankan/gateway/config/GatewayConfig.java

@@ -16,23 +16,23 @@ public class GatewayConfig {
 
     public static String NACOS_ROUTE_GROUP;
 
-    @Value("${spring.cloud.nacos.config.server-addr}")
+//    @Value("${spring.cloud.nacos.config.server-addr}")
 //    @Value("${custom.env}")
     public void setNacosServerAddr(String nacosServerAddr){
         NACOS_SERVER_ADDR = nacosServerAddr;
     }
 
-    @Value("${spring.cloud.nacos.config.namespace}")
+//    @Value("${spring.cloud.nacos.config.namespace}")
     public void setNacosNamespace(String nacosNamespace){
         NACOS_NAMESPACE = nacosNamespace;
     }
 
-    @Value("${nacos.gateway.route.config.data-id}")
+//    @Value("${nacos.gateway.route.config.data-id}")
     public void setNacosRouteDataId(String nacosRouteDataId){
         NACOS_ROUTE_DATA_ID = nacosRouteDataId;
     }
 
-    @Value("${nacos.gateway.route.config.group}")
+//    @Value("${nacos.gateway.route.config.group}")
     public void setNacosRouteGroup(String nacosRouteGroup){
         NACOS_ROUTE_GROUP = nacosRouteGroup;
     }

+ 1 - 9
4dkankan-gateway/src/main/resources/bootstrap-dev.yml

@@ -1,15 +1,7 @@
-server:
-  port: 8080
 spring:
   cloud:
     nacos:
       config:
         server-addr: 192.168.0.47:8848
         namespace: 4dkankan-dev
-
-nacos:
-  gateway:
-    route:
-      config:
-        data-id: route-center-scene
-        group: DEFAULT_GROUP
+        file-extension: yaml