SpringCloud整合OpenFeign實(shí)現(xiàn)微服務(wù)間的通信
1. 前言
1.1 為什么要使用OpenFeign?
雖說RestTemplate 對(duì)HTTP封裝后, 已經(jīng)?直接使?HTTPClient簡(jiǎn)單?便很多, 但是還存在?些問題.
- 需要拼接URL, 靈活性?, 但是封裝臃腫, URL復(fù)雜時(shí), 容易出錯(cuò).
- 代碼可讀性差, ?格不統(tǒng)?。
1.2 介紹一下微服務(wù)之間的通信方式
微服務(wù)之間的通信?式, 通常有兩種: RPC 和 HTTP.
在SpringCloud中, 默認(rèn)是使?HTTP來進(jìn)?微服務(wù)的通信, 最常?的實(shí)現(xiàn)形式有兩種:
- RestTemplate
- OpenFeign
RPC(Remote Procedure Call)遠(yuǎn)程過程調(diào)?,是?種通過?絡(luò)從遠(yuǎn)程計(jì)算機(jī)上請(qǐng)求服務(wù),?不需要了解底層?絡(luò)通信細(xì)節(jié)。RPC可以使?多種?絡(luò)協(xié)議進(jìn)?通信, 如HTTP、TCP、UDP等, 并且在TCP/IP?絡(luò)四層模型中跨越了傳輸層和應(yīng)?層。簡(jiǎn)?之RPC就是像調(diào)?本地?法?樣調(diào)?遠(yuǎn)程?法。
常?的RPC框架有:
- Dubbo: Apache Dubbo 中?
- Thrift : Apache Thrift - Home
- gRPC: gRPC
1.3 OpenFeign介紹
OpenFeign 是?個(gè)聲明式的 Web Service 客戶端. 它讓微服務(wù)之間的調(diào)?變得更簡(jiǎn)單, 類似于controller,調(diào)?service, 只需要?jiǎng)?chuàng)建?個(gè)接?,然后添加注解即可使?OpenFeign。OpenFeign是一個(gè)基于Java的HTTP客戶端,它使得編寫和維護(hù)RESTful服務(wù)之間的通信變得更加簡(jiǎn)單。通過使用注解和接口定義,開發(fā)者可以輕松地創(chuàng)建RESTful服務(wù)的客戶端,并且無需編寫大量的樣板代碼。
1.4 OpenFeign 的前?
Feign 是 Netflix 公司開源的?個(gè)組件.
- 2013年6?, Netflix發(fā)布 Feign的第?個(gè)版本 1.0.0
- 2016年7?, Netflix發(fā)布Feign的最后?個(gè)版本 8.18.0
- 2016年,Netflix 將 Feign 捐獻(xiàn)給社區(qū)
- 2016年7? OpenFeign 的?個(gè)版本 9.0.0 發(fā)布,之后?直持續(xù)發(fā)布到現(xiàn)在.
可以簡(jiǎn)單理解為 Netflix Feign 是OpenFeign的祖先, 或者說OpenFeign 是Netflix Feign的升級(jí)版.
OpenFeign 是Feign的?個(gè)更強(qiáng)?更靈活的實(shí)現(xiàn).
2. OpenFeign的使用步驟
2.1 添加maven依賴
<!--添加openFeign 的依賴--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
2.2 添加注解
在啟動(dòng)類上添加注解 @EnableFeignClients ,表示開啟OpenFeign的功能,Spring Boot 將會(huì)掃描指定的包路徑下的 Feign 客戶端接口,并自動(dòng)創(chuàng)建代理對(duì)象。這些代理對(duì)象可以直接調(diào)用遠(yuǎn)程服務(wù)的 API,而無需手動(dòng)編寫 HTTP 請(qǐng)求代碼。
@EnableEurekaServer 注解會(huì)啟動(dòng)一個(gè)嵌入式的Eureka Server實(shí)例,該實(shí)例將會(huì)接受其他微服務(wù)的注冊(cè),并且提供給其他微服務(wù)進(jìn)行服務(wù)發(fā)現(xiàn)和調(diào)用。這樣可以方便地構(gòu)建基于Eureka的服務(wù)注冊(cè)與發(fā)現(xiàn)系統(tǒng)。
注意:@Enable開頭的注解都表示:啟用某種特定的功能或配置。因?yàn)樗鼈兊闹饕饔檬情_啟一些特定的功能或配置選項(xiàng)。
2.3 編寫OpenFeign的客戶端
//聲明一個(gè)Feign客戶端,value屬性指定了要調(diào)用的服務(wù)的名稱 //value屬性指定的服務(wù)名稱去服務(wù)注冊(cè)中心尋找對(duì)應(yīng)的服務(wù),無需手動(dòng)編寫HTTP請(qǐng)求代碼 @FeignClient(value = "product-service",path = "/product") public interface ProductApi { @RequestMapping("/product/{productId}")//指定跟哪個(gè)方法進(jìn)行綁定 Product getProduct(@PathVariable Integer productId); }
@FeignClient 注解作?在接?上, 參數(shù)說明:
- name/value:指定FeignClient的名稱, 也就是微服務(wù)的名稱,?于服務(wù)發(fā)現(xiàn), Feign底層會(huì)使?
- Spring Cloud LoadBalance進(jìn)?負(fù)載均衡. 也可以使? url 屬性指定?個(gè)具體的url.
- path: 定義當(dāng)前FeignClient的統(tǒng)?前綴.
2.4 修改遠(yuǎn)程調(diào)用的方法
3. OpenFeign的參數(shù)傳遞
這里介紹參數(shù)傳遞就是因?yàn)椋篛penFeign接收參數(shù)使用的注解和SpringMvc不同。
傳遞簡(jiǎn)單類型參數(shù) -> @RequestParam("參數(shù)名")
這里的注解是必須書寫的,不像mvc會(huì)根據(jù)名稱自動(dòng)映射,你不寫就是null。
@RequestMapping("/p1") String p1(@RequestParam("id") Integer id); @RequestMapping("/p2") String o2(@RequestParam("id") Integer id, @RequestParam("name") String name);
傳遞JavaBean對(duì)象 -> @SpringQueryMap
傳遞Json 數(shù)據(jù) -> @RequestBody
4.最佳實(shí)踐
最佳實(shí)踐:其實(shí)也就是經(jīng)過歷史的迭代, 在項(xiàng)?中的實(shí)踐過程中, 總結(jié)出來的最好的使用方式。
最佳實(shí)踐就是幫助我們繼續(xù)優(yōu)化代碼,我們也能看出來, Feign的客戶端與服務(wù)提供者的controller代碼非常相似。所以我們可以對(duì)其抽取一個(gè)類,需要的繼承即可?;蛘呶覀兛梢猿槿〕梢粋€(gè)jar包需要的時(shí)候?qū)胍蕾嚰纯伞?/p>
4.1 Feign 的繼承
Feign ?持繼承的方式, 我們可以把?些常?的操作封裝到接口里。我們可以定義好?個(gè)接?, 服務(wù)提供?實(shí)現(xiàn)這個(gè)接?, 服務(wù)消費(fèi)?編寫Feign 接?的時(shí)候, 直接繼承這個(gè)接?。 具體參考: Spring Cloud OpenFeign Features :: Spring Cloud Openfeign 因?yàn)檫@種不是最優(yōu)的解法,我就不過多介紹了。
4.2 Feign 的抽取
官?推薦Feign的使??式為繼承的方式, 但是企業(yè)開發(fā)中, 更多是把Feign接?抽取為?個(gè)獨(dú)?的模塊 (做法和繼承相似, 但理念不同).
操作?法: 將Feign的Client抽取為?個(gè)獨(dú)?的模塊, 并把涉及到的實(shí)體類等都放在這個(gè)模塊中, 打成?個(gè)Jar. 服務(wù) 消費(fèi)?只需要依賴該Jar包即可. 這種?式在企業(yè)中?較常?, Jar包通常由服務(wù)提供?來實(shí)現(xiàn).
實(shí)現(xiàn)步驟
1.創(chuàng)建新的模塊
2. 引入maven的依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
3. 編寫api
@FeignClient(value = "product-service",path = "/product") public interface ProductApiInterface { @RequestMapping("/{productId}")//指定跟哪個(gè)方法進(jìn)行綁定 Product getProduct(@PathVariable Integer productId); }
4.安裝到本地倉庫
5.服務(wù)消費(fèi)方引入依賴并將其注入
<!--引入自定義的product的feign客戶端--> <dependency> <groupId>com.csy</groupId> <artifactId>product-api</artifactId> <version>1.0-SNAPSHOT</version> <scope>compile</scope> </dependency>
@EnableFeignClients(clients = {ProductApiInterface.class}) 在配置類,修改就會(huì)掃描,否則 SpringBoot只會(huì)掃描當(dāng)前包及其子包的Bean,所以第三方Bean需要聲明在配置類,但是 Feign開發(fā)商也想到這一點(diǎn)了,就提供了對(duì)應(yīng)的屬性。
不設(shè)置就會(huì)報(bào)下述錯(cuò)誤:
你@Autowired注入了productApi這個(gè)Bean,但是我沒有找到。
結(jié)語
通過本文的介紹,我們了解了什么是OpenFeign以及如何在Spring Cloud應(yīng)用中使用
OpenFeign來實(shí)現(xiàn)微服務(wù)之間的通信。OpenFeign的強(qiáng)大功能和Spring Cloud的深度集成使得微服
以上就是SpringCloud整合OpenFeign實(shí)現(xiàn)微服務(wù)間的通信的詳細(xì)內(nèi)容,更多關(guān)于SpringCloud OpenFeign通信的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
簡(jiǎn)單學(xué)習(xí)Java+MongoDB
本文給大家介紹的是如何簡(jiǎn)單的使用java+MongoDB實(shí)現(xiàn)數(shù)據(jù)調(diào)用的問題,非常的實(shí)用,有需要的小伙伴可以參考下2016-03-03關(guān)于Filter中獲取請(qǐng)求體body后再次讀取的問題
這篇文章主要介紹了關(guān)于Filter中獲取請(qǐng)求體body后再次讀取的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03劍指Offer之Java算法習(xí)題精講數(shù)組與字符串
跟著思路走,之后從簡(jiǎn)單題入手,反復(fù)去看,做過之后可能會(huì)忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會(huì)發(fā)現(xiàn)質(zhì)的變化2022-03-03JavaWeb驗(yàn)證碼校驗(yàn)功能代碼實(shí)例
這篇文章主要介紹了JavaWeb驗(yàn)證碼校驗(yàn)功能代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04java實(shí)現(xiàn)學(xué)生宿舍系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)學(xué)生宿舍系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Java Web中解決路徑(絕對(duì)路徑與相對(duì)路徑)問題
這篇文章主要介紹了Java Web中解決路徑問題的相關(guān)資料,java 文件路徑有絕對(duì)路徑與相對(duì)路徑,這里提供了幾種方法解決所有路徑問題,需要的朋友可以參考下2017-01-01