首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Spring云网关路由持久化到数据库中

将Spring云网关路由持久化到数据库中
EN

Stack Overflow用户
提问于 2018-06-12 14:43:20
回答 4查看 3.7K关注 0票数 1

我目前正在使用spring cloud gateway项目构建简单的api网关,计划是在mongodb中持久化路由,然后刷新,这样新的路由就可以使用了。我做了一些简单的事情来从mongo得到我的路线。

代码语言:javascript
复制
@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();
}

我可以在数据库中创建新的路由,但我无法即时刷新。

我需要了解如何动态刷新路由。

谢谢

EN

回答 4

Stack Overflow用户

发布于 2018-07-24 20:49:31

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

代码语言:javascript
复制
@Component
public class GatewayRoutesRefresher implements ApplicationEventPublisherAware {

    ApplicationEventPublisher publisher;

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

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

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

代码语言:javascript
复制
@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

票数 5
EN

Stack Overflow用户

发布于 2020-05-22 22:08:13

SCG(Spring Cloud Gateway)提供了RouteDefinitionRepository,您可以编写自己的RouteDefinitionRepository,并实现RouteDefinitionRepository覆盖getRouteDefinitions方法。

你可以参考这个类:InMemoryRouteDefinitionRepository

例如:

代码语言:javascript
复制
@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)));
        });
    }
}

如何在运行时刷新路由

  1. 启用执行器

把这个放到你的application.yml

代码语言:javascript
复制
management:
  endpoints:
    web:
      exposure:
        include: gateway

发布http://ip:port/actuator/gateway/refresh

  1. 发布RefreshRoutesEvent

代码语言:javascript
复制
@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();
    }
}
票数 2
EN

Stack Overflow用户

发布于 2018-06-12 16:18:41

我很快就谈到了回购和开放问题。

目前看来,刷新路由的唯一方法是通过Actuator:

代码语言:javascript
复制
/actuator/gateway/refresh

你可以在这里查看讨论:https://github.com/spring-cloud/spring-cloud-gateway/issues/43

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50810765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档