1. 程式人生 > 其它 >帝國CMS 上傳附件保持原檔名的方法!

帝國CMS 上傳附件保持原檔名的方法!

簡介

Feign 是一個宣告式 WebService 客戶端。使用 Feign 能讓編寫 Web Service 客戶端更加簡單。

它的使用方法是定義一個服務介面然後在上面添加註解。Feign 也支援可拔插式的編碼器和解碼器。Spring Cloud 對 Feign 進行了封裝,使其支援了 Spring MVC 標準註解和 HttpMessageConverters。Feign 可以與 Eureka 和 Ribbon 組合使用以支援負載均衡;

Feign 能幹什麼

Feign旨在使編寫Java Http客戶端變得更容易。

前面在使用 Ribbon+RestTemplate 時,利用 RestTemplate 對 http 請求的封裝處理,形成了一套模版化的呼叫方法。但是在實際開發中,由於對服務依賴的呼叫可能不止一處,往往一個介面會被多處呼叫,所以通常都會針對每個微服務自行封裝一些客戶端類來包裝這些依賴服務的呼叫。

所以,Feign 在此基礎上做了進一步封裝,由他來幫助我們定義和實現依賴服務介面的定義。在Feign的實現下,我們只需建立一個介面並使用註解的方式來配置它(以前是Dao介面上面標註Mapper註解,現在是一個微服務介面上面標註一個Feign註解即可),即可完成對服務提供方的介面繫結,簡化了使用Spring cloud Ribbon 時,自動封裝服務呼叫客戶端的開發量。

Feign 集成了 Ribbon

利用 Ribbon 維護了 Payment 的服務列表資訊,並且通過輪詢實現了客戶端的負載均衡。而與 Ribbon 不同的是,通過 feign 只需要定義服務繫結介面且以宣告式的方法 ,優雅而簡單的實現了服務呼叫。

Feign 和 OpenFeign 兩者的區別

Feign OpenFeign
Feign 是 Spring Cloud 元件中的一個輕量級 RESTful 的 HTTP 服務客戶端 Feign 內建了 Ribbon,用來做客戶端負載均衡,去呼叫服務註冊中心的服務。Feign 的使用方式是:使用 Feign 的註解定義介面,呼叫這個介面,就可以呼叫服務註冊中的服務。 OpenFeign 是 Spring Cloud 在 Feign 的基礎上支援了 Spring MVC 的註解,如 @RequestMapping 等等。OpenFeign 的 @FeignClient 可以解析 SpringMVC的@RequestMapping 註解下的介面,並通過動態代理的方式產生實現類,實現類中做負載均衡並呼叫其他服務。

org.springframework.cloud
spring-cloud-starter-feign

org.springframework.cloud
spring-cloud-starter-openfeign

OpenFeign 超時控制

OpenFeign 預設等待 1 秒鐘,超過後報錯。

簡介

預設 Feign 客戶端只等待一秒鐘,但是服務端處理需要超過 1 秒鐘,導致 Feign 客戶端不想等待了,直接返回報錯,為了避免這樣的情況,有時候我們需要設定 Feign 客戶端的超時控制。

yml 檔案中開啟配置

OpenFeign 預設支援 Ribbon。

#設定feign客戶端超時時間(OpenFeign預設支援ribbon)
ribbon:
#指的是建立連線所用的時間,適用於網路狀況正常的情況下,兩端連線所用的時間
  ReadTimeout: 5000
#指的是建立連線後從伺服器讀取到可用資源所用的時間
  ConnectTimeout: 5000

OpenFeign 日誌列印功能

簡介

Feign 提供了日誌列印功能,我們可以通知配置來調整日誌級別,從而瞭解 Feign 中 Http 請求的細節。

說白了就是對Feign介面的呼叫情況進行監控和輸出!

日誌級別

  • NONE:預設的,不顯示任何日誌;
  • BASIC:僅記錄請求方法、URL、響應狀態碼及執行時間;
  • HEADERS:除了 BASIC 中定義的資訊之外,還有請求和響應的頭資訊;
  • FULL:除了 HEADERS 中定義的資訊之外,還有請求和響應的正文及元資料。

配置類

@Configuration
public class FeignConfig {
    @Bean
    Logger.Level feignLogLevel() {
        return Logger.Level.FULL;
    }
}

配置檔案

logging:
  level:
    # feign日誌以什麼級別監控哪個介面
    com.atguigu.springcloud.service.PaymentFeignService: debug

輸出資訊

[PaymentFeignService#getPaymentById] ---> GET http://CLOUD-PAYMENT-SERVICE/payment/get/32 HTTP/1.1
[PaymentFeignService#getPaymentById] ---> END HTTP (0-byte body)
[PaymentFeignService#getPaymentById] <--- HTTP/1.1 200 (375ms)
[PaymentFeignService#getPaymentById] connection: keep-alive
[PaymentFeignService#getPaymentById] content-type: application/json
[PaymentFeignService#getPaymentById] date: Sat, 16 Apr 2022 09:45:28 GMT
[PaymentFeignService#getPaymentById] keep-alive: timeout=60
[PaymentFeignService#getPaymentById] transfer-encoding: chunked
[PaymentFeignService#getPaymentById] 
[PaymentFeignService#getPaymentById] {"code":200,"message":"查詢資料成功!服務對應的埠號:8002","data":{"id":32,"serial":"atguigu002"}}
[PaymentFeignService#getPaymentById] <--- END HTTP (116-byte body)