热门:Spring Cloud Greenwich.RELEASE 正式发布!一个非常有看头的版本!
通过《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
使用WebClient
WebClient是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 Mono<String> test() {
Mono<String> result &#61; webClientBuilder.build()
.get()
.uri("http://alibaba-nacos-discovery-server/hello?name&#61;didi")
.retrieve()
.bodyToMono(String.class);
return result;
}
}
&#64;Bean
&#64;LoadBalanced
public WebClient.Builder loadBalancedWebClientBuilder() {
return WebClient.builder();
}
}
可以看到&#xff0c;在定义WebClient.Builder的时候&#xff0c;也增加了 &#64;LoadBalanced
注解&#xff0c;其原理与之前的RestTemplate时一样的。关于WebClient的完整例子也可以通过在文末的仓库中查看。
使用Feign
上面介绍的RestTemplate和WebClient都是Spring自己封装的工具&#xff0c;下面介绍一个Netflix OSS中的成员&#xff0c;通过它可以更方便的定义和使用服务消费客户端。下面也举一个具体的例子&#xff0c;其实现内容与上面两种方式结果一致&#xff1a;
第一步&#xff1a;在 pom.xml
中增加openfeign的依赖&#xff1a;
org.springframework.cloud
spring-cloud-starter-openfeign
第二步&#xff1a;定义Feign客户端和使用Feign客户端&#xff1a;
&#64;EnableDiscoveryClient
&#64;SpringBootApplication
&#64;EnableFeignClients
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
&#64;Slf4j
&#64;RestController
static class TestController {
&#64;Autowired
Client client;
&#64;GetMapping("/test")
public String test() {
String result &#61; client.hello("didi");
return "Return : " &#43; result;
}
}
&#64;FeignClient("alibaba-nacos-discovery-server")
interface Client {
&#64;GetMapping("/hello")
String hello(&#64;RequestParam(name &#61; "name") String name);
}
}
这里主要先通过 &#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;
其中&#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;
从业务到平台的思维转变
星球重启
更多私货分享
欢迎加入
看完&#xff0c;赶紧点个“好看”鸭
点鸭点鸭
↓↓↓↓