Spring boot 如何将断路器、限时器和隔板结合起来?

Spring boot 如何将断路器、限时器和隔板结合起来?,spring-boot,spring-webflux,kotlin-coroutines,resilience4j,Spring Boot,Spring Webflux,Kotlin Coroutines,Resilience4j,我有一个通过REST调用依赖项的服务。服务和依赖关系是微服务体系结构的一部分,所以我想使用弹性模式。我的目标是: 有一个断路器,以保护它的依赖时,挣扎 限制呼叫可以运行的时间。该服务具有SLA,必须在特定时间内应答。超时时,我们使用回退值 限制对依赖项的并发调用数。通常呼叫率很低,响应速度很快,但我们希望保护依赖性,防止服务内的突发和队列请求 下面是我当前的代码。它可以工作,但理想情况下,我希望使用TimeLimiter和舱壁类,因为它们似乎是为了协同工作而构建的 我怎样才能写得更好 @组件

我有一个通过REST调用依赖项的服务。服务和依赖关系是微服务体系结构的一部分,所以我想使用弹性模式。我的目标是:

  • 有一个断路器,以保护它的依赖时,挣扎
  • 限制呼叫可以运行的时间。该服务具有SLA,必须在特定时间内应答。超时时,我们使用回退值
  • 限制对依赖项的并发调用数。通常呼叫率很低,响应速度很快,但我们希望保护依赖性,防止服务内的突发和队列请求
下面是我当前的代码。它可以工作,但理想情况下,我希望使用
TimeLimiter
舱壁
类,因为它们似乎是为了协同工作而构建的

我怎样才能写得更好

@组件
FooService类(@Autowired val circuitBreakerRegistry:circuitBreakerRegistry)
{
...
//在缓慢或无响应时从依赖项上卸载的状态机
专用val断路器=断路器注册表
.断路器(“服务”)
//将并行请求限制为依赖关系
私有var信号量=信号量(maxParallelRequests)
//保护功能
private-suspend-fun-makeHttpCall(customerId:String):布尔值{
val client=webClientProvider.getCachedWebClient(baseUrl)
val响应=客户端
.head()
.uri(“/the/request/url”)
.交换
返回时间(val status=response.rawStatusCode()){
200->true
204->false
else->抛出异常(
“Foo服务响应的状态代码无效:$status”
)
}
}
//主要功能
suspend-fun-isFoo(someId:String):布尔值{
试一试{
返回断路器。执行USPENDFUNCTION{
信号量.withPermit{
试一试{
withTimeout(超时毫秒){
makeHttpCall(someId)
}
}捕获(e:TimeoutCancellationException){
//必须转换此异常,因为
//断路器忽略取消异常
抛出异常(“对foo服务的调用超时”)
}
}
}
}捕获(e:CallNotPermittedException){
logger.error{“对foo的调用被断路器阻止”}
}捕获(e:例外){
logger.error{“调用foo服务时出现异常:${e.message}”}
}
//退路
返回真值
}
}
理想情况下,我想写一些类似于描述流的内容:

//主函数
suspend-fun-isFoo(someId:String):布尔值{
返回monoOf(makeHttpCall(someId))
.舱壁(舱壁)
.timeLimiter(timeLimiter)
.断路器(断路器)
}

您也可以使用Resilience4j的隔板,而不是您自己的信号灯和Resilience4j的时间限制器。
您可以使用
隔板堆叠断路器。executeSuspendFunction
timelimiter.executeSuspendFunction

您好,感谢您的回复。我不确定隔板是否会执行,这里有一个关于性能的警告:使用
TimeLimiter
,是否仍需要转换异常?理想情况下,我不希望嵌套这些调用,而是使用类似于装饰器的东西。