Parcourir la source

网关多环境配置
网关动态路由配置

by su il y a 3 ans
Parent
commit
be69b4ec21

+ 14 - 2
4dkankan-center-scene/src/main/java/com/fdkankan/scene/SceneApplication.java

@@ -1,10 +1,13 @@
 package com.fdkankan.scene;
 
+import com.fdkankan.common.exception.GlobalExceptionHandler;
+import com.fdkankan.common.response.ResultData;
 import com.fdkankan.scene.dto.TestDto;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.context.annotation.Bean;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
@@ -18,14 +21,23 @@ public class SceneApplication {
         SpringApplication.run(SceneApplication.class, args);
     }
 
+    /**
+     * 注入全局异常处理器
+     */
+    @Bean
+    public GlobalExceptionHandler globalExceptionHandler(){
+        return new GlobalExceptionHandler();
+    }
+
+
     @PostMapping("/test/test")
-    public TestDto test(@RequestBody TestDto test){
+    public ResultData test(@RequestBody TestDto test){
         System.out.println("进入了");
         if(test.getName().equals("aaa")){
 //            throw new BusinessException(1000,"asdfaswdfasdfsdf");
             int i = test.getId() / 0;
         }
-        return test;
+        return ResultData.ok(test);
     }
 
 }

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

@@ -1,16 +0,0 @@
-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;
-
-@Configuration
-public class ExceptionConfig {
-
-    @Bean
-    public GlobalExceptionHandler globalExceptionHandler(){
-        return new GlobalExceptionHandler();
-    }
-
-}

+ 17 - 1
4dkankan-gateway/src/main/java/com/fdkankan/gateway/GatewayApplication.java

@@ -1,16 +1,32 @@
 package com.fdkankan.gateway;
 
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
 
 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
 @EnableDiscoveryClient
+//@Controller
+@RefreshScope
 public class GatewayApplication {
 
     public static void main(String[] args) {
-        SpringApplication.run(GatewayApplication.class, args);
+        ConfigurableApplicationContext context = SpringApplication.run(GatewayApplication.class, args);
+            String test = context.getEnvironment().getProperty("foo.bar");
+            System.out.println(test);
     }
 
+//    @RequestMapping("/test/test")
+//    @ResponseBody
+//    public String test(){
+//        return fooBar;
+//    }
+
 }

+ 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";
+    }
+}
+

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

@@ -1,99 +1,98 @@
-//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 - 5
4dkankan-gateway/src/main/java/com/fdkankan/gateway/config/GatewayConfig.java

@@ -16,23 +16,22 @@ public class GatewayConfig {
 
     public static String NACOS_ROUTE_GROUP;
 
-//    @Value("${spring.cloud.nacos.config.server-addr}")
-//    @Value("${custom.env}")
+    @Value("${spring.cloud.nacos.config.server-addr}")
     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;
     }

+ 0 - 7
4dkankan-gateway/src/main/resources/bootstrap-dev.yml

@@ -1,7 +0,0 @@
-spring:
-  cloud:
-    nacos:
-      config:
-        server-addr: 192.168.0.47:8848
-        namespace: 4dkankan-dev
-        file-extension: yaml

+ 13 - 0
4dkankan-gateway/src/main/resources/bootstrap.yml

@@ -0,0 +1,13 @@
+server:
+  port: 8081
+spring:
+  application:
+    name: 4dkankan-gateway
+  cloud:
+    nacos:
+      config:
+        server-addr: 192.168.0.47:8848
+        file-extension: yaml
+        namespace: 4dkankan-dev
+      discovery:
+        server-addr: 192.168.0.47:8848

+ 0 - 25
4dkankan-gateway/src/main/resources/bootstrap.yml_bak

@@ -1,25 +0,0 @@
-server:
-  port: 8080
-spring:
-  application:
-    name: 4dkankan-gateway
-  cloud:
-    nacos:
-      discovery:
-        server-addr: 192.168.0.47:8848
-        namespace: bb2d9a01-711a-4f5e-b8ea-25ab821c145a
-      config:
-        namespace: bb2d9a01-711a-4f5e-b8ea-25ab821c145a
-        server-addr: 192.168.0.47:8848
-        file-extension: yml
-    data:
-
-      mongodb:
-      uri: "mongodb://localhost:27017/test"
-
-nacos:
-  gateway:
-    route:
-      config:
-        data-id: route-center-scene
-        group: DEFAULT_GROUP