微服務:SpringCloud 使用Feign組件

一、之前項目存在的問題

我們這樣去調用微服務:

 是不是感覺不好啊,怎麼可能去拼字符串呢?low爆了對吧。我們的Feign組件就是解決這個問題滴!

二、Feign組件

1、簡介

FeignNetflflix開發的聲明式,模板化的HTTP客戶端,其靈感來自Retrofifit,JAXRS-2.0以及WebSocket.
  • Feign可幫助我們更加便捷,優雅的調用HTTP API
  • SpringCloud中,使用Feign非常簡單——創建一個接口,並在接口上添加一些註解,代碼就完成了
  • Feign支持多種註解,例如Feign自帶的註解或者JAX-RS註解等。
  • SpringCloudFeign進行了增強,使Feign支持了SpringMVC註解,並整合了RibbonEureka,從而讓Feign的使用更加方便。

2、項目中實現

 

項目仍然是這個項目。

首先我們在order-service這裏面加入一些依賴。

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

創建一個類

package com.springcloud.demo.feign;

import com.springcloud.demo.entity.Product;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@FeignClient(name = "service-product")
public interface ProductFeginClient {

    @RequestMapping(value = "/product/{id}", method = RequestMethod.GET)
    public Product findById(@PathVariable("id") Long id);
}
這裏的@FeignClient中的name就是指定對應的服務,然後方法的requestMapping就是對應的地址,實際上跟我們直接拼url差不多,但是這個就相當於做了一個分離。
 
創建一個Feign接口,此接口是在Feign中調用微服務的核心接口

 

  • 定義各參數綁定時,@PathVariable@RequestParam@RequestHeader等可以指定參數屬 性,在Feign中綁定參數必須通過value屬性來指明具體的參數名,不然會拋出異常。
  • @FeignClient:註解通過name指定需要調用的微服務的名稱,用於創建Ribbon的負載均衡器。 所以Ribbon會把 shop-service-product 解析爲註冊中心的服務。
@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private ProductFeginClient productFeginClient;

    @RequestMapping(value = "/buy/{id}", method = RequestMethod.GET)
    public Product findById(@PathVariable Long id) {
        Product product = productFeginClient.findById(id);
        return product;
    }

}

直接注入調用。啓動測試。可以成功!!!

Ribbon是一個基於 HTTP TCP 客戶端 的負載均衡的工具。它可以 在客戶端 配置 RibbonServerList(服務端列表),使用 HttpClient RestTemplate 模擬http請求,步驟相當繁瑣。
 
Feign 是在 Ribbon的基礎上進行了一次改進,是一個使用起來更加方便的 HTTP 客戶端。採用接口的 方式, 只需要創建一個接口,然後在上面添加註解即可 ,將需要調用的其他服務的方法定義成抽象方 法即可, 不需要自己構建http請求。然後就像是調用自身工程的方法調用,而感覺不到是調用遠程方 法,使得編寫客戶端變得非常容易

 

3、實現負載均衡

Feign中本身已經集成了Ribbon依賴和自動配置,因此我們不需要額外引入依賴,也不需要再註冊 RestTemplate 對象。另外,我們可以像上節課中講的那樣去配置Ribbon,可以通過 ribbon.xx 來進行全局配置。
 
不需要任何設置,默認是輪詢的機制。
 
 
Feign的高級配置
Spring Cloud Edgware開始,Feign支持使用屬性自定義Feign。對於一個指定名稱的Feign
Client(例如該Feign Client的名稱爲 feignName ),Feign支持如下配置項:
feign:
  client:
    config:
      feignName: #定義FeginClient的名稱
      # 相當於Request.Options
      connectTimeOut: 5000
      # 相當於Request.Options
      readTimeout: 5000
      # 配置Feign的日誌級別,相當於代碼配置方式中的Logger
      loggerLevel: full
      # Feign的錯誤解碼器,相當於代碼配置方式中的ErrorDecoder
      errorDecoder: com.example.SimpleErrorDecoder
      # 配置重試,相當於代碼配置方式中的Retryer
      retryer: com.example.SimpleRetryer
      # 配置攔截器,相當於代碼配置方式中的RequestInterceptor
      requestInterceptors:
        - com.example.FooRequestInterceptor
        - com.example.BarRequestInterceptor
      decode404: false
  • feignNameFeginClient的名稱
  • connectTimeout : 建立鏈接的超時時長
  • readTimeout : 讀取超時時長
  • loggerLevel: Fegin的日誌級別
  • errorDecoder Feign的錯誤解碼器
  • retryer : 配置重試
  • requestInterceptors : 添加請求攔截器
  • decode404 : 配置熔斷不處理404異常

4、請求壓縮

Spring Cloud Feign 支持對請求和響應進行GZIP壓縮,以減少通信過程中的性能損耗。通過下面的參數 即可開啓請求與響應的壓縮功能:
feign:
  compression:
    request:
      # 開啓請求壓縮
      enabled: true
    response:
      # 開啓響應壓縮
      enabled: true

 

 
同時,我們也可以對請求的數據類型,以及觸發壓縮的大小下限進行設置:
 
feign:
  compression:
    request:
      # 開啓請求壓縮
      enabled: true
      # 設置壓縮的數據類型
      mime-types: text/html,application/xml,application/json
      # 設置觸發壓縮的大小下限
      min-request-size: 2048
注:上面的數據類型、壓縮大小下限均爲默認值。
 
 

5、日誌級別

在消費者那設置

# 設置服務的日誌
# NONE:不輸出日誌
# BASIC:用於生產環境測試追蹤問題
# HEADERS:basic的基礎上+ 請求頭和響應頭信息
# FULL:記錄所有
feign:
  client:
    config:
      service-product:
        loggerLevel: FULL

logging:
  level:
    com.springcloud.demo.feign.ProductFeginClient: debug

重新啓動項目。訪問接口,打印輸出

源碼的話,拿到之前文章的項目,修改一下就可以了

 

 

 

 

 

 

 

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