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

如何在从zuul迁移到spring cloud gateway时“删除gobal前缀('/API'),然后转到lb://”

单于庆
2023-03-14
zuul: 
  prefix: /api

例如,org.springframework.cloud.gateway.discovery.DiscoveryClientRouteDefinitionLocator自动生成的路由

{
"route_id": "CompositeDiscoveryClient_APIGATEWAY",
"route_definition": {
  "id": "CompositeDiscoveryClient_APIGATEWAY",
  "predicates": [
    {
      "name": "Path",
      "args": {
        "pattern": "/apigateway/**"
      }
    }
  ],
  "filters": [
    {
      "name": "RewritePath",
      "args": {
        "regexp": "/apigateway/(?<remaining>.*)",
        "replacement": "/${remaining}"
      }
    }
  ],
  "uri": "lb://APIGATEWAY",
  "order": 0
}

我想要的是

 {
"route_id": "CompositeDiscoveryClient_APIGATEWAY",
"route_definition": {
  "id": "CompositeDiscoveryClient_APIGATEWAY",
  "predicates": [
    {
      "name": "Path",
      "args": {
        "pattern": "/api/apigateway/**"
      }
    }
  ],
  "filters": [
    {
      "name": "RewritePath",
      "args": {
        "regexp": "/api/apigateway/(?<remaining>.*)",
        "replacement": "/${remaining}"
      }
    }
  ],
  "uri": "lb://APIGATEWAY",
  "order": 0
}

如何配置路由以获得所需内容

    public static List<PredicateDefinition> initPredicates() {
    ArrayList<PredicateDefinition> definitions = new ArrayList<>();
    // TODO: add a predicate that matches the url at /serviceId?

    // add a predicate that matches the url at /serviceId/**
    PredicateDefinition predicate = new PredicateDefinition();
    predicate.setName(normalizeRoutePredicateName(PathRoutePredicateFactory.class));
    predicate.addArg(PATTERN_KEY, "'/'+serviceId+'/**'");
    definitions.add(predicate);
    return definitions;
}

“'/'+serviceid+'/**'”没有前缀

[2019-01-10]更新我认为@SpencerGibb的建议是一个很好的解决方案,但我有了新的麻烦,我尝试了许多方法:

args:
  regexp: "'/api/' + serviceId.toLowerCase() + '/(?<remaining>.*)'"
  replacement: '/${remaining}'
args:
  regexp: "'/api/' + serviceId.toLowerCase() + '/(?<remaining>.*)'"
  replacement: "'/${remaining}'"

启动失败

Origin: class path resource [application.properties]:23:70
Reason: Could not resolve placeholder 'remaining' in value "'${remaining}'"

当我使用转义“\”时,比如

args:
  regexp: "'/api/' + serviceId.toLowerCase() + '/(?<remaining>.*)'"
  replacement: '/$\{remaining}'

它开始成功了,但我在跑步时遇到了一个例外

org.springframework.expression.spel.SpelParseException: Expression [/$\{remaining}] @2: EL1065E: unexpected escape character.
at org.springframework.expression.spel.standard.Tokenizer.raiseParseException(Tokenizer.java:590) ~[spring-expression-5.0.5.RELEASE.jar:5.0.5.RELEASE]
at org.springframework.expression.spel.standard.Tokenizer.process(Tokenizer.java:265) ~[spring-expression-5.0.5.RELEASE.jar:5.0.5.RELEASE]
...    
@Override
        public GatewayFilter apply(Config config) {
            String replacement = config.replacement.replace("$\\", "$");
            return (exchange, chain) -> {
...

当谈到spelparseexception时,没有

共有1个答案

沈冠宇
2023-03-14

您可以通过属性自定义使用的自动筛选器和谓词。

spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
          predicates:
            - name: Path
              args:
                pattern: "'/api/'+serviceId.toLowerCase()+'/**'"
          filters:
            - name: RewritePath
              args:
                regexp: "'/api/' + serviceId.toLowerCase() + '/(?<remaining>.*)'"
                replacement: "'/${remaining}'"

注意这些值(例如args.patternargs.regexp)都是Spring Expression Language(SpEL)表达式,因此有单引号和+等。

如果不同的路由需要有不同的前缀,则需要在属性中定义每个路由。

 类似资料:
  • 问题内容: 我们试图从Struts 2.33迁移到Struts 2.5.12。 我们直接在应用程序中使用过。 我发现将删除了。我试图搜索但找不到任何东西 我发现了一些类似的类,但似乎它们不是我可以使用的类。 我已经查看了迁移指南,但找不到对此的任何评论。 有哪一种选择? 问题答案: struts.xml应设置为: 并可以添加捆绑 } 完整积分@LukazLenart https://issues.

  • 我当前的项目有几个Flyway迁移,用于将初始数据导入数据库。这个数据是方便的,特别是对于开发人员能够快速设置项目。生产数据通过一些批处理作业导入,具有较新的版本。 其中有些迁移相当大(~20MB),因此每次应用程序启动时,Flyway都要花费一些时间来计算迁移的校验和。这也是集成测试的一个问题,因为它们也需要更长的时间。 null 我还有什么其他选择?如果可能的话,我希望使用Flyway而不是手

  • 问题内容: 我很了解Java。哪些警告和资源将帮助我尽可能轻松地跨过另一端(C#)。 问题答案: 最大提示:请使用go一词中的.NET命名约定。这样,您将不断被提示使用的是哪种语言。(听起来很愚蠢,但这确实有帮助。)尽可能多地接受该语言的习惯用法。 有许多专门针对您所处地区的人们的书籍-在亚马逊上搜索“ C#for Java”,您将获得很多成功。值得 仔细 阅读以确保您不认为C#和Java中的功能

  • 我在雪花上做POC,探索这个产品。 我有一个问题:在SQL Server中,我们有400-500个存储过程,这些存储过程是从SSRS报告调用的。这些存储过程本质上很简单,如下所示:

  • 迁移包括以下部分: MIP 核心库迁移 将站点引用的 mip.js 和 mip.css 版本由 1.0 修改为 2.0。MIP 核心库 2.0 版本完全兼容 1.0 版本,开发者可放心升级。具体做法如下: mip.js 文件迁移 将站点中的所有如下引用: <script src="https://c.mipcdn.com/static/v1/mip.js"></script> 改为: <scrip

  • 我在互联网上搜索了一个很好的实现,它不是把数字表达式,而是把变量表达式从中缀符号转换成前缀和后缀。我做的所有搜索都没有成功。基本上,我想看看PHP中是否有任何实现,这样我就可以修改它以支持更多的操作符,而不仅仅是(-,*,=)。 例如转换: 同时保留变量名,不必输入数字进行计算。