spring-cloud-starter-zuul を使用しようとしています。私は Eureka をセットアップし、作成した単純なサービスを Eureka クライアントとして登録しました。2 つの異なるホストに 2 つの異なるアプリケーション名で 2 つのインスタンスを登録するので、これらは Eureka の 2 つの異なるサービスになります。私の目的は、serviceA のパフォーマンスが良く、serviceB のパフォーマンスが悪い場合に、serviceA へのプロキシが serviceB へのプロキシに失敗しても影響を受けないようにすることです。
ロード テスト serviceA を zuul を介して単独で実行すると、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.
「commandKey」を最初のパラメーターとして受け取るRibbonCommandの別のコンストラクターがあるようです。私が参照するコンストラクターは、「デフォルト」の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>
アプリケーション.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);
}
}