Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用@ControllerAdvice&;的Spring boot微服务异常行为@断路器_Java_Spring_Spring Boot_Microservices - Fatal编程技术网

Java 使用@ControllerAdvice&;的Spring boot微服务异常行为@断路器

Java 使用@ControllerAdvice&;的Spring boot微服务异常行为@断路器,java,spring,spring-boot,microservices,Java,Spring,Spring Boot,Microservices,我的问题与微服务中的异常行为有关。 假设我们有一个microservice(比方说microservice-a),它有一个控制器建议注释类来处理所有异常 另外,我的微服务-A正在调用另一个微服务(比如说微服务-B)。假设此调用是从带有@CircuitBreaker(name=“myService”,fallback=“myFallbackMethod”)注释的服务层方法发生的 因此,如果在成功调用microservice-B之后引入任何运行时异常,将执行回退方法,还是执行@ExceptionHa

我的问题与微服务中的异常行为有关。 假设我们有一个microservice(比方说microservice-a),它有一个控制器建议注释类来处理所有异常

另外,我的微服务-A正在调用另一个微服务(比如说微服务-B)。假设此调用是从带有
@CircuitBreaker(name=“myService”,fallback=“myFallbackMethod”)
注释的服务层方法发生的

因此,如果在成功调用microservice-B之后引入任何运行时异常,将执行回退方法,还是执行
@ExceptionHandler
注释类中的
@ControllerAdvice
注释方法

连接一块poc

//微服务-A
包com.example.iplservice.controller;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.beans.factory.annotation.Value;
导入org.springframework.core.env.Environment;
导入org.springframework.http.ResponseEntity;
导入org.springframework.web.bind.annotation.GetMapping;
导入org.springframework.web.bind.annotation.RequestMapping;
导入org.springframework.web.bind.annotation.RestController;
导入com.example.iplservice.feign.MyFeignClient;
导入io.github.resilience4j.circuitbreaker.annotation.circuitbreaker;
@RestController
@请求映射(“ipl”)
公共类IPL控制器{
@值(“${ipl.team}”)
私有字符串iplTeam;
@自动连线
私人环境署;
@自动连线
私人MyFeignClient MyFeignClient;
@GetMapping(“/team/hello”)
@断路器(name=“cricketService”,fallbackMethod=“getHelloFallBack”)
公共响应性getHello(){
String body=myFeignClient.getHello().getBody();
//在这里引入一个错误!!
INTA=2/0;
系统输出打印项次(“------------------------”+a);
返回ResponseEntity.ok(“Hello”+iplTeam+”:“+env.getProperty(“local.server.port”)+”:调用:“+body”);
}
}
//微服务A端
//微服务—控制器建议
包com.example.iplservice.exception;
导入org.springframework.http.ResponseEntity;
导入org.springframework.web.bind.annotation.ControllerAdvice;
导入org.springframework.web.bind.annotation.ExceptionHandler;
导入org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
@控制器建议
公共类CricketExceptionHandler扩展了ResponseEntityExceptionHandler{
@ExceptionHandler(Exception.class)
公共响应属性HandleGenericeException(异常ex){
返回ResponseEntity.ok(“来自控制器通知的错误:+ex.getMessage());
}
}
//Microservice-A控制器建议结束
//微服务B
包com.example.cricketersdetailservice.controller;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.beans.factory.annotation.Value;
导入org.springframework.cloud.context.config.annotation.RefreshScope;
导入org.springframework.core.env.Environment;
导入org.springframework.http.ResponseEntity;
导入org.springframework.web.bind.annotation.GetMapping;
导入org.springframework.web.bind.annotation.RequestMapping;
导入org.springframework.web.bind.annotation.RestController;
@RestController
@刷新范围
@请求映射(“/cricket”)
公共类板球控制器{
@值(${cricketer.team}”)
私有字符串teamName;
@自动连线
私人环境署;
@GetMapping(“/team/hello”)
公共响应性getHello(){
返回ResponseEntity.ok(“Hello”+teamName+:“+env.getProperty(“local.server.port”));
}
}
//微服务B端

正如我在代码中看到的,将触发回退方法。即使调用micro service B成功,断路器也会监视方法
getHello
上发生的每个异常

如果要更改此行为,有一些备选方案:

  • 仅使用断路器装饰外部客户端方法调用
  • 在新方法上分离外部客户端调用,并用
    @CircuitBreaker
  • 将断路器配置为仅监视外部客户端引发的某些特定异常

检查resilience4j文档,然后

您可以详细说明吗?你能添加一些示例代码吗?我已经附上了示例代码,我得到的行为是,无论控制器的建议如何,断路器回退方法都会被调用,这是正常的流程吗?是的,这肯定是预期的行为,因为默认情况下断路器会触发每个异常(至少对于恢复力4j)谢谢你提供的信息上帝保佑