热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringCloudAlibaba基础教程:几种服务消费方式(RestTemplate、WebClient、Feign)

热门:SpringCloudGreenwich.RELEASE正式发布!一个非常有看头的版本!通过《SpringCloudAlibaba基

640?wx_fmt=png

热门:Spring Cloud Greenwich.RELEASE 正式发布!一个非常有看头的版本!

通过《Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现》一文的学习,我们已经学会如何使用Nacos来实现服务的注册与发现,同时也介绍如何通过LoadBalancerClient接口来获取某个服务的具体实例,并根据实例信息来发起服务接口消费请求。但是这样的做法需要我们手工的去编写服务选取、链接拼接等繁琐的工作,对于开发人员来说非常的不友好。所以接下来,我们再来看看除此之外,还支持哪些其他的服务消费方式。

使用RestTemplate

在之前的例子中,已经使用过 RestTemplate来向服务的某个具体实例发起HTTP请求,但是具体的请求路径是通过拼接完成的,对于开发体验并不好。但是,实际上,在Spring Cloud中对RestTemplate做了增强,只需要稍加配置,就能简化之前的调用方式。

比如:

  1. @EnableDiscoveryClient

  2. @SpringBootApplication

  3. public class TestApplication {


  4.    public static void main(String[] args) {

  5.        SpringApplication.run(TestApplication.class, args);

  6.    }


  7.    @Slf4j

  8.    @RestController

  9.    static class TestController {


  10.        @Autowired

  11.        RestTemplate restTemplate;


  12.        @GetMapping("/test")

  13.        public String test() {

  14.            String result = restTemplate.getForObject("http://alibaba-nacos-discovery-server/hello?name=didi", String.class);

  15.            return "Return : " + result;

  16.        }

  17.    }


  18.    @Bean

  19.    @LoadBalanced

  20.    public RestTemplate restTemplate() {

  21.        return new RestTemplate();

  22.    }


  23. }

可以看到,在定义RestTemplate的时候,增加了 @LoadBalanced注解,而在真正调用服务接口的时候,原来host部分是通过手工拼接ip和端口的,直接采用服务名的时候来写请求路径即可。在真正调用的时候,Spring Cloud会将请求拦截下来,然后通过负载均衡器选出节点,并替换服务名部分为具体的ip和端口,从而实现基于服务名的负载均衡调用。

关于这种方式,可在文末仓库查看完整代码示例。而对于这种方式的实现原理,可以参考我之前写的这篇文章的前半部分:Spring Cloud源码分析(二)Ribbon

使用WebClient

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

  1. @EnableDiscoveryClient

  2. @SpringBootApplication

  3. public class TestApplication {


  4.    public static void main(String[] args) {

  5.        SpringApplication.run(TestApplication.class, args);

  6.    }


  7.    @Slf4j

  8.    @RestController

  9.    static class TestController {


  10.        @Autowired

  11.        private WebClient.Builder webClientBuilder;


  12.        @GetMapping("/test")

  13.        public Mono<String> test() {

  14.            Mono<String> result &#61; webClientBuilder.build()

  15.                    .get()

  16.                    .uri("http://alibaba-nacos-discovery-server/hello?name&#61;didi")

  17.                    .retrieve()

  18.                    .bodyToMono(String.class);

  19.            return result;

  20.        }

  21.    }


  22.    &#64;Bean

  23.    &#64;LoadBalanced

  24.    public WebClient.Builder loadBalancedWebClientBuilder() {

  25.        return WebClient.builder();

  26.    }


  27. }

可以看到&#xff0c;在定义WebClient.Builder的时候&#xff0c;也增加了 &#64;LoadBalanced注解&#xff0c;其原理与之前的RestTemplate时一样的。关于WebClient的完整例子也可以通过在文末的仓库中查看。

使用Feign

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

第一步&#xff1a;在 pom.xml中增加openfeign的依赖&#xff1a;

  1.    org.springframework.cloud

  2.    spring-cloud-starter-openfeign

第二步&#xff1a;定义Feign客户端和使用Feign客户端&#xff1a;

  1. &#64;EnableDiscoveryClient

  2. &#64;SpringBootApplication

  3. &#64;EnableFeignClients

  4. public class TestApplication {


  5.    public static void main(String[] args) {

  6.        SpringApplication.run(TestApplication.class, args);

  7.    }


  8.    &#64;Slf4j

  9.    &#64;RestController

  10.    static class TestController {


  11.        &#64;Autowired

  12.        Client client;


  13.        &#64;GetMapping("/test")

  14.        public String test() {

  15.            String result &#61; client.hello("didi");

  16.            return "Return : " &#43; result;

  17.        }

  18.    }



  19.    &#64;FeignClient("alibaba-nacos-discovery-server")

  20.    interface Client {


  21.        &#64;GetMapping("/hello")

  22.        String hello(&#64;RequestParam(name &#61; "name") String name);


  23.    }


  24. }

这里主要先通过 &#64;EnableFeignClients注解开启扫描Spring Cloud Feign客户端的功能&#xff1b;然后又创建一个Feign的客户端接口定义。使用 &#64;FeignClient注解来指定这个接口所要调用的服务名称&#xff0c;接口中定义的各个函数使用Spring MVC的注解就可以来绑定服务提供方的REST接口&#xff0c;比如下面就是绑定 alibaba-nacos-discovery-server服务的 /hello接口的例子。最后&#xff0c;在Controller中&#xff0c;注入了Client接口的实现&#xff0c;并调用hello方法来触发对服务提供方的调用。关于使用Feign的完整例子也可以通过在文末的仓库中查看。

深入思考

如果之前已经用过Spring Cloud的读者&#xff0c;肯定会这样的感受&#xff1a;不论我用的是 RestTempalte也好、还是用的 WebClient也好&#xff0c;还是用的 Feign也好&#xff0c;似乎跟我用不用Nacos没啥关系&#xff1f;我们在之前介绍Eureka和Consul的时候&#xff0c;也都是用同样的方法来实现服务调用的&#xff0c;不是吗&#xff1f;

确实是这样&#xff0c;对于Spring Cloud老手来说&#xff0c;就算我们更换了Nacos作为新的服务注册中心&#xff0c;其实对于我们应用层面的代码是没有影响的。那么为什么Spring Cloud可以带给我们这样的完美编码体验呢&#xff1f;实际上&#xff0c;这完全归功于Spring Cloud Common的封装&#xff0c;由于在服务注册与发现、客户端负载均衡等方面都做了很好的抽象&#xff0c;而上层应用方面依赖的都是这些抽象接口&#xff0c;而非针对某个具体中间件的实现。所以&#xff0c;在Spring Cloud中&#xff0c;我们可以很方便的去切换服务治理方面的中间件。

代码示例

本文示例读者可以通过查看下面仓库&#xff1a;

  • Github&#xff1a;https://github.com/dyc87112/SpringCloud-Learning/

  • Gitee&#xff1a;https://gitee.com/didispace/SpringCloud-Learning/

其中&#xff0c;本文的几种示例可查看下面的几个项目&#xff1a;

  • alibaba-nacos-discovery-server&#xff1a;服务提供者&#xff0c;必须启动

  • alibaba-nacos-discovery-client-resttemplate&#xff1a;使用RestTemplate消费

  • alibaba-nacos-discovery-client-webclient&#xff1a;使用WebClient消费

  • alibaba-nacos-discovery-client-feign&#xff1a;使用Feign消费

如果您对这些感兴趣&#xff0c;欢迎star、follow、收藏、转发给予支持&#xff01;

号外&#xff1a;最近整理了一下以前编写的一系列Spring Boot内容&#xff0c;整了个《Spring Boot基础教程》的PDF&#xff0c;关注我&#xff0c;回复&#xff1a;001&#xff0c;快来领取吧&#xff5e;&#xff01;002 资源也即将整理出炉&#xff0c;先关注我吧&#xff01;随后奉上更多精选学习资料&#xff01;&#xff01;&#xff01;


·END·


 近期热文&#xff1a;

  • SpringCloudAlibaba基础教程&#xff1a;使用Nacos实现服务注册与发现

  • 你的微服务实践还顺利吗&#xff1f;

  • 用认知和人性来做最棒的程序员

  • Gitlab-CI持续集成的完整实践

  • “三次握手&#xff0c;四次挥手”你真的懂吗&#xff1f;

  • “拼多多”被薅的问题出在哪儿&#xff1f;损失将如何买单&#xff1f;

  • 在前后端分离的路上承受了多少痛&#xff1f;看看这篇是否能帮到你&#xff1f;

  • 你真的会高效的在GitHub上搜索开源项目吗?

  • 中台是个什么鬼&#xff1f;

  • 从业务到平台的思维转变

640?wx_fmt&#61;png

星球重启

更多私货分享

欢迎加入

640?wx_fmt&#61;png


看完&#xff0c;赶紧点个“好看”鸭

点鸭点鸭

↓↓↓↓



推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
author-avatar
梦的影子2502931765
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有