我有一个外观,它为某种类型的请求调用 3 个不同的服务,并最终在将响应发送回客户端之前编排响应。在这里,所有 3 项服务都必须按预期启动并提供服务。即使其中一个已关闭,也无法满足客户端请求。我正在寻找一个断路器来解决这个问题。即使其中一项服务关闭,断路器也应以错误代码响应。我正在检查 resilence4j 断路器,它不适合我的问题。
https://resilience4j.readme.io/docs/circuitbreaker
还有其他可用的开源吗?
我有一个外观,它为某种类型的请求调用 3 个不同的服务,并最终在将响应发送回客户端之前编排响应。在这里,所有 3 项服务都必须按预期启动并提供服务。即使其中一个已关闭,也无法满足客户端请求。我正在寻找一个断路器来解决这个问题。即使其中一项服务关闭,断路器也应以错误代码响应。我正在检查 resilence4j 断路器,它不适合我的问题。
https://resilience4j.readme.io/docs/circuitbreaker
还有其他可用的开源吗?
为什么它不适合你的问题?您可以使用 CircuitBreaker 保护每项服务。一旦其中一个断路器打开,您就可以短路并直接向您的客户端返回错误响应。
CircuitBreaker
适用于以下受保护的功能 -</p>
线程 <—> 断路器 <—> Protected_Function
所以一个Protected_Function
可以调用 1 个或多个微服务,通常我们使用 1Protected_Function
对 1 个外部微服务调用,因为我们可以根据该特定微服务的配置文件或行为来调整弹性。但是由于您的要求不同,因此我们可以在 1 下进行 3 次调用Protected_Function
。
因此,根据您上面的解释,您的 Façade 正在调用 3 个微服务(假设串联)。您可以做的是通过受保护函数或在受保护函数内部调用您 Façade 或所有 3 种服务 -</p>
@CircuitBreaker(name = "OVERALL_PROTECTION")
public Your_Response Protected_Function (Your_Request) {
Call_To_Service_1;
Call_To_Service_2;
Call_To_Service_3;
return Orchestrate_Your_Response;
}
此外,您可以在 YAML 属性文件中添加弹性,OVERALL_PROTECTION
如下所示(我使用了基于计数的滑动窗口)-</p>
resilience4j.circuitbreaker:
backends:
OVERALL_PROTECTION:
registerHealthIndicator: true
slidingWindowSize: 100 # start rate calc after 100 calls
minimumNumberOfCalls: 100 # minimum calls before the CircuitBreaker can calculate the error rate.
permittedNumberOfCallsInHalfOpenState: 10 # number of permitted calls when the CircuitBreaker is half open
waitDurationInOpenState: 10s # time that the CircuitBreaker should wait before transitioning from open to half-open
failureRateThreshold: 50 # failure rate threshold in percentage
slowCallRateThreshold: 100 # consider all transactions under interceptor for slow call rate
slowCallDurationThreshold: 2s # if a call is taking more than 2s then increase the error rate
recordExceptions: # increment error rate if following exception occurs
- org.springframework.web.client.HttpServerErrorException
- java.io.IOException
- org.springframework.web.client.ResourceAccessException
如果您愿意,您也可以使用基于时间slidingWindow
而不是基于计数,其余我已经在配置中的每个参数前面提到了#Comment 进行自我解释。
resilience4j.retry:
instances:
OVERALL_PROTECTION:
maxRetryAttempts: 5
waitDuration: 100
retryExceptions:
- org.springframework.web.client.HttpServerErrorException
- java.io.IOException
- org.springframework.web.client.ResourceAccessException
如果发生Exceptions under,上述配置将重试5次retryExceptions
。
resilience4j.ratelimiter:
instances:
OVERALL_PROTECTION:
timeoutDuration: 100ms #The default wait time a thread waits for a permission
limitRefreshPeriod: 1000 #The period of a limit refresh. After each period the rate limiter sets its permissions count back to the limitForPeriod value
limitForPeriod: 25 #The number of permissions available during one limit refresh period
以上配置将允许在 1 秒内最多进行 25 个事务。