如何让spring-cloud zuul为不同的服务使用不同的线路

How to get spring-cloud zuul to use a different circuit for different services

我正在尝试使用 spring-cloud-starter-zuul。我已经设置了 Eureka 并注册了一个我作为 Eureka 客户端编写的简单服务。我在两个不同的主机上用两个不同的应用程序名称注册了两个实例,因此它们是 Eureka 中的两个不同服务。我的 objective 是为了确保如果 serviceA 表现良好而 serviceB 表现不佳,则代理到 serviceA 不会因代理到 serviceB 失败而受到影响。

如果我 运行 通过 zuul 单独加载测试 serviceA,我可以毫无问题地保持 400 TPS 的吞吐量。如果我然后投入 serviceB 并完全超载它并让它在所有地方超时,我希望 serviceA 继续在 400 而 serviceB 挣扎,但 serviceA 下降到低于 50 TPS 成功率并且有一堆错误作为嗯。

RibbonRoutingFilter 生成的所有 RibbonCommand 似乎在 hystrix 中共享相同的电路,这对我来说毫无意义。查看创建 RibbonCommand 的 RibbonRoutingFilter,我看不出有任何方法可以将其配置为使用不同的命令。

在 RibbonRoutingFilter 中:

    RibbonCommand command = new RibbonCommand(restClient, verb, uri,
            convertHeaders(headers), convertHeaders(params), requestEntity);

我已经验证了 serviceA 和 serviceB 的 restClient 是不同的,所以他们使用他们自己的连接池配置,正如我在 application.yml 文件中指定的那样,但是仍然有大量的交叉- serviceA 和 serviceB 之间的服务质量污染。

RibbonCommand 似乎还有另一个构造函数,它将 "commandKey" 作为第一个参数,而我引用的那个构造函数只是委托给具有 "default" 的 commandKey 值的那个构造函数。我在 RibbonRoutingFilter 中看不到用于覆盖它的开关或选项。对我来说,这严重损害了从 spring-cloud 项目使用 Zuul 的可行性。

有没有办法让我开箱即用地配置它,以便每个服务都有自己的电路?

我的 pom 的适用部分:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-parent</artifactId>
      <version>1.0.0.RC1</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

<dependencies>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zuul</artifactId>
  </dependency>

application.yml:

ribbon:
  ConnectTimeout: 5000
  ReadTimeout: 5000
  MaxAutoRetries: 0
  MaxAutoRetriesNextServer: 0
  OkToRetryOnAllOperations: false
  MaxHttpConnectionsPerHost: 200
  MaxTotalHttpConnections: 1000
echo1:
  ribbon:
    ActiveConnectionsLimit: 200
echo2:
  ribbon:
    ActiveConnectionsLimit: 400
spring:
  application:
    name: SpringCloudProxywall
server:
  port: 8080
zuul:
  routes:
    echo1:
      path: /echo1/**
      serviceId: echo1
      stripPrefix: false
    echo2:
      path: /echo2/**
      serviceId: echo2
      stripPrefix: false

我的申请class:

@Configuration
@ComponentScan
//@EnableCircuitBreaker  <-- is already included in EnableZuulProxy
@EnableZuulProxy
@EnableTurbine
@EnableHystrixDashboard
@EnableAutoConfiguration
public class SpringCloudProxywallApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringCloudProxywallApplication.class, args);
    }
}

我想如果你使用已经是默认的快照(每个后端不同的电路):https://github.com/spring-cloud/spring-cloud-netflix/issues/160