首页 > 解决方案 > 在数据库中持久化 Spring Cloud Gateway 路由

问题描述

我目前正在使用spring cloud gateway项目搭建简单的api网关,打算将路由持久化到mongodb中,然后刷新,这样新的路由就可以使用了。我做了这样简单的事情来从 mongo 获取我的路线。

@Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder){
    List<CreateAPIRequest> apiRequestList = repository.findAll();
    RouteLocatorBuilder.Builder routeLocator = builder.routes();
    for (CreateAPIRequest request: apiRequestList) {
        routeLocator
        .route(r-> {
              r.path("/"+request.getProxy().getListenPath())
             .filters(f->f.stripPrefix(1))
             .uri(request.getProxy().getTargetUrl()) 
        });
    }
    return routeLocator.build();
}

我能够在数据库中创建新路由,但无法即时刷新。

我需要了解如何即时刷新路线。

谢谢

标签: spring-bootspring-cloudspring-cloud-gateway

解决方案


每当您希望动态更新路由时,请发送 RefreshRoutesEvent。以下组件实现了事件发送功能。

@Component
public class GatewayRoutesRefresher implements ApplicationEventPublisherAware {

    ApplicationEventPublisher publisher;

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

    public void refreshRoutes() {
        publisher.publishEvent(new RefreshRoutesEvent(this));
    }
}

下面是一个示例,展示了如何使用上面的组件:

@Autowired
GatewayRoutesRefresher gatewayRoutesRefresher;
...
public void buildRoutes() {
    // build your routes basing on your db entries then refresh the routes in gateway
    ...
    gatewayRoutesRefresher.refreshRoutes();
}

您可以通过查看以下项目代码找到更完整的概念图:https ://github.com/botorabi/HomieCenter


推荐阅读