8

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

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

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

在 RibbonRoutingFilter 中:

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

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

RibbonCommand 似乎有另一个构造函数,它将“commandKey”作为第一个参数,而我引用的那个只是将 commandKey 值“default”委托给那个构造函数。我在 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>

应用程序.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

我的应用程序类:

@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);
    }
}
4

1 回答 1

5

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

于 2015-01-22T09:23:26.907 回答