通过《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@RestControllerstatic class TestController {@AutowiredRestTemplate restTemplate;@GetMapping("/test")public String test() {String result = restTemplate.getForObject("http://alibaba-nacos-discovery-server/hello?name=didi", String.class);return "Return : " + result;}}@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}}

可以看到,在定义RestTemplate的时候,增加了@LoadBalanced注解,而在真正调用服务接口的时候,原来host部分是通过手工拼接ip和端口的,直接采用服务名的时候来写请求路径即可。在真正调用的时候,Spring Cloud会将请求拦截下来,然后通过负载均衡器选出节点,并替换服务名部分为具体的ip和端口,从而实现基于服务名的负载均衡调用。
关于这种方式,可在文末仓库查看完整代码示例。而对于这种方式的实现原理,可以参考我之前写的这篇文章的前半部分:Spring Cloud源码分析(二)Ribbon

  • 使用WebClient

WebClient是Spring 5中最新引入的,可以将其理解为reactive版的RestTemplate。下面举个具体的例子,它将实现与上面RestTemplate一样的请求调用:

@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时一样的。关于WebClient的完整例子也可以通过在文末的仓库中查看。

  • 使用Feign

上面介绍的RestTemplate和WebClient都是Spring自己封装的工具,下面介绍一个Netflix OSS中的成员,通过它可以更方便的定义和使用服务消费客户端。下面也举一个具体的例子,其实现内容与上面两种方式结果一致:

第一步:在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客户端的功能;然后又创建一个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消费

本文由 程序猿DD-翟永超 创作,采用 CC BY 3.0 CN协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。

Spring Cloud Alibaba基础教程:支持的几种服务消费方式(RestTemplate、WebClient、Feign)相关推荐

  1. Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现

    自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注.虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭 ...

  2. Spring Cloud Alibaba 基础教程:Nacos 生产级版本 0.8.0

    Spring Cloud Alibaba 基础教程:Nacos 生产级版本 0.8.0 昨晚Nacos社区发布了第一个生产级版本:0.8.0.由于该版本除了Bug修复之外,还提供了几个生产管理非常重要 ...

  3. Spring Cloud Alibaba基础教程:几种服务消费方式(RestTemplate、WebClient、Feign)

    热门:Spring Cloud Greenwich.RELEASE 正式发布!一个非常有看头的版本! 通过<Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现&g ...

  4. Spring Cloud Alibaba基础教程:Nacos 生产级版本 0.8.0

    昨晚Nacos社区发布了第一个生产级版本:0.8.0.由于该版本除了Bug修复之外,还提供了几个生产管理非常重要的特性,所以觉得还是有必要写一篇讲讲这次升级,在后续的文章中也都将以0.8.0版本为基础 ...

  5. Spring Cloud Alibaba基础教程:使用Nacos作为配置中心

    通过本教程的前两篇: <Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现> <Spring Cloud Alibaba基础教程:支持的几种服务消费方 ...

  6. Spring Cloud Alibaba基础教程版本升级:0.2.1-gt;0.2.2

    最近Spring Cloud Alibaba发布了最新版本,其中包含了一些比较重要的内容,比如:Nacos 1.0.0支持,Dubbo的支持等.所以把之前的系列文章中内容以及代码案例都做了升级,其中包 ...

  7. Spring Cloud Alibaba基础教程:Sentinel Dashboard中修改规则同步到Apollo

    在之前的两篇教程中我们分别介绍了如何将Sentinel的限流规则存储到Nacos和Apollo中.同时,在文末的思考中,我都指出了这两套整合方案都存在一个不足之处:不论采用什么配置中心,限流规则都只能 ...

  8. Spring Cloud Alibaba基础教程:Sentinel Dashboard中修改规则同步到Nacos

    上一篇我们介绍了如何通过改造Sentinel Dashboard来实现修改规则之后自动同步到Apollo.下面通过这篇,详细介绍当使用Nacos作为配置中心之后,如何实现Sentinel Dashbo ...

  9. Spring Cloud Alibaba基础教程:Nacos的数据持久化 1

    前情回顾: <Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现> <Spring Cloud Alibaba基础教程:支持的几种服务消费方式> ...

最新文章

  1. 《新一代人工智能伦理规范》发布
  2. 计算机莫名其妙的游戏网页弹出,自动弹出游戏网页怎么办 自动弹出游戏网页解决方法【详解】...
  3. Android 自定义View的使用纪要!!!
  4. hp designiet 500_2020年HP学院壁纸
  5. 控制DIV内容滚动的方法,实现不用拖滚动条就可以看到最新消息
  6. asp 判断数组等于_如何在 ASP.NET Core MVC 中处理 404 错误
  7. 二分法的应用:POJ1064 Cable master
  8. Homework 1_SQL Server中由于外键约束而删除数据失败
  9. 免责协议怎么写_员工辞职时,HR得让他这样写离职申请!
  10. JSONObject.fromObject 找不到这个方法或是报错
  11. BI项目失败?看看是不是缺少了这几项闭环!
  12. a5松下驱动器参数设置表_「精品干货」松下A5伺服驱动器参数设置与常见故障解决分析...
  13. 数学基础知识总结 —— 1. 常用导数公式
  14. 幻想世界正在连接服务器,旅行物语桌面版连接不上怎么办 pc电脑版无法连接服务器怎么办...
  15. ubuntu使用 ffmpeg 转换amr格式为mp3
  16. isf文件格式改为csv格式
  17. python抓取网站访客手机号_三网运营商大数据实时截流网站访客
  18. 微信小程序 | 基于云数据库的许愿墙
  19. linux pppoe配置文件,linux pppoe服务器配置
  20. 搭建基于github的个人网站

热门文章

  1. 【经验】刚读硕士怎么感觉学机器学习和深度学习越学越不懂?
  2. CVPR 2020:如何写一篇好论文?
  3. Nginx学习笔记(二)
  4. 大数据洞察画像自动化实践
  5. 2019标杆案例复盘(中):万物互联——智能电子篇
  6. C#高性能大容量SOCKET并发(十一):编写上传客户端
  7. 解决ftp上传connection reset错误
  8. oracle表空间和用户的创建、修改、授权、查看等执行SQL
  9. DataGridView 的 CurrentCellDirtyStateChanged事件用法
  10. 职场信念:人生的12种财富(转帖)