当前位置: 首页 > 知识库问答 >
问题:

在运行时修改Spring Cloud网关路由

蔡明贤
2023-03-14

我想在服务器运行时在运行时添加或删除SpringCloudGateway路由。我正在使用Fluent Java Routes API初始化网关路由。这是完美的工作。

但是,现在我想在SpringCloudGateway服务器运行时修改、添加和删除路由。我可以看到RouteLocator包含我的路由,但我看不到修改其内容的方法。

尽管我看到一些在执行器中创建新路由的能力,但我需要使用Java代码而不是REST调用来添加它们。在我的设置中,RoutedDefinitionRepository是空的,所以我没有看到在我的用例中使用它的任何方法。

是否可以在SpringCloudGateway中仅使用Java代码在运行时修改路由?

共有2个答案

钱哲茂
2023-03-14

我做了一些类似于删除路由的事情,以隐藏网关的服务。尝试实例化自定义RouteLocator,如下面所示:

@Configuration
public class RouteConfiguration implements CommandLineRunner {

    final Logger LOGGER = LoggerFactory.getLogger(RouteConfiguration.class);

    @Value("${route.ignore.service-ids}")
    private String[] ignoreServiceIds;

    @Override
    public void run(String... args) throws Exception {

        if(ignoreServiceIds != null){
            for(String s: ignoreServiceIds){
                LOGGER.info("ServiceID ignored: {}",s);
            }
        }
    }

    @Bean
    @Primary
    @ConditionalOnMissingBean(name = "cachedCompositeRouteLocator")
    public RouteLocator cachedCompositeRouteLocator(List<RouteLocator> routeLocators) {

        return new CachingRouteLocator(new CustomCompositeRouteLocator(Flux.fromIterable(routeLocators), ignoreServiceIds));
    }
}

然后应用过滤器:

public class CustomCompositeRouteLocator implements RouteLocator {

    private final Flux<RouteLocator> delegates;
    private List<String> ignoredServiceIds;

    public CustomCompositeRouteLocator(Flux<RouteLocator> delegates, String[] ignoreServiceIds) {
        this.delegates = delegates;

        if(ignoreServiceIds != null && ignoreServiceIds.length>0)
            this.ignoredServiceIds = List.of(ignoreServiceIds);
    }

    @Override
    public Flux<Route> getRoutes() {

        if(ignoredServiceIds == null || ignoredServiceIds.isEmpty())
            return this.delegates.flatMapSequential(RouteLocator::getRoutes);
        return this.delegates.flatMapSequential(RouteLocator::getRoutes).filter(p->!ignoredServiceIds.contains(p.getUri().getHost()));
    }
}

在应用程序中。亚马尔

...
route:
  ignore:
    service-ids: MY_IGNORED_SERVICE_ID
...
景俊良
2023-03-14

改用Spring集成。您可以使用JavaDSL注册和删除集成流。https://docs.spring.io/spring-integration/docs/5.3.2.RELEASE/reference/html/dsl.html#java-dsl运行时流

 类似资料:
  • 问题内容: 我有一些人已经解决过的问题,但问题是我不了解我的实现中缺少什么。 我的hibernate代码的一部分如下: 问题是我想通过更改hibernate.connection.url属性中的“数据库”一词来选择要在运行时中使用的数据库。 在javaswing中,我正在实现此功能: } 然后,我用按钮检查所做的更改,从组合框中选择所需的数据库: 现在,debug1的输出正在更改,因此我在此打印中

  • 我在Spring框架中使用ehcache。我正在使用ehcache.xml初始化ehcache。然而,我想在运行时添加某些属性,如terracottaconfig。为此,我覆盖了类EhCacheManagerFactoryBean。目前,我正在覆盖这个类的方法getObject()(我不知道这是否是一个正确的覆盖,因为在使用ehcache.xml文件初始化类之前,调用了其他方法setResourc

  • 接口说明 如果已创建了飞行路径,而想修改飞行路径的相关信息,Wish3DEarth团队新增了修改飞行路线的接口,开发者可以通过该接口,来修改飞行路径的相关信息(名称、视点等)。 注意:vpIds如果不传,默认会将原有的视点置空 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 POST /api/flyline/1.0.0/update 是否需

  • 问题内容: 而且我正在尝试更改方法注释,但是java.lang.reflect.Method不包含任何地图字段(例如“ annotations”)或方法(例如“ getDeclaredAnnotationMap”) 只有但是我可以用这个字节数组做什么? 那么,如何修改方法的注释呢? 编辑: 我创建了:http : //pastebin.com/T2rewcwU 但是,仅编辑此方法实例,如果取消注释

  • 问题内容: 我们在模型pojos中的一些方法已被注释为: columnDefinition 属性取决于数据库供应商,因此在尝试使用Hibernate删除HSQLDB中的架构时会失败: 为了解决这个问题,我正在考虑这个解决方案(但不想花时间,如果不可能的话),在运行时,为每个方法列加注: 获取@Column批注 创建列注释的副本,使用javaassist将columnDefinition设置为nul

  • 我正在Eclipse JDT中开发一个项目,它对OSGI有可选的依赖性--也就是说,它支持作为OSGI包使用,如果它在OSGI环境中作为包使用,它还将引用OSGI中的一些类。 现在我想编写JUnit测试用例,既可以在OSGI内部运行,也可以在不运行OSGI的情况下运行,包含在两个不同的测试套件中。OSGI测试作为JUnit Pulg-in测试运行,而非OSGI测试应该作为普通JUnit测试运行。