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
POST http://ip:port/actuator/gateway/refresh
- 发布 RefreshRoutesEvent
@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();
}
}