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() ;
        }
    }
相关推荐
山北雨夜漫步几秒前
LangGraph
java·前端·算法
Jul1en_7 分钟前
【SpringCloud】Eureka、Nacos 简单概念笔记
笔记·spring cloud·eureka
jakeswang11 分钟前
【AI面经】大模型半夜发短信骂客户?Agent 工具调用失控,你如何设计防护机制?
java·后端
码上小翔哥34 分钟前
Spring Boot Redis 缓存序列化踩坑记:GenericJackson2JsonRedisSerializer 的数组反序列化陷阱
java·redis
pq21734 分钟前
LambdaMetafactory(fastjson2使用的黑科技)
java
SamDeepThinking37 分钟前
你认为从0-1开发一个项目最难的地方是什么?
java·后端·架构
Devin~Y41 分钟前
大厂Java面试实战:Spring Boot/Cloud、Redis/Kafka、JVM调优与Spring AI RAG(内容社区UGC+AIGC客服场景)
java·jvm·spring boot·redis·spring cloud·kafka·mybatis
青山师1 小时前
CompletableFuture深度解析:异步编程范式与源码实现
java·单例模式·面试·性能优化·并发编程
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题 第42题】【JVM篇】第2题:JVM内存模型有哪些组成部分?
java·开发语言·jvm·面试
文慧的科技江湖1 小时前
零碳园区综合管理平台PRD需求文档 - 慧知开源充电桩平台
spring cloud·微服务·开源·能源·慧知开源光储充管理平台·慧知开源光储充管理系统·零碳园区管理平台