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

如何用服务发现为Spring云网关重写serviceId

梁丘伟
2023-03-14
spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
          lower-case-service-id: true
          predicates:
            - name: Path
              args:
                pattern: "'/api/' + serviceId + '/**'"
          filters:
            - name: RewritePath
              args:
                regexp: "'/api/' + serviceId + '/(?<remaining>.*)'"
                replacement: "'/${remaining}'"

Previos zuul配置:

zuul.routes.xxx.service-id=xxx-service
zuul.routes.aaa-bbb.service-id=aaa-bbb-service
zuul.routes.aaa-bbb.path=/aaa/bbb/**
zuul.strip-prefix=true
zuul.prefix=/api

共有1个答案

蒲昊
2023-03-14

除了@rémi gélibert变体之外,我们还可以实现自己的routelocator。它允许您为您的路由选择和特殊过滤器指定谓词,能够根据您的意愿改变请求。

这样,我们可以将路由配置提取到某种application.properties

@Component
public class CustomRouteLocator implements RouteLocator {

  Map<String, Pattern> prefixPatternsByServiceNames; // external configuration
  Map<String, String> prefixesByServiceNames;        // external configuration 
  Set<String> servicesNames;                         // external configuration

  @Override
  public Flux<Route> getRoutes() {

    return Flux.fromIterable(servicesNames)
        .map(serviceName -> Route.async()
            .id("ROUTE_" + serviceName)
            .predicate(exchange -> {
              String path = exchange.getRequest().getPath().toString();
              return prefixPatternsByServiceNames.get(serviceName).matcher(path).find();
            })
            .filter((exchange, chain) -> {
              ServerHttpRequest origRequest = exchange.getRequest();
              String query = origRequest.getURI().getQuery();
              String originalPath = origRequest.getPath().toString();
              String newPath = originalPath.substring(prefixesByServiceNames.get(serviceName).length());

              ServerHttpRequest request = exchange.getRequest().mutate()
                  .path(query == null? newPath : newPath + "?" + query)
                  .build();
              return chain.filter(exchange.mutate()
                  .request(request)
                  .build());
            })
            .uri("http://" + serviceName)
            .build());
  }

}

请注意:

 类似资料:
  • 我正在使用典型的Spring云堆栈对简单的微服务架构进行POC,但不是Eureka服务器,而是使用不工作的Spring云Kubernetes进行服务发现。 整个POC都在这里-https://github.com/dhananjay12/spring-microservices-using-spring-kubernetes 网关作为边缘服务器和2个下游服务-用户服务和联系我们服务。 k8设置在k

  • 我一直在试图找到一个与eureka服务器集成的spring cloud gateway的运行示例,以及一些Hystrix示例,但到目前为止我还没有找到。有什么地方可以找到它吗?我真的很想看到spring cloud gateway投入使用,取代我目前的Zuul API服务。 谢谢!

  • 我想自定义发现定位器行为。例如,我的例子之一是从路由到名为的服务。为此,我使用以下配置:

  • 当我们部署到pcf时,Netflix eureka、zuul、ribbon、feign spring cloud配置不有用?(如果是,在pcf中有哪些可选方案以及如何配置它们?) 由于构建微服务遵循CI/CD方法,开发人员在推送代码之前如何验证其微服务的工作,因为我们在生产PCF中没有使用eureka、zuul、ribbon、feign。(如何在developer Machine中模拟pcf环境?

  • 我们能在Spring Cloud API网关和没有服务发现的情况下生存吗?