SpringCloud中的Feign服務(wù)間的調(diào)用詳解
一、Feign 的簡(jiǎn)介
Feign 可以幫助我們實(shí)現(xiàn)面向接口編程,就直接調(diào)用其他服務(wù),簡(jiǎn)化開(kāi)發(fā)。
Feign 是一個(gè)聲明式的 REST 客戶端,它能讓 REST 調(diào)用更加簡(jiǎn)單。Feign 供了 HTTP 請(qǐng)求的模板,通過(guò)編寫簡(jiǎn)單的接口和插入注解,就可以定義好 HTTP 請(qǐng)求的參數(shù)、格式、地址等信息。
而 Feign 則會(huì)完全代理 HTTP 請(qǐng)求,我們只需要像調(diào)用方法一樣調(diào)用它就可以完成服務(wù)請(qǐng)求及相關(guān)處理。
Spring Cloud 對(duì) Feign 進(jìn)行了封裝,使其支持 SpringMVC 標(biāo)準(zhǔn)注解和 HttpMessageConverters。Feign 可以與 Eureka 和 Ribbon 組合使用以支持負(fù)載均衡。
二、Feign 的簡(jiǎn)單使用
2.1 導(dǎo)入相關(guān)依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
2.2 添加 @EnableFeignClients 注解
在啟動(dòng)類上加 @EnableFeignClients 注解,如果你的 Feign 接口定義跟你的啟動(dòng)類不在同一個(gè)包名下,還需要制定掃描的包名 @EnableFeignClients(basePackages=“com.fangjia.api.client”),代碼如下所示。
@EnableEurekaClient @SpringBootApplication @EnableFeignClients public class CustomerApplication { public static void main(String[] args) { SpringApplication.run(CustomerApplication.class,args); } }
2.3 創(chuàng)建一個(gè)接口,并且和 search 模塊做映射
@FeignClient 注解:這個(gè)注解標(biāo)識(shí)當(dāng)前是一個(gè) Feign 的客戶端,value 屬性是對(duì)應(yīng)的服務(wù)名稱,也就是你需要調(diào)用哪個(gè)服務(wù)中的接口。
//指定服務(wù)名稱 @FeignClient("SEARCH") public interface SearchClient { //value -> 目標(biāo)服務(wù)的請(qǐng)求路徑,method -> 映射請(qǐng)求方式 @RequestMapping(value = "/search",method = RequestMethod.GET) public String search(); }
定義方法時(shí)直接復(fù)制接口的定義即可,當(dāng)然還有另一種做法,就是將接口單獨(dú)抽出來(lái)定義,然后在 Controller 中實(shí)現(xiàn)接口。
2.4 測(cè)試使用
定義之后可以直接通過(guò)注入 SearchClient 來(lái)調(diào)用。
@Autowired private SearchClient searchClient; @GetMapping("/customer") public String customer() { String result = searchClient.search(); return result; }
三種方式對(duì)比:
RestTemplate 方式:
String result = restTemplate.getForObject(url+"search", String.class);
RestTemplate 整合 Ribbon方式:
String result = restTemplate.getForObject("http://SEARCH/search", String.class);
Feign 方式:
String result = searchClient.search();
三、Feign 的傳遞參數(shù)方式
3.1 Feign 的注意事項(xiàng)
- 如果你傳遞的參數(shù),比較復(fù)雜時(shí),默認(rèn)會(huì)采用 POST 的請(qǐng)求方式。
- 傳遞單個(gè)參數(shù)時(shí),推薦使用 @PathVariable (Restful 風(fēng)格),如果傳遞的單個(gè)參數(shù)比較多,這里也可以采用 @RequestParam ,不要省略 value 屬性。
- 傳遞對(duì)象信息時(shí),統(tǒng)一采用 json 的方式,添加 @RequestBody 。
- Client接口必須采用 @RequestMapping 。
3.2 使用
3.2.1 給服務(wù)的提供者和消費(fèi)者編寫實(shí)體類
@Data @AllArgsConstructor @NoArgsConstructor public class Customer { private Integer id; private String name; private Integer age; }
3.2.2 準(zhǔn)備服務(wù)提供者的接口
在 Search 模塊中編寫三個(gè)接口。
@GetMapping("/search/{id}") public Customer findById(@PathVariable Integer id){ return new Customer(id,"張三",23); } @GetMapping("/getCustomer") public Customer getCustomer(@RequestParam Integer id, @RequestParam String name){ return new Customer(id,name,23); } @PostMapping("/save") public Customer save(@RequestBody Customer customer){ return customer; }
3.2.3 在 Search 模塊中映射服務(wù)提供者的接口
@FeignClient(value = "SEARCH") public interface SearchClient { @RequestMapping(value = "/search/{id}", method = RequestMethod.GET) public Customer findById(@PathVariable(value = "id") Integer id); @RequestMapping(value = "/getCustomer", method = RequestMethod.GET) public Customer getCustomer(@RequestParam(value = "id") Integer id, @RequestParam(value = "name") String name); //這里參數(shù)復(fù)雜,會(huì)自動(dòng)轉(zhuǎn)化成POST請(qǐng)求 @RequestMapping(value = "/save", method = RequestMethod.GET) public Customer save(@RequestBody Customer customer); }
四、Feign 的 Fallback
Fallback可以幫助我們?cè)谑褂肍eign去調(diào)用另一個(gè)服務(wù)時(shí),如果出現(xiàn)了問(wèn)題,走服務(wù)降級(jí),返回一個(gè)錯(cuò)誤的數(shù)據(jù),避免功能因?yàn)橐粋€(gè)服務(wù)出現(xiàn)問(wèn)題,全部失效。
4.1 Fallback的使用
4.1.1 自定義 FeignClient 接口
創(chuàng)建一個(gè)POJO類,實(shí)現(xiàn)自定義 FeignClient 接口
@Component public class SearchClientFallBack implements SearchClient { @Override public String search() { return "search出現(xiàn)問(wèn)題了!??!"; } @Override public Customer findById(Integer id) { return null; } @Override public Customer getCustomer(Integer id, String name) { return null; } @Override public Customer save(Customer customer) { return null; } }
4.1.2 指定自定義的POJO類
在 FeignClient 接口中,通過(guò) @FeignClient 的 fallback 屬性指定自定義的POJO類。
@FeignClient(value = "SEARCH",fallback = SearchClientFallBack.class) public interface SearchClient { ......... }
4.1.3 修改配置文件
# fallback feign: hystrix: enabled: true
4.2 遇到的問(wèn)題(FallBackFactory)
當(dāng) Search 模塊出現(xiàn)問(wèn)題時(shí),錯(cuò)誤的信息會(huì)返回給前端,但是服務(wù)的調(diào)用者無(wú)法知道具體的錯(cuò)誤信息是什么,通過(guò) FallBackFactory 的方式去解決這個(gè)問(wèn)題。
4.2.1 創(chuàng)建 POJO 類實(shí)現(xiàn) FallBackFactory
- 創(chuàng)建一個(gè)類實(shí)現(xiàn) FallbackFactory ,并在泛型中指定自定義的 FeignClient 。
- 注入自定義的 Fallback 。
- 在重寫的方法中返回自定義的 Fallback 。
@Component public class SearchClientFallBackFactory implements FallbackFactory<SearchClient> { //注入Fallback @Autowired private SearchClientFallBack searchClientFallBack; @Override public SearchClient create(Throwable throwable) { throwable.printStackTrace(); return searchClientFallBack; } }
4.2.2 修改 FeignClient 中 @FeignClient 的屬性
在 @FeignClient 的 fallbackFactory 屬性中指定自定義的 fallbackFactory 。
@FeignClient(value = "SEARCH", /*fallback = SearchClientFallBack.class*/ fallbackFactory = SearchClientFallBackFactory.class ) public interface SearchClient { ......... }
到此這篇關(guān)于SpringCloud中的Feign服務(wù)間的調(diào)用詳解的文章就介紹到這了,更多相關(guān)SpringCloud的Feign內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringCloud基于Feign實(shí)現(xiàn)遠(yuǎn)程調(diào)用的問(wèn)題小結(jié)
- SpringCloud Alibaba微服務(wù)實(shí)戰(zhàn)之遠(yuǎn)程Feign請(qǐng)求頭丟失問(wèn)題解決方案
- SpringCloud OpenFeign 參數(shù)傳遞和響應(yīng)處理的詳細(xì)步驟
- Spring?cloud?OpenFeign中動(dòng)態(tài)URl、動(dòng)態(tài)傳遞接口地址代碼示例
- 解決Spring調(diào)用Feign報(bào)錯(cuò):java.io.IOException:Incomplete output stream問(wèn)題
相關(guān)文章
使用Java如何對(duì)復(fù)雜的數(shù)據(jù)類型排序和比大小
我相信大家在第一次接觸算法的時(shí)候,最先接觸的肯定也是從排序算法開(kāi)始的,下面這篇文章主要給大家介紹了關(guān)于使用Java如何對(duì)復(fù)雜的數(shù)據(jù)類型排序和比大小的相關(guān)資料,需要的朋友可以參考下2023-12-12JavaWeb中導(dǎo)出excel文件的簡(jiǎn)單方法
下面小編就為大家?guī)?lái)一篇JavaWeb中導(dǎo)出excel文件的簡(jiǎn)單方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10做java這么久了居然還不知道JSON的使用(一文帶你了解)
這篇文章主要介紹了做java這么久了居然還不知道JSON的使用(一文帶你了解),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07Springboot項(xiàng)目啟動(dòng)優(yōu)化方式
文章詳細(xì)介紹了Spring Boot項(xiàng)目的啟動(dòng)優(yōu)化策略,包括懶加載、異步初始化、精簡(jiǎn)依賴、JVM優(yōu)化和使用Actuator監(jiān)控等方法,旨在提高項(xiàng)目的啟動(dòng)速度和運(yùn)行性能2025-03-03Java實(shí)現(xiàn)把文件壓縮成zip文件的示例代碼
這篇文章主要為大家介紹了如何通過(guò)Java語(yǔ)言實(shí)現(xiàn)將文件壓縮成zip文件,本文中示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02Java中對(duì)list map根據(jù)map某個(gè)key值進(jìn)行排序的方法
今天小編就為大家分享一篇Java中對(duì)list map根據(jù)map某個(gè)key值進(jìn)行排序的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07Java的Swing編程中使用SwingWorker線程模式及頂層容器
這篇文章主要介紹了在Java的Swing編程中使用SwingWorker線程模式及頂層容器的方法,適用于客戶端圖形化界面軟件的開(kāi)發(fā),需要的朋友可以參考下2016-01-01IDEA中 Getter、Setter 注解不起作用的問(wèn)題如何解決
這篇文章主要介紹了IDEA中 Getter、Setter 注解不起作用的問(wèn)題如何解決,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08