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

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

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

一、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)

  1. 如果你傳遞的參數(shù),比較復(fù)雜時(shí),默認(rèn)會(huì)采用 POST 的請(qǐng)求方式。
  2. 傳遞單個(gè)參數(shù)時(shí),推薦使用 @PathVariable (Restful 風(fēng)格),如果傳遞的單個(gè)參數(shù)比較多,這里也可以采用 @RequestParam ,不要省略 value 屬性。
  3. 傳遞對(duì)象信息時(shí),統(tǒng)一采用 json 的方式,添加 @RequestBody 。
  4. 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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

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

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

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

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

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

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

    JavaWeb中導(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的使用(一文帶你了解)

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

    Springboot項(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-03
  • Java實(shí)現(xiàn)把文件壓縮成zip文件的示例代碼

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

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

    Java中對(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-07
  • Java的Swing編程中使用SwingWorker線程模式及頂層容器

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

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

    IDEA中 Getter、Setter 注解不起作用的問(wèn)題如何解決

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

最新評(píng)論