Spring Cloud 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}
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.