Spring Cloud詳解實現(xiàn)聲明式微服務(wù)調(diào)用OpenFeign方法
OpenFeign介紹
一開始,我們使用原生的 DiscoveryClient 發(fā)現(xiàn)服務(wù)和使用RestTemplate進行服務(wù)間調(diào)用,然后我們自己手動開發(fā)了一個負載均衡組件,最后介紹了負載均衡組件Ribbon。每個章節(jié)調(diào)用服務(wù)的方式也有所不同,共同點則是都是基于RestTemplate 來實現(xiàn)的,想必大家都會覺得這樣的調(diào)用方式有點麻煩,每次調(diào)用前都要寫請求協(xié)議,服務(wù)名稱,接口名稱、組裝參數(shù)、處理響應(yīng)數(shù)據(jù)類型,這些都是一些重復(fù)的工作,代碼也都高度相似,每次請求只有 URL 不同,請求方法不同、參數(shù)不同,其它東西基本都是一樣的,既然如此,那有沒有辦法簡化請求呢?本文我們要聊的聲明式微服務(wù)調(diào)用OpenFeign 。
OpenFeign是一個顯示聲明式的WebService客戶端。使用OpenFeign能讓編寫Web Service客戶端更加簡單。使用時只需定義服務(wù)接口,然后在上面添加注解。OpenFeign也支持可拔插式的編碼和解碼器。spring cloud對feign進行了封裝,使其支持MVC注解和HttpMessageConverts。和eureka(服務(wù)注冊中心)和ribbon組合可以實現(xiàn)負載均衡。在Spring Cloud中使用OpenFeign,可以做到使用HTTP請求訪問遠程服務(wù),就像調(diào)用本地方法一樣的,開發(fā)者完全感知不到這是在調(diào)用遠程方法,更感知不到在訪問HTTP請求,非常的方便
- OpenFeign的設(shè)計宗旨式簡化Java Http客戶端的開發(fā)。Feign在restTemplate的基礎(chǔ)上做了進一步的封裝,由其來幫助我們定義和實現(xiàn)依賴服務(wù)接口的定義。在OpenFeign的協(xié)助下,我們只需創(chuàng)建一個接口并使用注解的方式進行配置(類似于Dao接口上面的Mapper注解)即可完成對服務(wù)提供方的接口綁定,大大簡化了Spring cloud Ribbon的開發(fā),自動封裝服務(wù)調(diào)用客戶端的開發(fā)量。
- OpenFeign集成了Ribbon,利用ribbon維護了服務(wù)列表,并且通過ribbon實現(xiàn)了客戶端的負載均衡。與ribbon不同的是,通過OpenFeign只需要定義服務(wù)綁定接口且以申明式的方法,優(yōu)雅而簡單的實現(xiàn)了服務(wù)調(diào)用。
項目實戰(zhàn)
創(chuàng)建項目
接下來,就開始我們的項目實戰(zhàn),創(chuàng)建兩個服務(wù),一個是dms(就是碼表服務(wù),提供各種下拉選項列表),一個是應(yīng)用系統(tǒng)app(實際的業(yè)務(wù)系統(tǒng))
首先創(chuàng)建名為dms的maven項目,引入依賴
<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'
編寫啟動類
@EnableDiscoveryClient @EnableFeignClients @EnableEurekaClient @SpringBootApplication public class DmsApplication { public static void main(String[] args) { SpringApplication.run(DmsApplication.class, args); } }
注意此時,我們在啟動類上面增加了@EnableFeignClients和@EnableDiscoveryClient注解。
編寫api模塊代碼,注意這是一個接口對外提供服務(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類,可以實現(xiàn)DmsApi接口,這里簡單以性別舉例:
@RestController public class DmsController implements DmsApi { @Override public String findNameByCode(String code) { switch (code){ case "0" : return "男"; case "1" : return "女"; default: return "未知"; } } }
dms模塊就開發(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,并通過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; } }
啟動類
@EnableEurekaClient @SpringBootApplication public class AppApplication { public static void main(String[] args) { SpringApplication.run(AppApplication.class, args); } }
啟動項目驗證
返回了正確的結(jié)果,當(dāng)注冊中心有多個dms服務(wù)時,調(diào)用時會自動起到負載均衡的作用。
總結(jié)
OpenFeign 是 Spring Cloud 家族的一個成員, 它最核心的作用是為 HTTP 形式的 Rest API 提供了非常簡潔高效的 RPC 調(diào)用方式。 如果說 Spring Cloud 其他成員解決的是系統(tǒng)級別的可用性,擴展性問題, 那么 OpenFeign 解決的則是與開發(fā)人員利益最為緊密的開發(fā)效率問題。這篇文章中我們學(xué)會了Feign組件的集成和基礎(chǔ)使用,下一篇文章將寫一下Feign的更多用法,一起期待吧!
到此這篇關(guān)于Spring Cloud詳解實現(xiàn)聲明式微服務(wù)調(diào)用OpenFeign方法的文章就介紹到這了,更多相關(guān)Spring Cloud OpenFeign內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot服務(wù)開啟后通過端口訪問無反應(yīng)的解決
這篇文章主要介紹了SpringBoot服務(wù)開啟后通過端口訪問無反應(yīng)的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10SpringBoot集成Swagger2構(gòu)建在線API文檔的代碼詳解
這篇文章主要介紹了SpringBoot集成Swagger2構(gòu)建在線API文檔,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12SpringBoot使用RabbitMQ延時隊列(小白必備)
這篇文章主要介紹了SpringBoot使用RabbitMQ延時隊列(小白必備),詳細的介紹延遲隊列的使用場景及其如何使用,需要的小伙伴可以一起來了解一下2019-12-12mybatis-plus使用@EnumValue處理枚舉類型的示例代碼
這篇文章主要介紹了mybatis-plus使用@EnumValue處理枚舉類型的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09mybatis的映射xml中動態(tài)設(shè)置orderby方式
這篇文章主要介紹了mybatis的映射xml中動態(tài)設(shè)置orderby方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11