SpringCloud基于Feign實(shí)現(xiàn)遠(yuǎn)程調(diào)用的問(wèn)題小結(jié)
Spring Cloud 是一個(gè)用于構(gòu)建分布式系統(tǒng)的開(kāi)發(fā)工具包,它提供了一系列的微服務(wù)組件,其中之一就是 Feign。Feign 是一種聲明式的 Web 服務(wù)客戶端,它簡(jiǎn)化了在 Spring Cloud 中進(jìn)行遠(yuǎn)程調(diào)用的過(guò)程。本文將介紹如何在 Spring Cloud 中使用 Feign 進(jìn)行遠(yuǎn)程調(diào)用。
一、引入Feign依賴
我們?cè)?Spring Cloud 項(xiàng)目的 pom.xml 中,添加 Feign 的依賴。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
二、定義和使用Feign客戶端
在遠(yuǎn)程調(diào)用的服務(wù)模塊中,創(chuàng)建一個(gè) Feign 客戶端接口
package com.example.eurekaconsumer.demos.web; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @FeignClient ("userseryice") public interface UserClient { @GetMapping("/user/{name}") User findById(@PathVariable("name") String name); }
這個(gè)接口使用了 Spring MVC 的注解,定義了遠(yuǎn)程服務(wù)的調(diào)用方式。
三、啟動(dòng)類開(kāi)啟Feign客戶端
啟動(dòng)類添加 @EnableFeignClients 注解:
package com.example.eurekaconsumer; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; @EnableFeignClients @EnableEurekaClient @SpringBootApplication public class EurekaConsumerApplication { public static void main(String[] args) { SpringApplication.run(EurekaConsumerApplication.class, args); } }
四、調(diào)用FeignClient接口
在需要應(yīng)用的模塊中,注入 Feign 客戶端接口并使用它來(lái)進(jìn)行遠(yuǎn)程調(diào)用。
package com.example.eurekaconsumer.demos.web; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; @RestController public class UserController { @Autowired private UserClient userClient; @RequestMapping("/showUser") @ResponseBody public User showUser() { User userInfo = userClient.findByName("Damon"); return userInfo; } }
可以看到,使用 Feign 調(diào)用的方法非常優(yōu)雅,可維護(hù)性也很強(qiáng)。
五、FeignClient應(yīng)用實(shí)例
1、實(shí)現(xiàn)負(fù)載均衡
我們可以用 FeignClient 代替 RestTemplate 以實(shí)現(xiàn)負(fù)載均衡。
我們先看下參考原有的 RestTemplate 實(shí)現(xiàn)負(fù)載均衡的代碼:
package com.example.eurekaconsumer.demos.web; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController public class UserController { @Autowired private RestTemplate restTemplate; @RequestMapping("/showUser") @ResponseBody public User showUser() { String baseUrl = "http://" + "eureka-provider" + "/user"; User userInfo = restTemplate.getForObject(baseUrl, User.class); return userInfo; } }
可以看到我們用 RestTemplate 實(shí)現(xiàn)負(fù)載均衡時(shí),遇到?jīng)]有參數(shù)傳遞的情況還是比較方便的,但是遇到形如 url?param1=xxx¶m2=xxx¶m3=xxx¶m4=xxx 的應(yīng)用場(chǎng)景時(shí)就需要重構(gòu)代碼,非常的不方便。
于是我們使用自帶負(fù)載均衡的 Feign 遠(yuǎn)程調(diào)用方法,改造后的方法如下:
package com.example.eurekaconsumer.demos.web; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; @RestController public class UserController { @Autowired private UserClient userClient; @RequestMapping("/showUser") @ResponseBody public User showUser() { User userInfo = userClient.findByName("Damon"); return userInfo; } }
以上是一個(gè)簡(jiǎn)單的 Spring Cloud 中基于 Feign 的遠(yuǎn)程調(diào)用的示例。通過(guò)使用 Feign,你可以以聲明式的方式定義遠(yuǎn)程服務(wù)調(diào)用,而無(wú)需手動(dòng)處理 HTTP 請(qǐng)求和響應(yīng)。這提高了代碼的可讀性和維護(hù)性,使遠(yuǎn)程調(diào)用更加方便。
Feign 替換 RestTemplate 的好處:
優(yōu)勢(shì) | 詳細(xì)內(nèi)容 |
聲明式 API 定義 | 使用Feign時(shí),你可以通過(guò)簡(jiǎn)單的注解方式聲明HTTP請(qǐng)求,而不需要手動(dòng)構(gòu)建請(qǐng)求和處理響應(yīng)。Feign的注解功能使得定義和維護(hù)API變得更加直觀和容易。 |
集成了 負(fù)載均衡 | 在Spring Cloud環(huán)境中,F(xiàn)eign與Eureka或其他服務(wù)發(fā)現(xiàn)組件集成,可以自動(dòng)進(jìn)行負(fù)載均衡。你只需通過(guò)@FeignClient 注解指定服務(wù)名,F(xiàn)eign就會(huì)在調(diào)用時(shí)自動(dòng)幫你選擇可用的服務(wù)實(shí)例。 |
支持多種編碼 器和解碼器 | Feign支持多種編碼器和解碼器,包括Jackson 、Gson 等,這使得處理不同的數(shù)據(jù)格式變得更加靈活。 |
支持 內(nèi)置斷路器 | Feign內(nèi)置了斷路器(Circuit Breaker)的支持,例如通過(guò)Hystrix。這使得在遠(yuǎn)程調(diào)用失敗或超時(shí)時(shí),可以采取快速失敗和降級(jí)的策略,提高系統(tǒng)的穩(wěn)定性和可靠性。 |
更易擴(kuò)展 | Feign的設(shè)計(jì)使得它更易于擴(kuò)展和自定義。你可以通過(guò)實(shí)現(xiàn)RequestInterceptor 接口來(lái)添加自定義的請(qǐng)求攔截器,或者通過(guò)實(shí)現(xiàn)ErrorDecoder 接口來(lái)處理自定義的錯(cuò)誤解碼邏輯。 |
簡(jiǎn)化了 配置和使用 | Feign的默認(rèn)配置較為智能,使得在大多數(shù)情況下你無(wú)需進(jìn)行額外的配置就能夠正常工作。相比之下,RestTemplate 通常需要手動(dòng)配置。 |
2、 實(shí)現(xiàn)多參數(shù)調(diào)用
當(dāng)使用 FeignClient 進(jìn)行遠(yuǎn)程調(diào)用時(shí),有時(shí)我們需要傳遞多個(gè)參數(shù)給目標(biāo)服務(wù)。使用 Feign 的多參數(shù)遠(yuǎn)程調(diào)用能夠使代碼更加優(yōu)雅,避免了手動(dòng)拼接 URL 或請(qǐng)求參數(shù)的繁瑣工作。
以下是一個(gè)關(guān)于 FeignClient 多參數(shù)遠(yuǎn)程調(diào)用的應(yīng)用實(shí)例:
① 創(chuàng)建FeignClient接口
首先,定義一個(gè)FeignClient接口,使用 @FeignClient 注解標(biāo)記目標(biāo)服務(wù)的名稱。在接口中定義多個(gè)參數(shù)的遠(yuǎn)程調(diào)用方法。
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; @FeignClient(name = "test-service") public interface TestClient { @GetMapping("/api/test") String getResource(@RequestParam("param1") String param1, @RequestParam("param2") int param2, @RequestParam("param3") boolean param3); }
在上述例子中,getResource 方法接收多個(gè)參數(shù),分別使用 @RequestParam 注解進(jìn)行標(biāo)記。
② 基于FeignClient多參數(shù)調(diào)用
注入 FeignClient 接口并使用它進(jìn)行多參數(shù)的遠(yuǎn)程調(diào)用。
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class TestController { @Autowired private TestClient testClient; @GetMapping("/test") public String test(@RequestParam("param1") String param1, @RequestParam("param2") int param2, @RequestParam("param3") boolean param3) { // 調(diào)用遠(yuǎn)程服務(wù)并傳遞多個(gè)參數(shù) String result = testClient.getResource(param1, param2, param3); return "Result from test service: " + result; } }
在這個(gè)例子中,TestController 的 test 方法接收多個(gè)參數(shù),然后使用注入的 TestClient 進(jìn)行遠(yuǎn)程調(diào)用,并傳遞這些參數(shù)。
通過(guò)使用 Feign 的方式,我們可以更加優(yōu)雅地進(jìn)行多參數(shù)的遠(yuǎn)程調(diào)用,避免了手動(dòng)拼接URL或構(gòu)建復(fù)雜的請(qǐng)求體。Feign 會(huì)自動(dòng)將參數(shù)轉(zhuǎn)化為請(qǐng)求參數(shù),使得代碼更加清晰、簡(jiǎn)潔。這種方式也符合 Spring Cloud 中微服務(wù)架構(gòu)的設(shè)計(jì)理念,提高了代碼的可讀性和可維護(hù)性。
到此這篇關(guān)于SpringCloud基于Feign遠(yuǎn)程調(diào)用的文章就介紹到這了,更多相關(guān)SpringCloud Feign遠(yuǎn)程調(diào)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java參數(shù)傳遞實(shí)現(xiàn)代碼及過(guò)程圖解
這篇文章主要介紹了Java參數(shù)傳遞實(shí)現(xiàn)代碼及過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11如何解決報(bào)錯(cuò):java.net.BindException:無(wú)法指定被請(qǐng)求的地址問(wèn)題
在Linux虛擬機(jī)上安裝并啟動(dòng)Tomcat時(shí)遇到啟動(dòng)失敗的問(wèn)題,通過(guò)檢查端口及配置文件未發(fā)現(xiàn)異常,后發(fā)現(xiàn)/etc/hosts文件中缺少localhost的映射,添加后重啟Tomcat成功,Tomcat啟動(dòng)時(shí)會(huì)檢查localhost的IP映射,缺失或錯(cuò)誤都可能導(dǎo)致啟動(dòng)失敗2024-10-10Spring Boot中的 6 種API請(qǐng)求參數(shù)讀取方式示例詳解
使用Spring Boot開(kāi)發(fā)API的時(shí)候,讀取請(qǐng)求參數(shù)是服務(wù)端編碼中最基本的一項(xiàng)操作,Spring Boot中也提供了多種機(jī)制來(lái)滿足不同的API設(shè)計(jì)要求,這篇文章主要介紹了Spring Boot中的 6 種API請(qǐng)求參數(shù)讀取方式示例詳解,需要的朋友可以參考下2024-05-052020macOS Big Sur配置Java開(kāi)發(fā)環(huán)境之jdk安裝過(guò)程
這篇文章主要介紹了2020macOS Big Sur配置Java開(kāi)發(fā)環(huán)境之jdk安裝,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02Java CharacterEncodingFilter案例詳解
這篇文章主要介紹了Java CharacterEncodingFilter案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08java 使用策略模式操作JDBC數(shù)據(jù)庫(kù)
這篇文章主要介紹了java 使用策略模式操作JDBC數(shù)據(jù)庫(kù)的相關(guān)資料,這里提供實(shí)例實(shí)現(xiàn)對(duì)JDBC數(shù)據(jù)庫(kù)的操作增刪改查的功能,需要的朋友可以參考下2017-08-08SpringBoot內(nèi)存數(shù)據(jù)導(dǎo)出成Excel的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于SpringBoot內(nèi)存數(shù)據(jù)導(dǎo)出成Excel的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12利用SpringBoot實(shí)現(xiàn)多數(shù)據(jù)源的兩種方式總結(jié)
關(guān)于動(dòng)態(tài)數(shù)據(jù)源的切換的方案有很多,核心只有兩種,一種是構(gòu)建多套環(huán)境,另一種是基于spring原生的AbstractRoutingDataSource切換,這篇文章主要給大家介紹了關(guān)于利用SpringBoot實(shí)現(xiàn)多數(shù)據(jù)源的兩種方式,需要的朋友可以參考下2021-10-10