到目前爲止,小夥伴們對Feign的使用已經掌握的差很少了,咱們在前文也提到Feign是對Ribbon和Hystrix的整合,那麼在Feign中,咱們要如何配置Ribbon和Hystrix呢?帶着這兩個問題,咱們來看看本文的內容。json
本文是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的繼承特性app
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
。
可是這種配置是一種全局配置,就是是對全部的請求生效的,若是我想針對不一樣的服務配置不一樣的鏈接超時和讀取超時,那麼咱們能夠在屬性的前面加上服務的名字,以下:ide
# 設置針對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
Feign中Hystrix的配置和Ribbon有點像,基礎配置以下:測試
# 設置熔斷超時時間 hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000 # 關閉Hystrix功能(不要和上面的配置一塊兒使用) feign.hystrix.enabled=false # 關閉熔斷功能 hystrix.command.default.execution.timeout.enabled=false
這種配置也是全局配置,若是咱們想針對某一個接口配置,好比/hello接口,那麼能夠按照下面這種寫法,以下:spa
# 設置熔斷超時時間 hystrix.command.hello.execution.isolation.thread.timeoutInMilliseconds=10000 # 關閉熔斷功能 hystrix.command.hello.execution.timeout.enabled=false
可是咱們的接口名可能會重複,這個時候同名的接口會共用這一條Hystrix配置。 debug
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註解中指定服務降級處理類便可,以下:code
@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資料請關注公衆號: