Spring Cloud Gateway Hystrix fallback 이상 정보 처리

Gateway Hystrix fallback 이상 정보 획득
gateway fallback 후 요청 한 인터페이스 와 구체 적 인 이상 정 보 를 알 고 요청 과 이상 에 따라 처리 해 야 합 니 다.처음에는 인터넷 블 로그 의 방법 에 따라
pom.xml:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
application.yml:

spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: false
          lowerCaseServiceId: true
      routes:
        - id: auth-server
          uri: lb://MS-OAUTH2-SERVER
          predicates:
            - Path=/**
      default-filters:
        - name: Hystrix
          args:
            name: fallbackcmd
            fallbackUri: forward:/fallback
그리고 fallback 은 이 렇 습 니 다.

@RestController
@Slf4j
public class FallbackController {

    @RequestMapping(value = "/fallback")
    @ResponseStatus
    public Mono<Map<String, Object>> fallback(ServerWebExchange exchange, Throwable throwable) {
        Map<String, Object> result = new HashMap<>(3);
        ServerHttpRequest request = exchange.getRequest();
        log.error("      ,URL={}", request.getPath().pathWithinApplication().value(), throwable);
        result.put("code", 60002);
        result.put("data", null);
        result.put("msg", "      !");
        return Mono.just(result);
    }
}
그러나 테스트 결과 이렇게 꺼 낸 인터페이스 주 소 는'/fallback'자체 일 뿐 이상 한 정보 가 없 는 것 으로 나 타 났 다.
在这里插入图片描述
나중에 저 는 HystrixGateway FilterFactory 류 에 다시 가서 확인 한 결과 이상 한 정 보 는 exchange 에 있 습 니 다.
在这里插入图片描述
요청 한 인터페이스 도 debug 를 통 해 찾 았 습 니 다:

그래서 코드 를 다음 과 같이 바 꿉 니 다.

@RestController
@Slf4j
public class FallbackController {

    @RequestMapping(value = "/fallback")
    @ResponseStatus
    public Mono<Map<String, Object>> fallback(ServerWebExchange exchange) {
        Map<String, Object> result = new HashMap<>(3);
        result.put("code", 60002);
        result.put("data", null);
        Exception exception = exchange.getAttribute(ServerWebExchangeUtils.HYSTRIX_EXECUTION_EXCEPTION_ATTR);
        ServerWebExchange delegate = ((ServerWebExchangeDecorator) exchange).getDelegate();
        log.error("      ,URL={}", delegate.getRequest().getURI(), exception);
        if (exception instanceof HystrixTimeoutException) {
            result.put("msg", "      ");
        } else if (exception != null && exception.getMessage() != null) {
            result.put("msg", "      : " + exception.getMessage());
        } else {
            result.put("msg", "      ");
        }
        return Mono.just(result);
    }
}
요청 경로 와 이상 정 보 를 정상적으로 가 져 옵 니 다:

Hstrix 이상 fallback method wasn't found
소비자 서비스--서비스의 실현 은 다음 과 같다.

@Service
public class BookService {
    @Autowired
    public RestTemplate  restTemplate;
    @HystrixCommand(fallbackMethod = "addServiceFallback")
    public  Book   getBook( Integer  bookId ){
        return  restTemplate.getForObject("http://provider-service/boot/book?bookId={bookId}",Book.class , bookId);
    }
    public  String  addServiceFallback(){
        System.out.println("error addServiceFallback.... ");
        return  "error" ;
    }
}
다음 과 같은 이상 이 생 길 수 있 습 니 다.
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Fri May 25 14:27:51 CST 2018
There was an unexpected error (type=Internal Server Error, status=500).
fallback method wasn't found: addServiceFallback([class java.lang.Integer])
이것 은 지정 한 예비 방법 addServiceFallback 과 원래 방법 getBook 의 매개 변수 갯 수,매개 변수 유형 이 다 르 기 때 문 입 니 다.
addServiceFallback 방법 수정:

public  String addServiceFallback(Integer  bookId){
    System.out.println("error addServiceFallback.... ");
    return  "error" ;
}
계속 실행 하면 다음 과 같은 이상 이 발생 할 것 이다.
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Fri May 25 14:32:24 CST 2018
There was an unexpected error (type=Internal Server Error, status=500).
Incompatible return types. Command method: public com.bmcc.springboot.model.Book com.bmcc.springboot.service.BookService.getBook(java.lang.Integer); Fallback method: public java.lang.String com.bmcc.springboot.service.BookService.addServiceFallback(java.lang.Integer); Hint: Fallback method 'public java.lang.String com.bmcc.springboot.service.BookService.addServiceFallback(java.lang.Integer)' must return: class com.bmcc.springboot.model.Book or its subclass
이것 은 지정 한 예비 방법 addServiceFallback 과 원래 방법 getBook 이 매개 변수 개수,매개 변수 유형 이 같 지만 방법의 반환 값 유형 이 다 르 기 때 문 입 니 다.
addServiceFallback 방법 수정:

public  Book  addServiceFallback(Integer  bookId){
    System.out.println("error addServiceFallback.... ");
    return  new Book() ;
}
계속 실행 하면 서비스 제공 자가 이상 하 게 닫 혔 을 때 소비자(소비자 가 문의 하 는 방식 으로 서 비 스 를 소비)가 서 비 스 를 계속 방문 할 때 이상 페이지 를 던 지지 않 고 다음 과 같다.

{"bookId":0,"bookName":null,"price":null,"publisher":null}
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기