Nacos和Gateway实现动态路由

gateway实现动态路由主要有两种方式,这里只讲其中一种方式:写一个实现RouteDefinitionRepository接口的类,然后注入到spring当中

@Component
public class CustomRouteDefinitionRepository implements RouteDefinitionRepository, ApplicationEventPublisherAware {

    @Value("${nacos.config.namespace}")
    private String namespace;

    @Value("${nacos.config.server-addr}")
    private String serverAddr;

    @Autowired
    ObjectMapper objectMapper;

    private List<RouteDefinition> routeDefinitionList;

    private ApplicationEventPublisher applicationEventPublisher;

    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        this.applicationEventPublisher = applicationEventPublisher;
    }

    /**
     * 在项目启动时从nacos读出配置
     */
    @SneakyThrows
    @PostConstruct
    public void getNacosConfig() {
        Properties properties = new Properties();
        properties.put(PropertyKeyConst.NAMESPACE, namespace);
        properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);
        ConfigService configService = NacosFactory.createConfigService(properties);
        String json = configService.getConfig("test", "CUSTOME", 30000);
        this.routeDefinitionList = JSON.parseArray(json, RouteDefinition.class);
    }

    /**
     * 监听nacos配置变化,然后更新路由
     * @param json
     */
    @SneakyThrows
    @NacosConfigListener(groupId = "CUSTOME", type = ConfigType.JSON, dataId = "test")
    public void configChangeListener(String json) {
        System.out.println(json);
        System.out.println("发布事件让gateway更新路由");
        this.routeDefinitionList = JSON.parseArray(json, RouteDefinition.class);
        this.applicationEventPublisher.publishEvent(new RefreshRoutesEvent(this));
    }

    @SneakyThrows
    @Override
    public Flux<RouteDefinition> getRouteDefinitions() {
        System.out.println("**************");
        System.out.println("getRouteDefinitions");
        System.out.println(routeDefinitionList);
        System.out.println("**************");
        return Flux.fromIterable(routeDefinitionList);
    }

    @Override
    public Mono<Void> save(Mono<RouteDefinition> route) {
        return null;
    }

    @Override
    public Mono<Void> delete(Mono<String> routeId) {
        return null;
    }
}

其中实现ApplicationEventPublisherAware这个接口是为了获得ApplicationEventPublisher的对象,用来发送路由更新的事件。

RouteDefinitionRepository接口有三个方法getRouteDefinitions,save, delete。RouteDefinitionRepository接口又继承了RouteDefinitionLocator和RouteDefinitionWriter两个接口。
save和delete是属于RouteDefinitionWriter接口的,用来修改路由的。getRouteDefinitions方法是属于RouteDefinitionLocator接口的,用来获取路由的。由于我把监听nacos配置变化的方法写到了这个类里,所以我就没有重写save和delete这两个方法,直接就在configChangeListener方法里将路由改变了,然后发送路由更新事件,让gateway更新路由,然后会执行该对象的getRouteDefinitions方法来获取新的路由

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值