我目前正在使用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();
}我可以在数据库中创建新的路由,但我无法即时刷新。
我需要了解如何动态刷新路由。
谢谢
发布于 2018-07-24 20:49:31
每当您希望动态更新路由时,发送一个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
发布于 2020-05-22 22:08:13
SCG(Spring Cloud Gateway)提供了RouteDefinitionRepository,您可以编写自己的RouteDefinitionRepository,并实现RouteDefinitionRepository覆盖getRouteDefinitions方法。
你可以参考这个类:InMemoryRouteDefinitionRepository
例如:
@Service
public class MongodbDefinitionRepository implements RouteDefinitionRepository {
@Autowired
private RouteConfigDao routeConfigDao;
@Override
public Flux<RouteDefinition> getRouteDefinitions() {
// todo
List<RouteDefinition> routeConfigs = routeConfigDao.findAll();
return Flux.fromIterable(routeConfigs);
}
@Override
public Mono<Void> save(Mono<RouteDefinition> route) {
return route.flatMap(routeDefinition -> {
// todo
return Mono.empty();
});
}
@Override
public Mono<Void> delete(Mono<String> routeId) {
return routeId.flatMap(id -> {
// todo
int delete = routeConfigDao.delete(routeId);
if (delete > 0) {
return Mono.empty();
}
return Mono.defer(() -> Mono.error(new Exception("delete route definition error, routeId:" + routeId)));
});
}
}如何在运行时刷新路由
把这个放到你的application.yml里
management:
endpoints:
web:
exposure:
include: gateway发布http://ip:port/actuator/gateway/refresh
@Service
public class MyPublishBiz implements ApplicationEventPublisherAware {
protected ApplicationEventPublisher publisher;
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher publisher) {
this.publisher = publisher;
}
public Mono<Void> refresh() {
this.publisher.publishEvent(new RefreshRoutesEvent(this));
return Mono.empty();
}
}发布于 2018-06-12 16:18:41
我很快就谈到了回购和开放问题。
目前看来,刷新路由的唯一方法是通过Actuator:
/actuator/gateway/refresh你可以在这里查看讨论:https://github.com/spring-cloud/spring-cloud-gateway/issues/43
https://stackoverflow.com/questions/50810765
复制相似问题