我正在尝试使用spring-cloud-starter-zuul。我已经安装了Eureka,并注册了一个我作为Eureka客户编写的简单服务。我在两个具有不同应用程序名称的不同主机上注册了两个实例,因此它们是Eureka中的两个不同服务。我的目标是确保如果serviceA表现良好而serviceB表现不佳,则代理serviceA的代理不受代理serviceB代理失败的影响。
如果我通过zuul单独运行负载测试serviceA,则我可以毫无问题地保持400 TPS的吞吐量。如果我随后抛出serviceB并使其完全过载并使它到处超时,则我希望serviceA会在400继续运行,而serviceB会陷入困境,但相反,serviceA的成功率会降至50 TPS以下,并且会有很多错误好。
看来RibbonRoutingFilter产生的所有RibbonCommands在hystrix中共享相同的电路,这对我来说毫无意义。在它创建RibbonCommand的RibbonRoutingFilter中查看时,我看不到任何将其配置为使用其他方法的方法。
在RibbonRoutingFilter中:
RibbonCommand command = new RibbonCommand(restClient, verb, uri,
convertHeaders(headers), convertHeaders(params), requestEntity);
我已经验证了restClient对于serviceA和serviceB是不同的,因此它们使用的是我在application.yml文件中指定的连接池配置,但是serviceA和serviceB之间在服务质量方面仍然存在大量交叉污染服务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>
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
我的应用程序类:
@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。