javascript
Spring Cloud Alibaba基础教程:支持的几种服务消费方式(RestTemplate、WebClient、Feign)
通過《Spring Cloud Alibaba基礎(chǔ)教程:使用Nacos實現(xiàn)服務(wù)注冊與發(fā)現(xiàn)》一文的學(xué)習(xí),我們已經(jīng)學(xué)會如何使用Nacos來實現(xiàn)服務(wù)的注冊與發(fā)現(xiàn),同時也介紹如何通過LoadBalancerClient接口來獲取某個服務(wù)的具體實例,并根據(jù)實例信息來發(fā)起服務(wù)接口消費請求。但是這樣的做法需要我們手工的去編寫服務(wù)選取、鏈接拼接等繁瑣的工作,對于開發(fā)人員來說非常的不友好。所以接下來,我們再來看看除此之外,還支持哪些其他的服務(wù)消費方式。
- 使用RestTemplate
在之前的例子中,已經(jīng)使用過RestTemplate來向服務(wù)的某個具體實例發(fā)起HTTP請求,但是具體的請求路徑是通過拼接完成的,對于開發(fā)體驗并不好。但是,實際上,在Spring Cloud中對RestTemplate做了增強,只需要稍加配置,就能簡化之前的調(diào)用方式。
比如:
可以看到,在定義RestTemplate的時候,增加了@LoadBalanced注解,而在真正調(diào)用服務(wù)接口的時候,原來host部分是通過手工拼接ip和端口的,直接采用服務(wù)名的時候來寫請求路徑即可。在真正調(diào)用的時候,Spring Cloud會將請求攔截下來,然后通過負載均衡器選出節(jié)點,并替換服務(wù)名部分為具體的ip和端口,從而實現(xiàn)基于服務(wù)名的負載均衡調(diào)用。
關(guān)于這種方式,可在文末倉庫查看完整代碼示例。而對于這種方式的實現(xiàn)原理,可以參考我之前寫的這篇文章的前半部分:Spring Cloud源碼分析(二)Ribbon
- 使用WebClient
WebClient是Spring 5中最新引入的,可以將其理解為reactive版的RestTemplate。下面舉個具體的例子,它將實現(xiàn)與上面RestTemplate一樣的請求調(diào)用:
@EnableDiscoveryClient @SpringBootApplication public class TestApplication {public static void main(String[] args) {SpringApplication.run(TestApplication.class, args);}@Slf4j@RestControllerstatic class TestController {@Autowiredprivate WebClient.Builder webClientBuilder;@GetMapping("/test")public Mono<String> test() {Mono<String> result = webClientBuilder.build().get().uri("http://alibaba-nacos-discovery-server/hello?name=didi").retrieve().bodyToMono(String.class);return result;}}@Bean@LoadBalancedpublic WebClient.Builder loadBalancedWebClientBuilder() {return WebClient.builder();}}可以看到,在定義WebClient.Builder的時候,也增加了@LoadBalanced注解,其原理與之前的RestTemplate時一樣的。關(guān)于WebClient的完整例子也可以通過在文末的倉庫中查看。
- 使用Feign
上面介紹的RestTemplate和WebClient都是Spring自己封裝的工具,下面介紹一個Netflix OSS中的成員,通過它可以更方便的定義和使用服務(wù)消費客戶端。下面也舉一個具體的例子,其實現(xiàn)內(nèi)容與上面兩種方式結(jié)果一致:
第一步:在pom.xml中增加openfeign的依賴:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>第二步:定義Feign客戶端和使用Feign客戶端:
@EnableDiscoveryClient @SpringBootApplication @EnableFeignClients public class TestApplication {public static void main(String[] args) {SpringApplication.run(TestApplication.class, args);}@Slf4j@RestControllerstatic class TestController {@AutowiredClient client;@GetMapping("/test")public String test() {String result = client.hello("didi");return "Return : " + result;}}@FeignClient("alibaba-nacos-discovery-server")interface Client {@GetMapping("/hello")String hello(@RequestParam(name = "name") String name);}}這里主要先通過@EnableFeignClients注解開啟掃描Spring Cloud Feign客戶端的功能;然后又創(chuàng)建一個Feign的客戶端接口定義。使用@FeignClient注解來指定這個接口所要調(diào)用的服務(wù)名稱,接口中定義的各個函數(shù)使用Spring MVC的注解就可以來綁定服務(wù)提供方的REST接口,比如下面就是綁定alibaba-nacos-discovery-server服務(wù)的/hello接口的例子。最后,在Controller中,注入了Client接口的實現(xiàn),并調(diào)用hello方法來觸發(fā)對服務(wù)提供方的調(diào)用。關(guān)于使用Feign的完整例子也可以通過在文末的倉庫中查看。
- 深入思考
如果之前已經(jīng)用過Spring Cloud的讀者,肯定會這樣的感受:不論我用的是RestTempalte也好、還是用的WebClient也好,還是用的Feign也好,似乎跟我用不用Nacos沒啥關(guān)系?我們在之前介紹Eureka和Consul的時候,也都是用同樣的方法來實現(xiàn)服務(wù)調(diào)用的,不是嗎?
確實是這樣,對于Spring Cloud老手來說,就算我們更換了Nacos作為新的服務(wù)注冊中心,其實對于我們應(yīng)用層面的代碼是沒有影響的。那么為什么Spring Cloud可以帶給我們這樣的完美編碼體驗?zāi)?#xff1f;實際上,這完全歸功于Spring Cloud Common的封裝,由于在服務(wù)注冊與發(fā)現(xiàn)、客戶端負載均衡等方面都做了很好的抽象,而上層應(yīng)用方面依賴的都是這些抽象接口,而非針對某個具體中間件的實現(xiàn)。所以,在Spring Cloud中,我們可以很方便的去切換服務(wù)治理方面的中間件。
- 代碼示例
本文示例讀者可以通過查看下面?zhèn)}庫:
- Github:https://github.com/dyc87112/SpringCloud-Learning/
- Gitee:https://gitee.com/didispace/SpringCloud-Learning/
其中,本文的幾種示例可查看下面的幾個項目:
- alibaba-nacos-discovery-server:服務(wù)提供者,必須啟動
- alibaba-nacos-discovery-client-resttemplate:使用RestTemplate消費
- alibaba-nacos-discovery-client-webclient:使用WebClient消費
- alibaba-nacos-discovery-client-feign:使用Feign消費
本文由 程序猿DD-翟永超 創(chuàng)作,采用 CC BY 3.0 CN協(xié)議 進行許可。 可自由轉(zhuǎn)載、引用,但需署名作者且注明文章出處。如轉(zhuǎn)載至微信公眾號,請在文末添加作者公眾號二維碼。
總結(jié)
以上是生活随笔為你收集整理的Spring Cloud Alibaba基础教程:支持的几种服务消费方式(RestTemplate、WebClient、Feign)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows下使用curl以及常用cu
- 下一篇: Spring Cloud构建微服务架构: