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

作者 : 开心源码 本文共3736个字,预计阅读时间需要10分钟 发布时间: 2022-05-12 共187人阅读

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

使用RestTemplate

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

比方:

@EnableDiscoveryClient@SpringBootApplicationpublic 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

使用WebClient

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

@EnableDiscoveryClient@SpringBootApplicationpublic 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 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    @LoadBalanced    public 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@EnableFeignClientspublic 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: 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基础教程

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Spring Cloud Alibaba基础教程:支持的几种服务消费方式(RestTemplate、WebClient、Feign)

发表回复