微服務(wù)Springcloud之Feign的基本使用
前言
當(dāng)我們通過RestTemplate調(diào)用其它服務(wù)的API時,所需要的參數(shù)須在請求的URL中進行拼接,如果參數(shù)少的話或許我們還可以忍受,一旦有多個參數(shù)的話,這時拼接請求字符串就會效率低下。
一、Feign概述
Feign是Spring Cloud提供的聲明式、模板化的HTTP客戶端, 它使得調(diào)用遠程服務(wù)就像調(diào)用本地服務(wù)一樣簡單,只需要創(chuàng)建一個接口并添加一個注解即可。
Spring Cloud集成Feign并對其進行了增強,使Feign支持了Spring MVC注解;Feign默認集成了Ribbon,所以Fegin默認就實現(xiàn)了負載均衡的效果。

二、Feign入門
注意:以下所有步驟實現(xiàn)的前提是需要在啟動類上加入注解 @EnableFeignClients 主要是為開啟feign接口掃描
1.創(chuàng)建服務(wù)提供者(provider)
導(dǎo)入依賴:
<!--Spring Cloud OpenFeign Starter -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>代碼如下(示例):
在服務(wù)提供者中調(diào)用servic層獲取數(shù)據(jù)
//創(chuàng)建服務(wù)提供者
@RestController
@RequestMapping("/provider")
public class ProviderController {
@Autowired
private UserService userService;
@RequestMapping("/getUserById/{id}")
public User getUserById(@PathVariable Integer id){
return userService.getUserById(id);
}
}2.創(chuàng)建feign接口
代碼如下(示例):
解釋都放在了代碼中,可以直接復(fù)制粘貼
/**
* @FeignClient 一般采用服務(wù)名進行命名
* name:指定FeignClient的名稱,如果項目使用了Ribbon,name屬性會作為微服務(wù)的名稱,用于服務(wù)發(fā)現(xiàn)
* url: url一般用于調(diào)試,可以手動指定@FeignClient調(diào)用的地址
*
* @RequestMapping 主要用于feign框架拼接傳遞url,彌補了Ribbon的url需要手動拼接的缺陷
* @PathVariable("id") 當(dāng)路徑為restful風(fēng)格時路徑傳參方式
* @RequestParam("id") 當(dāng)路徑為?id=250 時傳參方式
* @RequestBody User user 當(dāng)路徑為對象時采用的傳參方式,(集合、數(shù)組等都屬于對象)
*/
@FeignClient("feign-provider")
@RequestMapping("/provider")
public interface UserFeign {
@RequestMapping("/getUserById/{id}")
User getUserById(@PathVariable("id") Integer id);
@RequestMapping("/deleteUserById")
User deleteUserById(@RequestParam("id") Integer id);//?形式拼接參數(shù),?id=250
@RequestMapping("/addUser")
User addUser(@RequestBody User user);//pojo--->json
}3、創(chuàng)建服務(wù)消費者(consumer)
//服務(wù)消費者
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
@Autowired
private UserFeign userFeign;
@RequestMapping("/getUserById/{id}")
public User getUserById(@PathVariable Integer id){
return userFeign.getUserById(id);
}
}application.yml文件
server:
port: 80
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.209.129:8848
application:
name: feign-consumer
三、Feign 原理
1、將feign接口的代理類掃描到Spring容器中:
@EnableFeignClients開啟feign注解掃描:FeignClientsRegistrar.registerFeignClients()掃描被 @FeignClient標(biāo)識的接口生成代理類,并把接口和代理類交給Spring的容器管理。
2、為接口的方法創(chuàng)建RequestTemplate
當(dāng)consumer調(diào)用feign代理類時,代理類會調(diào)用SynchronousMethodHandler.invoke()創(chuàng)建RequestTemplate(url,參數(shù))
3、發(fā)出請求
代理類會通過RequestTemplate創(chuàng)建Request,然后client(URLConnetct、HttpClient、OkHttp)使用Request發(fā)送請求
四、Feign優(yōu)化
1、開啟feign日志
feign日志級別

在consumer的yml文件中加入以下代碼
feign:
client:
config:
feign-provider: #此處寫的是服務(wù)名稱,針對我們feign微服務(wù)的配置,如果是default就是全局配置
loggerLevel: full #配置Feign的日志級別,相當(dāng)于代碼配置方式中的Logger
#在application.yml中使用 logging.level.<Feign客戶端對應(yīng)的接口的全限定名> 的參數(shù)配置格式來開啟指定客戶端日志
logging:
level:
com.bjpowernode.feign: debug隨后啟動測試:
出現(xiàn)以下結(jié)果表示日志輸出成功

2、feign超時問題
首先、Feign的負載均衡底層用的就是Ribbon,所以這里的請求超時配置其實就是配置Ribbon,當(dāng)出現(xiàn)請求超時會出現(xiàn)以下報錯。

注意 :當(dāng)開啟日志配置之后,feign超時問題不會出現(xiàn)報錯情況。
針對超時問題我們需要在之前的日志配置中加入以下內(nèi)容
ConnectTimeout: 5000 #請求連接的超時時間
ReadTimeout: 5000 #請求處理的超時時間

3、http連接池
(1)、連接池介紹
首先,我們知道HTTP連接需要經(jīng)過三次握手,四次揮手的過程,這是很耗費性能的;所以HTTP連接池幫助我們節(jié)省了這一步。
同時Feign的HTTP客戶端支持三種框架:
HttpURLConnection、HttpClient、OkHttp;默認是HttpURLConnection
(2)、連接池使用
先引入依賴到公共接口工廠interfac,如果沒有做公共接口就放入consumer
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>講真的,其實這已經(jīng)完成了,但是,我們還是要知道一下它的原理,否則顯得太片面了
在配置文件中我們看到,連接池引入之后默認是開啟的,所以我們就不用再寫了

4、gzip壓縮
壓縮能力:
當(dāng) Gzip 壓縮到一個純文本文件時,效果是非常明顯的,大約可以減少 70%以上的文件大小。·
這個開啟也是比較簡單,只需要在consumer中yml文件中寫入以下代碼即可

此時在瀏覽器中就可以看到我們提供的壓縮方式,和瀏覽器支持的壓縮方式

到此這篇關(guān)于微服務(wù)Springcloud之Feign的基本使用的文章就介紹到這了,更多相關(guān)微服務(wù)Feign的基本使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java如何讀取csv文件并將數(shù)據(jù)放入對象中
這篇文章主要介紹了Java如何讀取csv文件并將數(shù)據(jù)放入對象中的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-04-04
SpringBoot前端傳遞數(shù)組后端接收兩種常用的方法
這篇文章主要給大家介紹了關(guān)于SpringBoot前端傳遞數(shù)組后端接收兩種常用的方法,文中通過代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價值,需要的朋友可以參考下2024-04-04
Spring Boot高可用限流三種實現(xiàn)解決方案
限流是對某一時間窗口內(nèi)的請求數(shù)進行限制,保持系統(tǒng)的可用性和穩(wěn)定性,本文就介紹了Spring Boot高可用限流三種實現(xiàn)解決方案,具有一定的參考價值,感興趣的可以了解一下2023-08-08
在CentOS系統(tǒng)上安裝Java的openjdk的方法
這篇文章主要介紹了在CentOS系統(tǒng)上安裝Java的openjdk的方法,同樣適用于Fedora等其他RedHat系的Linux系統(tǒng),需要的朋友可以參考下2015-06-06
教你開發(fā)腳手架集成Spring?Boot?Actuator監(jiān)控的詳細過程
這篇文章主要介紹了開發(fā)腳手架集成Spring?Boot?Actuator監(jiān)控的詳細過程,集成包括引入依賴配置文件及訪問驗證的相關(guān)知識,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05
SpringCloud集成和使用OpenFeign的教程指南
在微服務(wù)架構(gòu)中,服務(wù)間的通信是至關(guān)重要的,SpringCloud作為一個功能強大的微服務(wù)框架,為我們提供了多種服務(wù)間通信的方式,其中,OpenFeign是一個聲明式的Web服務(wù)客戶端,它使得編寫Web服務(wù)客戶端變得更加簡單,本文將詳細介紹如何在SpringCloud項目中集成和使用OpenFeign2024-10-10

