spring-boot - 在数据库中持久化 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();
}
我能够在数据库中创建新路由,但无法即时刷新。
我需要了解如何即时刷新路线。
谢谢
解决方案
每当您希望动态更新路由时,请发送 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