Feign遠(yuǎn)程調(diào)用

Ribbon可以調(diào)用遠(yuǎn)程服務(wù),但是不是最佳的選擇,我們可以選擇Feign組件。
Feign是在Ribbon的基礎(chǔ)上進(jìn)行了封裝。
1. Feign簡(jiǎn)介
Feign是Netflix開(kāi)發(fā)的聲明式、模板化的HTTP客戶端。
Feign可幫助我們更便捷,優(yōu)雅的調(diào)用HTTP API。
在SpringCloud中,使用Feign非常簡(jiǎn)單--創(chuàng)建一個(gè)接口,并在接口上添加一些注解,代碼就完成了。
Feign支持多種注解,例如Feign自帶的注解或者JAX-RS注解等。
SpringCloud對(duì)Feign進(jìn)行了增強(qiáng),使Feign支持了SpringMVC注解,并整合了Ribbon和Eureka從而讓Feign的使用更加方便。
Feign具備了Ribbon的負(fù)載均衡功能和Eureka的服務(wù)注冊(cè)。
使用feign我們更多的是關(guān)注服務(wù)消費(fèi)者,服務(wù)消費(fèi)者如何調(diào)用服務(wù)提供者微服務(wù)。
2. 基于Feign遠(yuǎn)程服務(wù)調(diào)用
使用feign步驟:
導(dǎo)入依賴
配置調(diào)用接口
在啟動(dòng)類(lèi)上激活feign
通過(guò)自定義的接口調(diào)用遠(yuǎn)程微服務(wù)
1.導(dǎo)入Feigfn依賴
在服務(wù)消費(fèi)者中加入依賴
<!-- SpringCloud整合的openfeign依賴 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.配置調(diào)用接口
服務(wù)消費(fèi)者的合適包中創(chuàng)建feign遠(yuǎn)程調(diào)用微服務(wù)接口
每個(gè)接口方法對(duì)應(yīng)的是服務(wù)提供者暴露的調(diào)用API
/**
* Feign調(diào)用接口
*
* 1.聲明需要調(diào)用的微服務(wù)名稱(chēng)
* @FeignClient
* name:服務(wù)提供者名稱(chēng)
*/
@FeignClient(name = "service-product") //服務(wù)提供者名稱(chēng)
public interface ProductFeignClient {
/**
* 2.配置需要調(diào)用的微服務(wù)接口
*/
@RequestMapping(value = "/product/{id}",method = RequestMethod.GET)
public Product findById(@PathVariable("id") Integer id);
}
提示:@FeignClient請(qǐng)求ip路徑和@RequestMapping請(qǐng)求接口地址組成了請(qǐng)求RUL。
定義各參數(shù)綁定時(shí), @PathVariable,@RequestParam,@RequestHeader等可以指定參數(shù)屬性,在Feign中綁定參數(shù)必須通過(guò)value屬性來(lái)指明具體的參數(shù)名,不然會(huì)拋出異常
@FeignClient :注解通過(guò)name指定需要調(diào)用的微服務(wù)的名稱(chēng),用于創(chuàng)建Ribbon的負(fù)載均衡器。所以Ribbon會(huì)把service-product這個(gè)微服務(wù)解析為注冊(cè)中心的服務(wù)。
3.啟動(dòng)類(lèi)開(kāi)啟激活feign
服務(wù)消費(fèi)者啟動(dòng)類(lèi)開(kāi)啟feign注解
/**
* 訂單服務(wù)啟動(dòng)類(lèi) (服務(wù)消費(fèi)者)
* @Author 黃柏茗
* @Date 2021-09-09
*/
//激活feign
@EnableFeignClients
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class,args);
System.err.println("訂單微服務(wù)啟動(dòng)成功");
}
}
4.通過(guò)feign接口進(jìn)行遠(yuǎn)程調(diào)用微服務(wù)
服務(wù)消費(fèi)者中調(diào)用feign接口進(jìn)行遠(yuǎn)程訪問(wèn)微服務(wù)
/**
* 訂單Controller
*/
@RestController
public class OrderController {
/**
* 1.注入feign調(diào)用接口
*/
@Autowired
private ProductFeignClient productFeignClient;
/**
* 下訂單
* @param id
* @return
*/
@RequestMapping("/buy/{id}")
public Product getProductById(@PathVariable Integer id) {
//2.使用feign接口進(jìn)行遠(yuǎn)程服務(wù)調(diào)用微服務(wù)
Product product = productFeignClient.findById(id);
return product;
}
我們?cè)谡{(diào)用的時(shí)候,可以發(fā)現(xiàn),在遠(yuǎn)程調(diào)用微服務(wù)的時(shí)候,不用拼接URL了,更
測(cè)試:
|
5. Feign和Ribbon的關(guān)系
Ribbon是一個(gè)基于HTTP和TCP客戶端的負(fù)載均衡的工具。
它可以在客戶端配置RibbonServerList (服務(wù)端列表) ,使用HttpClient或RestTemplate模擬http請(qǐng)求,步驟相當(dāng)繁瑣。
Feign是在Ribbon的基礎(chǔ)上進(jìn)行了一次改進(jìn),是一個(gè)使用起來(lái)更加方便的HTTP客戶端。采用接口的方式,只需要?jiǎng)?chuàng)建一個(gè)接口,然后在上面添加注解即可,將需要調(diào)用的其他服務(wù)的方法定義成抽象方法即可,不需要自己構(gòu)建http請(qǐng)求。然后就像是調(diào)用自身工程的方法調(diào)用,而感覺(jué)不到是調(diào)用遠(yuǎn)程方法,使得編寫(xiě)客戶端變得非常容易。
簡(jiǎn)單理解:
Feigin天生具備負(fù)載均衡功能,
6.負(fù)載均衡
feign本身已經(jīng)集成了Ribbon依賴和自動(dòng)配置,因此我們不需要額外的引入依賴,也不需要注冊(cè)RestTemplate對(duì)象。
feign基于ribbon。
我們可以像配置Ribbon那樣去配置負(fù)載均衡配置,通過(guò) riboon.xx 進(jìn)行全局配置,也可以通過(guò) 服務(wù)名.ribbon.xx 來(lái)指定服務(wù)配置。
使用Ribbon的配置來(lái)修改負(fù)載均衡配置即可。
測(cè)試環(huán)境基于Eureka。
模擬啟動(dòng)2個(gè)提供相同的微服。
|
測(cè)試:
|
|
7.請(qǐng)求壓縮
SpringCloud Feign支持對(duì)請(qǐng)求或響應(yīng)的數(shù)據(jù)進(jìn)行GZIP壓縮,減少通信過(guò)程中的性能損耗。
消費(fèi)者使用數(shù)據(jù)壓縮配置即可。
開(kāi)啟請(qǐng)求與響應(yīng)的壓縮功能:
#開(kāi)啟feign請(qǐng)求與響應(yīng)的數(shù)據(jù)壓縮
feign:
compression:
request:
enabled: true #開(kāi)啟請(qǐng)求壓縮
response: true #開(kāi)啟請(qǐng)求壓縮
8.Feign日志級(jí)別
開(kāi)發(fā)階段希望看到Feign請(qǐng)求過(guò)程的日志記錄,默認(rèn)Feign日志是不開(kāi)啟的。
想要使用配置方式來(lái)達(dá)到日志效果,在yml文件配置即可。
使用簡(jiǎn)單,配置壓yml文件即可。
在消費(fèi)者中修改yml,增加feign的日志配置
#開(kāi)啟feign請(qǐng)求與響應(yīng)的數(shù)據(jù)壓縮
feign:
compression:
request:
enabled: true #開(kāi)啟請(qǐng)求壓縮
response: true #開(kāi)啟請(qǐng)求壓縮
#Feign日志輸出 (看這里?。。。。?/span>
# 日志配置:NONE:不輸出日志 BASIC:適用于生產(chǎn)環(huán)境追蹤問(wèn)題 HEADERS:在BASIC基礎(chǔ)上記錄請(qǐng)求和響應(yīng)頭信息 FULL:記錄所有
client:
config:
service-product: #需要調(diào)用的服務(wù)名稱(chēng)
loggerLevel: FULL
#日志輸出
logging:
level:
com.hbm.order.feign.ProductFeignClient: debug #可選擇feign的接口全限定類(lèi)名
測(cè)試到服務(wù)調(diào)用時(shí),F(xiàn)eign調(diào)用日志已經(jīng)輸出

總結(jié):
重點(diǎn)是在Feign的使用
使用feign步驟:
導(dǎo)入依賴
配置調(diào)用接口
在啟動(dòng)類(lèi)上激活feign
通過(guò)自定義的接口調(diào)用遠(yuǎn)程微服務(wù)




