SpringCloud中的Feign服務(wù)間的調(diào)用詳解
一、Feign 的簡介
Feign 可以幫助我們實現(xiàn)面向接口編程,就直接調(diào)用其他服務(wù),簡化開發(fā)。
Feign 是一個聲明式的 REST 客戶端,它能讓 REST 調(diào)用更加簡單。Feign 供了 HTTP 請求的模板,通過編寫簡單的接口和插入注解,就可以定義好 HTTP 請求的參數(shù)、格式、地址等信息。
而 Feign 則會完全代理 HTTP 請求,我們只需要像調(diào)用方法一樣調(diào)用它就可以完成服務(wù)請求及相關(guān)處理。
Spring Cloud 對 Feign 進(jìn)行了封裝,使其支持 SpringMVC 標(biāo)準(zhǔn)注解和 HttpMessageConverters。Feign 可以與 Eureka 和 Ribbon 組合使用以支持負(fù)載均衡。
二、Feign 的簡單使用
2.1 導(dǎo)入相關(guān)依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
2.2 添加 @EnableFeignClients 注解
在啟動類上加 @EnableFeignClients 注解,如果你的 Feign 接口定義跟你的啟動類不在同一個包名下,還需要制定掃描的包名 @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)建一個接口,并且和 search 模塊做映射
@FeignClient 注解:這個注解標(biāo)識當(dāng)前是一個 Feign 的客戶端,value 屬性是對應(yīng)的服務(wù)名稱,也就是你需要調(diào)用哪個服務(wù)中的接口。
//指定服務(wù)名稱 @FeignClient("SEARCH") public interface SearchClient { //value -> 目標(biāo)服務(wù)的請求路徑,method -> 映射請求方式 @RequestMapping(value = "/search",method = RequestMethod.GET) public String search(); }
定義方法時直接復(fù)制接口的定義即可,當(dāng)然還有另一種做法,就是將接口單獨抽出來定義,然后在 Controller 中實現(xiàn)接口。
2.4 測試使用
定義之后可以直接通過注入 SearchClient 來調(diào)用。
@Autowired private SearchClient searchClient; @GetMapping("/customer") public String customer() { String result = searchClient.search(); return result; }
三種方式對比:
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 的注意事項
- 如果你傳遞的參數(shù),比較復(fù)雜時,默認(rèn)會采用 POST 的請求方式。
- 傳遞單個參數(shù)時,推薦使用 @PathVariable (Restful 風(fēng)格),如果傳遞的單個參數(shù)比較多,這里也可以采用 @RequestParam ,不要省略 value 屬性。
- 傳遞對象信息時,統(tǒng)一采用 json 的方式,添加 @RequestBody 。
- Client接口必須采用 @RequestMapping 。
3.2 使用
3.2.1 給服務(wù)的提供者和消費者編寫實體類
@Data @AllArgsConstructor @NoArgsConstructor public class Customer { private Integer id; private String name; private Integer age; }
3.2.2 準(zhǔn)備服務(wù)提供者的接口
在 Search 模塊中編寫三個接口。
@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ù)雜,會自動轉(zhuǎn)化成POST請求 @RequestMapping(value = "/save", method = RequestMethod.GET) public Customer save(@RequestBody Customer customer); }
四、Feign 的 Fallback
Fallback可以幫助我們在使用Feign去調(diào)用另一個服務(wù)時,如果出現(xiàn)了問題,走服務(wù)降級,返回一個錯誤的數(shù)據(jù),避免功能因為一個服務(wù)出現(xiàn)問題,全部失效。
4.1 Fallback的使用
4.1.1 自定義 FeignClient 接口
創(chuàng)建一個POJO類,實現(xiàn)自定義 FeignClient 接口
@Component public class SearchClientFallBack implements SearchClient { @Override public String search() { return "search出現(xià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 接口中,通過 @FeignClient 的 fallback 屬性指定自定義的POJO類。
@FeignClient(value = "SEARCH",fallback = SearchClientFallBack.class) public interface SearchClient { ......... }
4.1.3 修改配置文件
# fallback feign: hystrix: enabled: true
4.2 遇到的問題(FallBackFactory)
當(dāng) Search 模塊出現(xiàn)問題時,錯誤的信息會返回給前端,但是服務(wù)的調(diào)用者無法知道具體的錯誤信息是什么,通過 FallBackFactory 的方式去解決這個問題。
4.2.1 創(chuàng)建 POJO 類實現(xiàn) FallBackFactory
- 創(chuàng)建一個類實現(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Java如何對復(fù)雜的數(shù)據(jù)類型排序和比大小
我相信大家在第一次接觸算法的時候,最先接觸的肯定也是從排序算法開始的,下面這篇文章主要給大家介紹了關(guān)于使用Java如何對復(fù)雜的數(shù)據(jù)類型排序和比大小的相關(guān)資料,需要的朋友可以參考下2023-12-12做java這么久了居然還不知道JSON的使用(一文帶你了解)
這篇文章主要介紹了做java這么久了居然還不知道JSON的使用(一文帶你了解),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07Java中對list map根據(jù)map某個key值進(jìn)行排序的方法
今天小編就為大家分享一篇Java中對list map根據(jù)map某個key值進(jìn)行排序的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07Java的Swing編程中使用SwingWorker線程模式及頂層容器
這篇文章主要介紹了在Java的Swing編程中使用SwingWorker線程模式及頂層容器的方法,適用于客戶端圖形化界面軟件的開發(fā),需要的朋友可以參考下2016-01-01IDEA中 Getter、Setter 注解不起作用的問題如何解決
這篇文章主要介紹了IDEA中 Getter、Setter 注解不起作用的問題如何解決,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08