Spring Cloud詳解實(shí)現(xiàn)聲明式微服務(wù)調(diào)用OpenFeign方法
OpenFeign介紹
一開(kāi)始,我們使用原生的 DiscoveryClient 發(fā)現(xiàn)服務(wù)和使用RestTemplate進(jìn)行服務(wù)間調(diào)用,然后我們自己手動(dòng)開(kāi)發(fā)了一個(gè)負(fù)載均衡組件,最后介紹了負(fù)載均衡組件Ribbon。每個(gè)章節(jié)調(diào)用服務(wù)的方式也有所不同,共同點(diǎn)則是都是基于RestTemplate 來(lái)實(shí)現(xiàn)的,想必大家都會(huì)覺(jué)得這樣的調(diào)用方式有點(diǎn)麻煩,每次調(diào)用前都要寫請(qǐng)求協(xié)議,服務(wù)名稱,接口名稱、組裝參數(shù)、處理響應(yīng)數(shù)據(jù)類型,這些都是一些重復(fù)的工作,代碼也都高度相似,每次請(qǐng)求只有 URL 不同,請(qǐng)求方法不同、參數(shù)不同,其它東西基本都是一樣的,既然如此,那有沒(méi)有辦法簡(jiǎn)化請(qǐng)求呢?本文我們要聊的聲明式微服務(wù)調(diào)用OpenFeign 。
OpenFeign是一個(gè)顯示聲明式的WebService客戶端。使用OpenFeign能讓編寫Web Service客戶端更加簡(jiǎn)單。使用時(shí)只需定義服務(wù)接口,然后在上面添加注解。OpenFeign也支持可拔插式的編碼和解碼器。spring cloud對(duì)feign進(jìn)行了封裝,使其支持MVC注解和HttpMessageConverts。和eureka(服務(wù)注冊(cè)中心)和ribbon組合可以實(shí)現(xiàn)負(fù)載均衡。在Spring Cloud中使用OpenFeign,可以做到使用HTTP請(qǐng)求訪問(wèn)遠(yuǎn)程服務(wù),就像調(diào)用本地方法一樣的,開(kāi)發(fā)者完全感知不到這是在調(diào)用遠(yuǎn)程方法,更感知不到在訪問(wèn)HTTP請(qǐng)求,非常的方便
- OpenFeign的設(shè)計(jì)宗旨式簡(jiǎn)化Java Http客戶端的開(kāi)發(fā)。Feign在restTemplate的基礎(chǔ)上做了進(jìn)一步的封裝,由其來(lái)幫助我們定義和實(shí)現(xiàn)依賴服務(wù)接口的定義。在OpenFeign的協(xié)助下,我們只需創(chuàng)建一個(gè)接口并使用注解的方式進(jìn)行配置(類似于Dao接口上面的Mapper注解)即可完成對(duì)服務(wù)提供方的接口綁定,大大簡(jiǎn)化了Spring cloud Ribbon的開(kāi)發(fā),自動(dòng)封裝服務(wù)調(diào)用客戶端的開(kāi)發(fā)量。
- OpenFeign集成了Ribbon,利用ribbon維護(hù)了服務(wù)列表,并且通過(guò)ribbon實(shí)現(xiàn)了客戶端的負(fù)載均衡。與ribbon不同的是,通過(guò)OpenFeign只需要定義服務(wù)綁定接口且以申明式的方法,優(yōu)雅而簡(jiǎn)單的實(shí)現(xiàn)了服務(wù)調(diào)用。
項(xiàng)目實(shí)戰(zhàn)
創(chuàng)建項(xiàng)目
接下來(lái),就開(kāi)始我們的項(xiàng)目實(shí)戰(zhàn),創(chuàng)建兩個(gè)服務(wù),一個(gè)是dms(就是碼表服務(wù),提供各種下拉選項(xiàng)列表),一個(gè)是應(yīng)用系統(tǒng)app(實(shí)際的業(yè)務(wù)系統(tǒng))
首先創(chuàng)建名為dms的maven項(xiàng)目,引入依賴
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>創(chuàng)建配置文件:
server:
port: 8003
spring:
application:
name: dms
eureka:
client:
service-url:
defaultZone: http://localhost:8001/eureka/
logging:
pattern:
console: '%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} - %msg%n'
編寫啟動(dòng)類
@EnableDiscoveryClient
@EnableFeignClients
@EnableEurekaClient
@SpringBootApplication
public class DmsApplication {
public static void main(String[] args) {
SpringApplication.run(DmsApplication.class, args);
}
}
注意此時(shí),我們?cè)趩?dòng)類上面增加了@EnableFeignClients和@EnableDiscoveryClient注解。
編寫api模塊代碼,注意這是一個(gè)接口對(duì)外提供服務(wù),接口的服務(wù)名稱是dms,根據(jù)code代碼值獲取名稱:
@FeignClient(value = "dms")
public interface DmsApi {
@RequestMapping(value="/dict/[code]", method = RequestMethod.GET)
public String findNameByCode(@PathVariable("code") String code);
}
編寫controller類,可以實(shí)現(xiàn)DmsApi接口,這里簡(jiǎn)單以性別舉例:
@RestController
public class DmsController implements DmsApi {
@Override
public String findNameByCode(String code) {
switch (code){
case "0" :
return "男";
case "1" :
return "女";
default:
return "未知";
}
}
}
dms模塊就開(kāi)發(fā)完畢了。
同樣的,創(chuàng)建app模塊,注意需要引入dms模塊,以便調(diào)用其接口
<dependencies>
<dependency>
<groupId>com.cxy965</groupId>
<artifactId>dms</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
</dependencies>
創(chuàng)建controller層:在此注入dmsApi,并通過(guò)dmsApi調(diào)用其findNameByCode()方法,即可完成服務(wù)的調(diào)用代碼!
@RestController
public class AppController {
@Autowired
private DmsApi dmsApi;
@RequestMapping("/index")
public String index(){
String nameByCode = dmsApi.findNameByCode("1");
return nameByCode;
}
}
啟動(dòng)類
@EnableEurekaClient
@SpringBootApplication
public class AppApplication {
public static void main(String[] args) {
SpringApplication.run(AppApplication.class, args);
}
}
啟動(dòng)項(xiàng)目驗(yàn)證

返回了正確的結(jié)果,當(dāng)注冊(cè)中心有多個(gè)dms服務(wù)時(shí),調(diào)用時(shí)會(huì)自動(dòng)起到負(fù)載均衡的作用。
總結(jié)
OpenFeign 是 Spring Cloud 家族的一個(gè)成員, 它最核心的作用是為 HTTP 形式的 Rest API 提供了非常簡(jiǎn)潔高效的 RPC 調(diào)用方式。 如果說(shuō) Spring Cloud 其他成員解決的是系統(tǒng)級(jí)別的可用性,擴(kuò)展性問(wèn)題, 那么 OpenFeign 解決的則是與開(kāi)發(fā)人員利益最為緊密的開(kāi)發(fā)效率問(wèn)題。這篇文章中我們學(xué)會(huì)了Feign組件的集成和基礎(chǔ)使用,下一篇文章將寫一下Feign的更多用法,一起期待吧!
到此這篇關(guān)于Spring Cloud詳解實(shí)現(xiàn)聲明式微服務(wù)調(diào)用OpenFeign方法的文章就介紹到這了,更多相關(guān)Spring Cloud OpenFeign內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實(shí)現(xiàn)圖片文字識(shí)別ocr
這篇文章主要介紹了java實(shí)現(xiàn)圖片文字識(shí)別ocr ,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-08-08
談?wù)凧ava利用原始HttpURLConnection發(fā)送POST數(shù)據(jù)
這篇文章主要給大家介紹java利用原始httpUrlConnection發(fā)送post數(shù)據(jù),設(shè)計(jì)到httpUrlConnection類的相關(guān)知識(shí),感興趣的朋友跟著小編一起學(xué)習(xí)吧2015-10-10
Java內(nèi)存釋放實(shí)現(xiàn)代碼案例
這篇文章主要介紹了Java內(nèi)存釋放實(shí)現(xiàn)代碼案例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12
java實(shí)現(xiàn)mysql操作類分享 java連接mysql
這篇文章主要介紹了java實(shí)現(xiàn)的mysql操作類示例,大家在連接數(shù)據(jù)的時(shí)候可以直接使用了2014-01-01
SpringBoot配置Access-Control-Allow-Origin教程
文章介紹了三種配置Spring Boot跨域訪問(wèn)的方法:1. 使用過(guò)濾器;2. 在WebConfig配置文件中設(shè)置;3. 通過(guò)注解配置,作者分享了個(gè)人經(jīng)驗(yàn),并鼓勵(lì)讀者支持腳本之家2025-03-03
mybatis自定義參數(shù)類型轉(zhuǎn)換器數(shù)據(jù)庫(kù)字段加密脫敏
這篇文章主要為大家介紹了mybatis自定義參數(shù)類型轉(zhuǎn)換器數(shù)據(jù)庫(kù)字段加密脫敏,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
SpringBoot整合RocketMQ批量發(fā)送消息的實(shí)現(xiàn)代碼
這篇文章主要介紹了SpringBoot整合RocketMQ批量發(fā)送消息的實(shí)現(xiàn),文中通過(guò)代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-04-04
Java String不可變性實(shí)現(xiàn)原理解析
這篇文章主要介紹了Java String不可變性實(shí)現(xiàn)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
metershpere實(shí)現(xiàn)調(diào)用自定義jar包中的方法
在MeterSphere接口測(cè)試中,面對(duì)多層循環(huán)邏輯和邏輯判斷等復(fù)雜情況,直接編寫測(cè)試用例往往顯得混亂不便,本文介紹了一個(gè)簡(jiǎn)化這一過(guò)程的方法:首先使用IDEA創(chuàng)建Maven工程,編寫所需邏輯并生成jar包;然后在MeterSphere中上傳此jar包2024-10-10

