摘要:那么為什么可以帶給我們這樣的完美編碼體驗呢實際上,這完全歸功于的封裝,由于在服務注冊與發現客戶端負載均衡等方面都做了很好的抽象,而上層應用方面依賴的都是這些抽象接口,而非針對某個具體中間件的實現。
通過《Spring Cloud Alibaba基礎教程:使用Nacos實現服務注冊與發現》一文的學習,我們已經學會如何使用Nacos來實現服務的注冊與發現,同時也介紹如何通過LoadBalancerClient接口來獲取某個服務的具體實例,并根據實例信息來發起服務接口消費請求。但是這樣的做法需要我們手工的去編寫服務選取、鏈接拼接等繁瑣的工作,對于開發人員來說非常的不友好。所以接下來,我們再來看看除此之外,還支持哪些其他的服務消費方式。
使用RestTemplate在之前的例子中,已經使用過RestTemplate來向服務的某個具體實例發起HTTP請求,但是具體的請求路徑是通過拼接完成的,對于開發體驗并不好。但是,實際上,在Spring Cloud中對RestTemplate做了增強,只需要稍加配置,就能簡化之前的調用方式。
比如:
@EnableDiscoveryClient @SpringBootApplication public class TestApplication { public static void main(String[] args) { SpringApplication.run(TestApplication.class, args); } @Slf4j @RestController static class TestController { @Autowired RestTemplate restTemplate; @GetMapping("/test") public String test() { String result = restTemplate.getForObject("http://alibaba-nacos-discovery-server/hello?name=didi", String.class); return "Return : " + result; } } @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } }
可以看到,在定義RestTemplate的時候,增加了@LoadBalanced注解,而在真正調用服務接口的時候,原來host部分是通過手工拼接ip和端口的,直接采用服務名的時候來寫請求路徑即可。在真正調用的時候,Spring Cloud會將請求攔截下來,然后通過負載均衡器選出節點,并替換服務名部分為具體的ip和端口,從而實現基于服務名的負載均衡調用。
關于這種方式,可在文末倉庫查看完整代碼示例。而對于這種方式的實現原理,可以參考我之前寫的這篇文章的前半部分:Spring Cloud源碼分析(二)Ribbon
使用WebClientWebClient是Spring 5中最新引入的,可以將其理解為reactive版的RestTemplate。下面舉個具體的例子,它將實現與上面RestTemplate一樣的請求調用:
@EnableDiscoveryClient @SpringBootApplication public class TestApplication { public static void main(String[] args) { SpringApplication.run(TestApplication.class, args); } @Slf4j @RestController static class TestController { @Autowired private WebClient.Builder webClientBuilder; @GetMapping("/test") public Monotest() { Mono result = webClientBuilder.build() .get() .uri("http://alibaba-nacos-discovery-server/hello?name=didi") .retrieve() .bodyToMono(String.class); return result; } } @Bean @LoadBalanced public WebClient.Builder loadBalancedWebClientBuilder() { return WebClient.builder(); } }
可以看到,在定義WebClient.Builder的時候,也增加了@LoadBalanced注解,其原理與之前的RestTemplate時一樣的。關于WebClient的完整例子也可以通過在文末的倉庫中查看。
使用Feign上面介紹的RestTemplate和WebClient都是Spring自己封裝的工具,下面介紹一個Netflix OSS中的成員,通過它可以更方便的定義和使用服務消費客戶端。下面也舉一個具體的例子,其實現內容與上面兩種方式結果一致:
第一步:在pom.xml中增加openfeign的依賴:
org.springframework.cloud spring-cloud-starter-openfeign
第二步:定義Feign客戶端和使用Feign客戶端:
@EnableDiscoveryClient @SpringBootApplication @EnableFeignClients public class TestApplication { public static void main(String[] args) { SpringApplication.run(TestApplication.class, args); } @Slf4j @RestController static class TestController { @Autowired Client 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客戶端的功能;然后又創建一個Feign的客戶端接口定義。使用@FeignClient注解來指定這個接口所要調用的服務名稱,接口中定義的各個函數使用Spring MVC的注解就可以來綁定服務提供方的REST接口,比如下面就是綁定alibaba-nacos-discovery-server服務的/hello接口的例子。最后,在Controller中,注入了Client接口的實現,并調用hello方法來觸發對服務提供方的調用。關于使用Feign的完整例子也可以通過在文末的倉庫中查看。
深入思考如果之前已經用過Spring Cloud的讀者,肯定會這樣的感受:不論我用的是RestTempalte也好、還是用的WebClient也好,還是用的Feign也好,似乎跟我用不用Nacos沒啥關系?我們在之前介紹Eureka和Consul的時候,也都是用同樣的方法來實現服務調用的,不是嗎?
確實是這樣,對于Spring Cloud老手來說,就算我們更換了Nacos作為新的服務注冊中心,其實對于我們應用層面的代碼是沒有影響的。那么為什么Spring Cloud可以帶給我們這樣的完美編碼體驗呢?實際上,這完全歸功于Spring Cloud Common的封裝,由于在服務注冊與發現、客戶端負載均衡等方面都做了很好的抽象,而上層應用方面依賴的都是這些抽象接口,而非針對某個具體中間件的實現。所以,在Spring Cloud中,我們可以很方便的去切換服務治理方面的中間件。
代碼示例本文示例讀者可以通過查看下面倉庫:
Github:https://github.com/dyc87112/SpringCloud-Learning/
Gitee:https://gitee.com/didispace/SpringCloud-Learning/
其中,本文的幾種示例可查看下面的幾個項目:
alibaba-nacos-discovery-server:服務提供者,必須啟動
alibaba-nacos-discovery-client-resttemplate:使用RestTemplate消費
alibaba-nacos-discovery-client-webclient:使用WebClient消費
alibaba-nacos-discovery-client-feign:使用Feign消費
如果您對這些感興趣,歡迎star、follow、收藏、轉發給予支持!
以下專題教程也許您會有興趣Spring Boot基礎教程
Spring Cloud基礎教程
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/11962.html
摘要:通過本教程的前兩篇基礎教程使用實現服務注冊與發現基礎教程支持的幾種服務消費方式我們已經學會了,如何利用實現服務的注冊與發現。簡介除了實現了服務的注冊發現之外,還將配置中心功能整合在了一起。同時,值必須與上一階段中創建的配置匹配除了或者后綴。 通過本教程的前兩篇: 《Spring Cloud Alibaba基礎教程:使用Nacos實現服務注冊與發現》 《Spring Cloud Ali...
摘要:之前開放過一臺公益給大家,以方便大家在閱讀我博客中教程時候做實驗。由于目前在連載,所以對應的也部署了一臺,并且也開放出來,給大家學習測試之用。 之前開放過一臺公益Eureka Server給大家,以方便大家在閱讀我博客中教程時候做實驗。由于目前在連載Spring Cloud Alibaba,所以對應的也部署了一臺Nacos,并且也開放出來,給大家學習測試之用。 Nacos控制臺 ...
摘要:下表整理了目前的版本與版本的兼容關系還未所以,不論您是在讀我的基礎教程基礎教程還是正在連載的系列教程。 這篇博文是臨時增加出來的內容,主要是由于最近連載《Spring Cloud Alibaba基礎教程》系列的時候,碰到讀者咨詢的大量問題中存在一個比較普遍的問題:版本的選擇。其實這類問題,在之前寫Spring Cloud基礎教程的時候,就已經發過一篇《聊聊Spring Cloud版本的...
摘要:第二步在應用的配置文件中,增加環境配置第三步啟動應用,我們可以看到日志中打印了,加載的配置文件使用實現在中是用來對做集合管理的重要概念。深入思考上面我們分別利用配置管理功能中的幾個不同緯度來實現多環境的配置管理。 前情回顧: 《Spring Cloud Alibaba基礎教程:使用Nacos實現服務注冊與發現》 《Spring Cloud Alibaba基礎教程:支持的幾種服務消費方...
摘要:最近對基礎教程系列的催更比較多,說一下最近的近況因為打算一起更新。再次,對于中國用戶來說,還有一個非常特殊的意義它將曾經紅極一時的,以及阿里巴巴的強力消息中間件融入體系。 最近對《Spring Cloud Alibaba基礎教程》系列的催更比較多,說一下最近的近況:因為打算Spring Boot 2.x一起更新。所以一直在改博客Spring Boot專題頁和Git倉庫的組織。由于前端技...
閱讀 712·2021-10-14 09:42
閱讀 1966·2021-09-22 15:04
閱讀 1570·2019-08-30 12:44
閱讀 2133·2019-08-29 13:29
閱讀 2729·2019-08-29 12:51
閱讀 542·2019-08-26 18:18
閱讀 697·2019-08-26 13:43
閱讀 2803·2019-08-26 13:38