私は Spring Cloud Netflix を初めて使用し、それに関していくつか質問があります。
Zuul エッジ サーバーで実行されている Hystrix と共に API Gateway を使用しています。次の動作を正しく理解しているかどうかを確認したいと思います。
API Gateway の「背後」で実行されているマイクロサービスを強制終了してから、hystrix に強制的に回路を開放させます。その後 (約 10 秒)、実行されていないマイクロサービスにリクエストを送信し、タイムアウト エラーを受け取ります。ただし、非常に短い時間 (最大 1 秒) に多数 (数十) の要求を送信すると、SHORTCIRCUIT OPEN エラーが発生します。
回線が開いているのに TIMEOUT エラーが発生する理由に驚きました。しかし、その理由は、最後のリクエストからの時間が circuitBreaker.sleepWindowInMilliseconds を超える場合、API ゲートウェイがマイクロサービスに再度接続して、生きているかどうかを確認しようとしましたが、そうではなかったため、タイムアウトになったためだと思います。それは、短時間に多くのリクエストでSHORTCIRCUIT OPENエラーが発生した理由も説明します。
次のことは、「TIMEOUT」または「SHORTCIRCUIT」エラーを受け取ると、次のようになります。
HystrixRuntimeException: Microservice (timed-out | short-circuited) and no fallback available
この例外を回避するために、zuul サーバー (これはすべてのルートで同じである可能性があります) でフォールバックを指定するにはどうすればよいですか?
私が今まで試したこと:
これによると、タイムアウトを回避するために、実行分離戦略を THREAD に設定します。
hystrix: command.default.execution.isolation.strategy: スレッド
しかし、私が得たhystrix.streamを見た後propertyValue_executionIsolationStrategy":"SEMAPHORE"
- カスタム RibbonCommand を記述して getFallback() をオーバーライドすることで、 githubに解決策のヒントがあるようですが、 RibbonCommandインターフェイスを見た後です。RibbonCommand もそのスーパー インターフェイスもそのようなメソッドを定義していないことがわかりました。
私のAPIゲートウェイサービス:
@SpringBootApplication
@EnableSidecar // This annotation includes @EnableCircuitBreaker, @EnableDiscoveryClient, and @EnableZuulProxy
@EnableHystrixDashboard
public class ApiGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ApiGatewayApplication.class, args);
}
}
アプリケーション.yml
server:
port: 10000
sidecar:
port: 8000
endpoints:
restart:
enabled: true
shutdown:
enabled: true
health:
sensitive: false
eureka:
client:
registerWithEureka: true
fetchRegistry: true
serviceUrl:
defaultZone: http://localhost:8761/eureka/
zuul:
routes:
microservice:
path: /microservice/**
hystrix:
command.default.execution.isolation.strategy: THREAD
debug: true