亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Cloud Gateway Hystrix fallback怎么獲取異常信息

發布時間:2021-07-19 17:13:38 來源:億速云 閱讀:243 作者:chen 欄目:開發技術

本篇內容介紹了“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”本身,并且沒有異常信息:

Spring Cloud Gateway Hystrix fallback怎么獲取異常信息

后來我重新到HystrixGatewayFilterFactory類中去查看,發現了異常信息其實在exchange里:

Spring Cloud Gateway Hystrix fallback怎么獲取異常信息

而請求的接口也通過debug找到了:

Spring Cloud Gateway Hystrix fallback怎么獲取異常信息

所以將代碼改成如下:

@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);
    }
}

正常取到請求路徑以及異常信息:

Spring Cloud Gateway Hystrix fallback怎么獲取異常信息

關于 hystrix 的異常 fallback method wasn't found

消費者服務--service 的實現如下:

@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}

“Spring Cloud Gateway Hystrix fallback怎么獲取異常信息”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

万宁市| 乐陵市| 仁怀市| 云南省| 来宾市| 进贤县| 禄劝| 乐至县| 方正县| 图木舒克市| 延庆县| 格尔木市| 顺义区| 丹江口市| 固原市| 鄂托克旗| 和静县| 平谷区| 舞钢市| 吉隆县| 苏尼特右旗| 资兴市| 江津市| 甘肃省| 蒙城县| 肇源县| 晋江市| 彭泽县| 隆回县| 常山县| 丰宁| 壤塘县| 四会市| 婺源县| 深州市| 榆中县| 崇左市| 左权县| 古蔺县| 图们市| 察隅县|