1. 回顧
上文講解了手動創建Feign,比默認的使用更加靈活。
本文將講解Feign對繼承、壓縮的支持以及日志和多參數請求的構造等。
2. Feign對繼承的支持
Feign支持繼承。使用繼承,可將一些公共操作分組到一些父接口中,從而簡化Feign的開發。
盡管Feign的繼承可幫助我們進一步簡化開發,但是Spring Cloud指出——通常情況下,
不建議服務器端和客戶端之間共享接口,因為這種方式會造成服務器端和客戶端代碼的緊耦合。
並且,Feign本身並不使用Spring MVC的工作機制(方法參數映射不被繼承)。
3. Feign對壓縮的支持
在一些場景下,可能需要對請求或響應進行壓縮,此時可使用啟用Feign的壓縮功能。
其中,feign.compression.request.mime-types 用於支持的媒體類型列表,默認是 text/xml,application/xml,application/json
feign.compression.request.min-request-size用於設置請求的最小閾值,默認是2048
4. Feign的日志
很多場景下,需要了解Feign處理請求的具體細節。
Feign對日志的處理非常靈活,可為每個Feign客戶端指定日志記錄策略,每個Feign客戶端都會創建一個logger。
默認情況下,logger的名稱是Feign接口的完整類名。需要注意的是,Feign的日志打印只會對DEBUG級別作出響應。
我們可為每個Feign客戶端配置各自的Logger.Level對象,告訴Feign記錄那些日志。Logger.Level的值有以下選擇。
- NONE:不記錄任何日志(默認值)
- BASIC:僅記錄請求方法、URL、響應狀態代碼以及執行時間
- HEADERS:記錄BASIC級別的基礎上,記錄請求和響應的header
- FULL:記錄請求和響應的header,body和元數據
> 復制項目 microservice-consumer-movie-feign,將 ArtifactId 修改為 microservice-consumer-movie-feign-logging
> 創建Feign配置類
package com.itmuch.cloud.microserviceconsumermoviefeignlogging.config; import feign.Logger; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class FeignLogConfiguration { @Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } }
> 修改Feign的接口,指定其配置類
package com.itmuch.cloud.microserviceconsumermoviefeignlogging.feign; import com.itmuch.cloud.microserviceconsumermoviefeignlogging.config.FeignLogConfiguration; import com.itmuch.cloud.microserviceconsumermoviefeignlogging.pojo.User; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @FeignClient(name = "microservice-provider-user", configuration = FeignLogConfiguration.class) public interface UserFeignClient { @GetMapping(value = "/{id}") User findById(@PathVariable("id") Long id); }
> 在 application.yml 中添加以下內容,指定Feign接口的日志級別為DEBUG(因為Feign的Logger.Level只對DEBUG級別作出響應)
logging:
level:
com.itmuch.cloud.microserviceconsumermoviefeignlogging.feign.UserFeignClient: DEBUG # 將Feign接口的日志級別設置為DEBUG,因為Feign的Logger.Level只對DEBUG作出響應
> 啟動 microservice-discovery-eureka
> 啟動 microservice-provider-user
> 啟動 microservice-consumer-movie-feign-logging
> 訪問 http://localhost:8010/user/1,可在電影微服務的控制台看見如下內容
5. 使用Feign構造多參數請求
5.1 GET請求多參數的URL
http://localhost:8001/get?id=1&username=張三
> 最直觀的方法,URL有幾個參數,Feign接口就有幾個參數
package com.itmuch.cloud.microserviceconsumermoviefeignlogging.feign; import com.itmuch.cloud.microserviceconsumermoviefeignlogging.config.FeignLogConfiguration; import com.itmuch.cloud.microserviceconsumermoviefeignlogging.pojo.User; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestParam; @FeignClient(name = "microservice-provider-user", configuration = FeignLogConfiguration.class) public interface UserFeignClient { @GetMapping(value = "/get") User findUserByCondi(@RequestParam("id") Long id, @RequestParam("username") String username); }
> 使用 Map 構建。當目標URL參數非常多時,使用Map構建可簡化Feign接口的編寫
package com.itmuch.cloud.microserviceconsumermoviefeignlogging.feign; import com.itmuch.cloud.microserviceconsumermoviefeignlogging.config.FeignLogConfiguration; import com.itmuch.cloud.microserviceconsumermoviefeignlogging.pojo.User; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestParam; import java.util.Map; @FeignClient(name = "microservice-provider-user", configuration = FeignLogConfiguration.class) public interface UserFeignClient { @GetMapping(value = "/get") User findUserByCondi(@RequestParam Map<String, Object> map); }
5.2 POST請求包含多個參數
package com.itmuch.cloud.microserviceconsumermoviefeignlogging.feign; import com.itmuch.cloud.microserviceconsumermoviefeignlogging.config.FeignLogConfiguration; import com.itmuch.cloud.microserviceconsumermoviefeignlogging.pojo.User; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.*; @FeignClient(name = "microservice-provider-user", configuration = FeignLogConfiguration.class) public interface UserFeignClient { @PostMapping(value = "/post") User findUserByCondi(@RequestBody User user); }
6. 總結
這幾章講解了Feign的相關知識。
下文將講解使用Hystrix實現微服務的容錯處理。敬請期待~~~
7. 參考
周立 --- 《Spring Cloud與Docker微服務架構與實戰》