(22)SpringCloud-使用Feign呼叫服務介面

JIAN2發表於2022-11-01

JAVA 專案中介面呼叫怎麼做?

1)Httpclient
HttpClient 是 Apache Jakarta Common 下的子專案,用來提供高效的、最新的、功能豐富的支援 Http 協議的客戶端程式設計工具包,並且它支援 HTTP 協議最新版本和建議。

HttpClient 相比傳統 JDK 自帶的 URLConnection,提升了易用性和靈活性,使客戶端傳送 HTTP 請求變得容易,提高了開發的效率。

2)Okhttp
一個處理網路請求的開源專案,是安卓端最火的輕量級框架,由 Square 公司貢獻,用於替代 HttpUrlConnection 和 Apache HttpClient。OkHttp 擁有簡潔的 API、高效的效能,並支援多種協議(HTTP/2 和 SPDY)。

3)HttpURLConnection
HttpURLConnection 是 Java 的標準類,它繼承自 URLConnection,可用於向指定網站傳送 GET 請求、POST 請求。HttpURLConnection 使用比較複雜,不像 HttpClient 那樣容易使用。

4)RestTemplate
RestTemplate 是 Spring 提供的用於訪問 Rest 服務的客戶端,RestTemplate 提供了多種便捷訪問遠端 HTTP 服務的方法,能夠大大提高客戶端的編寫效率。

上面介紹的是最常見的幾種呼叫介面的方法,我們下面要介紹的方法比上面的更簡單、方便,它就是 Feign。

Feign 是一個宣告式的 REST 客戶端,它能讓 REST 呼叫更加簡單。Feign 供了 HTTP 請求的模板,透過編寫簡單的介面和插入註解,就可以定義好 HTTP 請求的引數、格式、地址等資訊。

而 Feign 則會完全代理 HTTP 請求,我們只需要像呼叫方法一樣呼叫它就可以完成服務請求及相關處理。

Spring Cloud 對 Feign 進行了封裝,使其支援 SpringMVC 標準註解和 HttpMessageConverters。Feign 可以與 Eureka 和 Ribbon 組合使用以支援負載均衡。需要框架原始碼的朋友可以看我個人簡介聯絡我

在Spring Cloud中整合Feign
在 Spring Cloud 中整合 Feign 的步驟相當簡單,首先還是加入 Feign 的依賴,程式碼如下所示。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

在啟動類上加 @EnableFeignClients 註解,如果你的 Feign 介面定義跟你的啟動類不在同一個包名下,還需要制定掃描的包名 @EnableFeignClients(basePackages=“com.fangjia.api.client”),程式碼如下所示。

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.fangjia.api.client")
public class FshSubstitutionServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(FshSubstitutionServiceApplication.class, args);
    }
}


使用Feign呼叫介面
定義一個 Feign 的客戶端,以介面形式存在,程式碼如下所示。

@FeignClient(value = "eureka-client-user-service")
public interface UserRemoteClient {
    @GetMapping("/user/hello")
    String hello();
}


首先我們來看介面上加的 @FeignClient 註解。這個註解標識當前是一個 Feign 的客戶端,value 屬性是對應的服務名稱,也就是你需要呼叫哪個服務中的介面。

定義方法時直接複製介面的定義即可,當然還有另一種做法,就是將介面單獨抽出來定義,然後在 Controller 中實現介面。

在呼叫的客戶端中也實現了介面,從而達到介面共用的目的。我這裡的做法是不共用的,即單獨建立一個 API Client 的公共專案,基於約定的模式,每寫一個介面就要對應寫一個呼叫的 Client,後面打成公共的 jar,這樣無論是哪個專案需要呼叫介面,只要引入公共的介面 SDK jar 即可,不用重新定義一遍了。

定義之後可以直接透過注入 UserRemoteClient 來呼叫,這對於開發人員來說就像呼叫本地方法一樣。

接下來採用 Feign 來呼叫 /user/hello 介面,程式碼如下所示。

@Autowired
private UserRemoteClient userRemoteClient;
@GetMapping("/callHello")
public String callHello() {
    //return restTemplate.getForObject(");
    //String result = restTemplate.getForObject(");
    String result = userRemoteClient.hello();
    System.out.println("呼叫結果:" + result);
    return result;
}

透過跟註釋掉的程式碼相比可以發現,我們的呼叫方式變得越來越簡單了,從最開始的指定地址,到後面透過 Eureka 中的服務名稱來呼叫,再到現在直接透過定義介面來呼叫。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70006413/viewspace-2921225/,如需轉載,請註明出處,否則將追究法律責任。

相關文章