1

我有一个外观,它为某种类型的请求调用 3 个不同的服务,并最终在将响应发送回客户端之前编排响应。在这里,所有 3 项服务都必须按预期启动并提供服务。即使其中一个已关闭,也无法满足客户端请求。我正在寻找一个断路器来解决这个问题。即使其中一项服务关闭,断路器也应以错误代码响应。我正在检查 resilence4j 断路器,它不适合我的问题。

https://resilience4j.readme.io/docs/circuitbreaker

还有其他可用的开源吗?

4

2 回答 2

0

为什么它不适合你的问题?您可以使用 CircuitBreaker 保护每项服务。一旦其中一个断路器打开,您就可以短路并直接向您的客户端返回错误响应。

于 2020-01-02T12:48:27.613 回答
0

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 个事务。

于 2020-01-03T07:12:08.507 回答