SpringCloud系列十三:Feign對繼承、壓縮、日志的支持以及構造多參數請求


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微服務架構與實戰》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM