SpringCloud-Gateway路由动态配置Nacos实现

  1. 编写配置类

    java 复制代码
    @Component
    public class NacosConfig {
        public static String GROUP_ID ;
        public static String DATA_ID ;
        @Value("${nacos.gateway.route.config.group}")
        public void setGroupId(String groupId){
            GROUP_ID = groupId ;
        }
        @Value("${nacos.gateway.route.config.data-id}")
        public void setDataId(String dataId){
            DATA_ID = dataId ;
        }
    }
  2. properties添加配置

    properties 复制代码
    nacos.gateway.route.config.group=DEFAULT_GROUP
    nacos.gateway.route.config.data-id=hello-gateway-router.json
  3. 自定义RouteDefinitionLocator

    java 复制代码
    @Slf4j
    @Component
    public class NcosRouteDefinitionLocator implements RouteDefinitionLocator, InitializingBean {
        private volatile List<RouteDefinition> routeDefinitions = new CopyOnWriteArrayList<>() ;
        @Autowired
        private NacosConfigManager nacosConfigManager ;
        @Autowired
        private ObjectMapper objectMapper ;
        @Autowired
        private ApplicationEventPublisher eventPublisher ;
        private ConfigService configService ;
        @Override
        public Flux<RouteDefinition> getRouteDefinitions() {
            return Flux.fromIterable(routeDefinitions);
        }
        @Override
        public void afterPropertiesSet() throws Exception {
            // 从nacos获取routDefinition
            configService = nacosConfigManager.getConfigService();
            // 读取配置并装载
            this.initNacosConfig();
            // 添加listener,当数据变化时接收通知
            this.initNacosListener();
        }
        private void initNacosConfig(){
            try {
                String content = configService.getConfig(
                        NacosConfig.DATA_ID,
                        NacosConfig.GROUP_ID,
                        3000L
                );
                CollectionType collectionType = objectMapper.getTypeFactory()
                        .constructCollectionType(ArrayList.class, RouteDefinition.class);
                routeDefinitions = objectMapper.readValue(content, collectionType);
            }catch (NacosException e){
                log.info("nacos config NacosException ", e);
            } catch (JsonProcessingException e) {
                log.info("nacos config JsonProcessingException ", e);
            }
        }
        private void initNacosListener() throws NacosException {
            configService.addListener(
                    NacosConfig.DATA_ID,
                    NacosConfig.GROUP_ID,
                    new DataChangeListener());
        }
        class DataChangeListener implements Listener{
    
            @Override
            public Executor getExecutor() {
                return null;
            }
            @Override
            public void receiveConfigInfo(String content) {
                try {
                    log.info("gateway config change : {}", content);
                    CollectionType collectionType = objectMapper.getTypeFactory()
                            .constructCollectionType(ArrayList.class, RouteDefinition.class);
                    routeDefinitions = objectMapper.readValue(content, collectionType);
                    // 当数据发生变化后发布刷新事件,通知CachingRouteLocator需要重新加载route定义
                    eventPublisher.publishEvent(new RefreshRoutesEvent(content));
                }catch (JsonProcessingException e) {
                    log.info("nacos config JsonProcessingException ", e);
                }
            }
        }
    }
  4. 编写GatewayDynamicConfiguration配置类

    java 复制代码
    @Configuration
    public class GatewayDynamicConfiguration {
        @Bean
        @ConditionalOnProperty(value = "spring.cloud.gateway.dynamic.config.enable", matchIfMissing = true)
        public NacosRouteDefinitionLocator routeDefinitionLocator(){
            return new NacosRouteDefinitionLocator() ;
        }
    }
相关推荐
w***37512 分钟前
SpringBoot【实用篇】- 测试
java·spring boot·后端
q***614124 分钟前
Java实战:Spring Boot实现WebSocket实时通信
java·spring boot·websocket
k***825125 分钟前
Ubuntu介绍、与centos的区别、基于VMware安装Ubuntu Server 22.04、配置远程连接、安装jdk+Tomcat
java·ubuntu·centos
2301_8156864532 分钟前
extern
java·开发语言
q***563835 分钟前
Java进阶-SPI机制
java·开发语言
曾经的三心草1 小时前
基于正倒排索引的Java文档搜索引擎2-实现Index类
java·python·搜索引擎
JienDa1 小时前
JienDa聊PHP:CSDN博客仿站实战中PHP框架的协同架构方略
java·架构·php
大迪吃小迪2 小时前
每秒 400 请求场景下,线程池如何合理配置?
java·开发语言
踏浪无痕2 小时前
手写Spring事务框架:200行代码揭开@Transactional的神秘面纱( 附完整源代码)
spring boot·spring·spring cloud