Spring Cloud中Feign配置詳解

江南一點雨發表於2017-10-16

到目前為止,小夥伴們對Feign的使用已經掌握的差不多了,我們在前文也提到Feign是對Ribbon和Hystrix的整合,那麼在Feign中,我們要如何配置Ribbon和Hystrix呢?帶著這兩個問題,我們來看看本文的內容。


本文是Spring Cloud系列的第十八篇文章,瞭解前十七篇文章內容有助於更好的理解本文:

1.使用Spring Cloud搭建服務註冊中心
2.使用Spring Cloud搭建高可用服務註冊中心
3.Spring Cloud中服務的發現與消費
4.Eureka中的核心概念
5.什麼是客戶端負載均衡
6.Spring RestTemplate中幾種常見的請求方式
7.RestTemplate的逆襲之路,從傳送請求到負載均衡
8.Spring Cloud中負載均衡器概覽
9.Spring Cloud中的負載均衡策略
10.Spring Cloud中的斷路器Hystrix
11.Spring Cloud自定義Hystrix請求命令
12.Spring Cloud中Hystrix的服務降級與異常處理
13.Spring Cloud中Hystrix的請求快取
14.Spring Cloud中Hystrix的請求合併
15.Spring Cloud中Hystrix儀表盤與Turbine叢集監控
16.Spring Cloud中宣告式服務呼叫Feign
17.Spring Cloud中Feign的繼承特性


Ribbon配置

ribbon的配置其實非常簡單,直接在application.properties中配置即可,如下:

# 設定連線超時時間
ribbon.ConnectTimeout=600
# 設定讀取超時時間
ribbon.ReadTimeout=6000
# 對所有操作請求都進行重試
ribbon.OkToRetryOnAllOperations=true
# 切換例項的重試次數
ribbon.MaxAutoRetriesNextServer=2
# 對當前例項的重試次數
ribbon.MaxAutoRetries=1

這個引數的測試方式很簡單,我們可以在服務提供者的hello方法中睡眠5s,然後調節這個引數就能看到效果。下面的引數是我們配置的超時重試引數,超時之後,首先會繼續嘗試訪問當前例項1次,如果還是失敗,則會切換例項訪問,切換例項一共可以切換兩次,兩次之後如果還是沒有拿到訪問結果,則會報Read timed out executing GET http://hello-service/hello
但是這種配置是一種全域性配置,就是是對所有的請求生效的,如果我想針對不同的服務配置不同的連線超時和讀取超時,那麼我們可以在屬性的前面加上服務的名字,如下:

# 設定針對hello-service服務的連線超時時間
hello-service.ribbon.ConnectTimeout=600
# 設定針對hello-service服務的讀取超時時間
hello-service.ribbon.ReadTimeout=6000
# 設定針對hello-service服務所有操作請求都進行重試
hello-service.ribbon.OkToRetryOnAllOperations=true
# 設定針對hello-service服務切換例項的重試次數
hello-service.ribbon.MaxAutoRetriesNextServer=2
# 設定針對hello-service服務的當前例項的重試次數
hello-service.ribbon.MaxAutoRetries=1

Hystrix配置

Feign中Hystrix的配置和Ribbon有點像,基礎配置如下:

# 設定熔斷超時時間
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000
# 關閉Hystrix功能(不要和上面的配置一起使用)
feign.hystrix.enabled=false
# 關閉熔斷功能
hystrix.command.default.execution.timeout.enabled=false

這種配置也是全域性配置,如果我們想針對某一個介面配置,比如/hello介面,那麼可以按照下面這種寫法,如下:

# 設定熔斷超時時間
hystrix.command.hello.execution.isolation.thread.timeoutInMilliseconds=10000
# 關閉熔斷功能
hystrix.command.hello.execution.timeout.enabled=false

但是我們的介面名可能會重複,這個時候同名的介面會共用這一條Hystrix配置。

OK,我們之前還有一篇文章專門講Hystrix服務降級的問題,那麼在Feign中如何配置Hystrix的服務降級呢?很簡單,新建一個類,實現HelloService介面,如下:

@Component
public class HelloServiceFallback implements HelloService {
    @Override
    public String hello() {
        return "hello error";
    }

    @Override
    public String hello(String name) {
        return "error " + name;
    }

    @Override
    public Book hello(String name, String author, Integer price) {
        Book book = new Book();
        book.setName("error");
        return book;
    }

    @Override
    public String hello(Book book) {
        return "error book";
    }
}

這裡方法實現的邏輯都是相應的服務降級邏輯。然後在@FeignClient註解中指定服務降級處理類即可,如下:

@FeignClient(value = "hello-service",fallback = HelloServiceFallback.class)
public interface HelloService {
    @RequestMapping("/hello")
    String hello();

    @RequestMapping(value = "/hello1", method = RequestMethod.GET)
    String hello(@RequestParam("name") String name);

    @RequestMapping(value = "/hello2", method = RequestMethod.GET)
    Book hello(@RequestHeader("name") String name, @RequestHeader("author") String author, @RequestHeader("price") Integer price);

    @RequestMapping(value = "/hello3", method = RequestMethod.POST)
    String hello(@RequestBody Book book);
}

此時我們只啟動eureka-server和feign-consumer,然後訪問相應的介面,可以看到如下結果(注意這裡需要在application.properties中配置feign.hystrix.enabled=true,新版本(Dalston.SR3)的Spring Cloud Feign預設是關閉了Hystrix功能的):

圖片描述

其他配置

Spring Cloud Feign支援對請求和響應進行GZIP壓縮,以提高通訊效率,配置方式如下:

# 配置請求GZIP壓縮
feign.compression.request.enabled=true
# 配置響應GZIP壓縮
feign.compression.response.enabled=true
# 配置壓縮支援的MIME TYPE
feign.compression.request.mime-types=text/xml,application/xml,application/json
# 配置壓縮資料大小的下限
feign.compression.request.min-request-size=2048

Feign為每一個FeignClient都提供了一個feign.Logger例項,我們可以在配置中開啟日誌,開啟方式很簡單,分兩步:

第一步:application.properties中配置日誌輸出
application.properties中配置如下內容,表示設定日誌輸出級別:

# 開啟日誌 格式為logging.level.+Feign客戶端路徑
logging.level.org.sang.HelloService=debug

第二步:入口類中配置日誌Bean

入口類中配置日誌Bean,如下:

@Bean
Logger.Level feignLoggerLevel() {
    return Logger.Level.FULL;
}

OK,如此之後,控制檯就會輸出請求的詳細日誌。

關於Feign中的配置我們就說到這裡,有問題歡迎小夥伴們留言討論。

更多JavaEE資料請關注公眾號:

圖片描述

相關文章