欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringCloud中的Feign服務(wù)間的調(diào)用詳解

 更新時間:2024年01月31日 10:07:43   作者:卷不動躺不平的粥  
這篇文章主要介紹了SpringCloud中的Feign服務(wù)間的調(diào)用詳解,Feign 是一個聲明式的 REST 客戶端,它能讓 REST 調(diào)用更加簡單,Feign 供了 HTTP 請求的模板,通過編寫簡單的接口和插入注解,就可以定義好 HTTP 請求的參數(shù)、格式、地址等信息,需要的朋友可以參考下

一、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 的注意事項

  1. 如果你傳遞的參數(shù),比較復(fù)雜時,默認(rèn)會采用 POST 的請求方式。
  2. 傳遞單個參數(shù)時,推薦使用 @PathVariable (Restful 風(fēng)格),如果傳遞的單個參數(shù)比較多,這里也可以采用 @RequestParam ,不要省略 value 屬性。
  3. 傳遞對象信息時,統(tǒng)一采用 json 的方式,添加 @RequestBody 。
  4. 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使用toString方法展示枚舉字段信息

    Java使用toString方法展示枚舉字段信息

    這篇文章主要為大家詳細(xì)介紹了如何在Java中通過重寫枚舉的toString方法來展示枚舉實例的字段信息,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-01-01
  • java使用OpenCV從視頻文件中獲取幀

    java使用OpenCV從視頻文件中獲取幀

    這篇文章主要為大家詳細(xì)介紹了java使用OpenCV從視頻文件中獲取幀,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • 使用Java如何對復(fù)雜的數(shù)據(jù)類型排序和比大小

    使用Java如何對復(fù)雜的數(shù)據(jù)類型排序和比大小

    我相信大家在第一次接觸算法的時候,最先接觸的肯定也是從排序算法開始的,下面這篇文章主要給大家介紹了關(guān)于使用Java如何對復(fù)雜的數(shù)據(jù)類型排序和比大小的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • JavaWeb中導(dǎo)出excel文件的簡單方法

    JavaWeb中導(dǎo)出excel文件的簡單方法

    下面小編就為大家?guī)硪黄狫avaWeb中導(dǎo)出excel文件的簡單方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • 做java這么久了居然還不知道JSON的使用(一文帶你了解)

    做java這么久了居然還不知道JSON的使用(一文帶你了解)

    這篇文章主要介紹了做java這么久了居然還不知道JSON的使用(一文帶你了解),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • Springboot項目啟動優(yōu)化方式

    Springboot項目啟動優(yōu)化方式

    文章詳細(xì)介紹了Spring Boot項目的啟動優(yōu)化策略,包括懶加載、異步初始化、精簡依賴、JVM優(yōu)化和使用Actuator監(jiān)控等方法,旨在提高項目的啟動速度和運行性能
    2025-03-03
  • Java實現(xiàn)把文件壓縮成zip文件的示例代碼

    Java實現(xiàn)把文件壓縮成zip文件的示例代碼

    這篇文章主要為大家介紹了如何通過Java語言實現(xiàn)將文件壓縮成zip文件,本文中示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • Java中對list map根據(jù)map某個key值進(jìn)行排序的方法

    Java中對list map根據(jù)map某個key值進(jìn)行排序的方法

    今天小編就為大家分享一篇Java中對list map根據(jù)map某個key值進(jìn)行排序的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Java的Swing編程中使用SwingWorker線程模式及頂層容器

    Java的Swing編程中使用SwingWorker線程模式及頂層容器

    這篇文章主要介紹了在Java的Swing編程中使用SwingWorker線程模式及頂層容器的方法,適用于客戶端圖形化界面軟件的開發(fā),需要的朋友可以參考下
    2016-01-01
  • IDEA中 Getter、Setter 注解不起作用的問題如何解決

    IDEA中 Getter、Setter 注解不起作用的問題如何解決

    這篇文章主要介紹了IDEA中 Getter、Setter 注解不起作用的問題如何解決,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08

最新評論