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