springcloud筆記3——聲明式 REST 客戶端OpenFeign

1.基本概念

  • OpenFeign 可以將提供者提供的 Restful 服務僞裝爲接口進行消費,
    消費者只需使用“feign 接口 + 註解”的方式即可直接調用提供者提供的 Restful 服務,而無需再使用 RestTemplate 了。
  • OpenFeign 與提供者沒有任何關係,是消費者調用提供者的一種方式。
  • Ribbon 是 Netflix公司的一個開源的負載均衡項目,是一個客戶端負載均衡器,運行在消費者端。OpenFeign 直接內置了 Ribbon。即在導入 OpenFeign 依賴後,無需再專門導入 Ribbon 依賴了。

2.消費者工程 配置OpenFeign

2.1 pom引入依賴

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>

2.2 定義 Feign 接口

@FeignClient("abcmsc-provider-depart")
@RequestMapping("/provider/depart")
public interface DepartService {
    @PostMapping("/save")
    boolean saveDepart(@RequestBody Depart depart);
    @DeleteMapping("/del/{id}")
    boolean removeDepartById(@PathVariable("id") int id);
    @PutMapping("/update")
    boolean modifyDepart(@RequestBody Depart depart);
    @GetMapping("/get/{id}")
    Depart getDepartById(@PathVariable("id") int id);
    @GetMapping("/list")
    List<Depart> listAllDeparts();
}

2.3 刪除原來RestTemplate的配置文件

2.4 修改控制器,移除原來的resTemplate

@RestController
@RequestMapping("/consumer/depart")
public class DepartController {
    @Autowired
    private DepartService departService;

    @PostMapping("/save")
    public boolean saveHandle(@RequestBody Depart depart) {
        return departService.saveDepart(depart);
    }

    @DeleteMapping("/del/{id}")
    public void deleteHandle(@PathVariable("id") int id) {
        departService.removeDepartById(id);
    }

    @PutMapping("/update")
    public void updateHandle(@RequestBody Depart depart) {
        departService.modifyDepart(depart);
    }

    @GetMapping("/get/{id}")
    public Depart getHandle(@PathVariable("id") int id) {
        return departService.getDepartById(id);
    }

    @GetMapping("/list")
    public List<Depart> listHandle() {
        return departService.listAllDeparts();
    }
}

2.5 啓動類添加註解

@EnableFeignClients(basePackages = "com.demo.consumer018082.service")

2.6 修改配置文件

2.6.1 設置請求超時
feign:
  client:
    config:
      default:
        #指定Feign連接提供者的超時時限,其取決於網絡環境
        connectTimeout: 5000 
        #指定Feign從請求到最終獲取到提供者的響應的超時時限,其取決於提供者的業務複雜性
        readTimeout: 5000
2.6.2 第一次請求失敗

原因:由於spring的懶加載機制導致大量的類只有在真正使用的纔會真正創建,由於默認的熔斷超時時間(1秒)過短,導致第一次請求很容易失敗,特別互相依賴複雜的時候。

解決方法:提升熔斷超時時間和ribbon超時時間,配置如下:

#設置hystrix超時時間
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=60000
#請求處理的超時時間
ribbon.ReadTimeout=10000
2.6.3 Feign的Http Client

Feign在默認情況下使用的是JDK原生URLConnection發送HTTP請求,沒有連接池,但是對每個地址會保持一個長連接,即利用HTTP的persistence connection。
我們可以用Apache的HTTP Client替換Feign原始的http client,從而獲取連接池、超時時間等與性能息息相關的控制能力。
Spring Cloud從Brixtion.SR5版本開始支持這種替換,首先在項目中聲明Apcahe HTTP Client和feign-httpclient依賴,然後在application.properties中添加:

feign.httpclient.enabled=true
2.6.4 請求響應壓縮

Spring Cloud Feign支持對請求和響應進行GZIP壓縮,以減少通信過程中的性能損耗。我們只需通過下面兩個參數設置,就能開啓請求與響應的壓縮功能:

feign:
  compression:
    request:
      #開啓對請求的壓縮
      enable: true
      #指定要壓縮的文件類型
      mime-type: ["text/xml","application/xml","application/json"]
      #啓動壓縮的最小文件大小,單位字節
      min -request-size: 2048
    response:
      #開啓對客戶端響應的壓縮
      enable: true
2.6.5 日誌配置
logging.level.com.kyle.client.feign.inter.HelloServiceFeign=DEBUG

只是添加了如上配置,還無法實現對DEBUG日誌的輸出。這時由於Feign客戶端默認對Logger.Level對象定義爲NONE級別,該界別不會記錄任何Feign調用過程中對信息,所以我們需要調整它對級別,針對全局對日誌級別,可以在應用主類中直接假如Logger.Level的Bean創建,具體如下:

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

對於Feign的Logger級別主要有下面4類,可根據實際需要進行調整使用。

NONE:不記錄任何信息。
BASIC:僅記錄請求方法、URL以及響應狀態碼和執行時間。
HEADERS:出了記錄BASIC級別的信息之外,還會記錄請求和響應的頭信息。
FULL:記錄所有請求與響應的細節,包括頭信息、請求體、元數據等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章