上文我们留下了一个小小的问题:就是如何实现服务之间的相互调用呢?
那本文我们就先将这部分功能实现过程记录下来,供大家参考。
之前,我们有讲过这么一句话--服务消费者在运行时会去注册中心获取服务列表,然后通过暴露的路径知道去哪里调用服务,就之前写的案例而言,当前我们的注册中心只有一个client的服务节点,要实现服务间的互相调用,起码要两个吧。那我们就先仿照client子项目来创建一个order服务,并将其注册到注册中心
一,创建springcloud-eureka-order项目(跟client大致一样)
在父工程下创建maven子模块springcloud-eureka-order服务端工程,该模块是一个基础的springboot工程。
1.添加依赖
pom.xml
2.编写配置文件
application.yml
设置好服务的端口号
3.创建order实体类
给出字段名,getter和setter方法就省略了。
3.创建order控制器,并模拟写一个通过id查询订单的方法
4.记得在引导类添加注解@EnableEurekaClient标明该类是一个Eureka客户端组件
这样一来我们的order服务就完成了。
二,重新编辑client服务,用来调用order服务
1.在引导类中,创建RestTemplate的Spring实例
RestTemplate是spring提供的用于访问rest服务的客户端实例,它提供了多种便捷访问远程HTTP服务的方法,能够大大提高客户端的编写效率。
2.创建客户端控制器,并调用order服务
模拟用户查询订单号为“1”的订单信息
restTemplate通过地址调用order服务
3.运行注册中心,订单服务,以及客户端服务应用
此时注册中心应该是这样子:
我们可以看到两个服务都已经注册进来了。
用postman测试下接口,发现已经可以通过客户端控制器调用order服务了
三,关于客户端的负载均衡(Ribbon)
在分布式架构中,服务器端负载均衡通常是用nginx实现分发请求的,而客户端的同一个实例部署在多个应用上时,也需要实现负载均衡。springcloud也提供了实现负载均衡的组件ribbon。
Ribbon会利用从Eureka读取到的服务信息列表,在调用服务实例的时候,以合理的方式(默认轮询)进行负载。
Ribbon的使用方法很简单,两步走:1在需要的实例化RestTemplate的方法上添加@LoadBalanced注解,2并在其执行方法中使用服务实例的名称即可。
添加注解@LoadBalanced
原本调用order服务访问路径(ip+port)
改变成访问服务实例名字
到了这里,基本上我们的order服务就实现了负载均衡,为了能够看到它轮询的效果,以下就创建一个服务监听类。通过调用的端口号来看其实现负载均衡的效果。
1.服务监听类如下,监听本地运行的端口号,就知道调用哪个端口的服务
2.在OrderController中调用获取端口号的方法,输出到控制台。
注册中心有两个不同端口的服务(启动7900服务后,修改.yml配置中端口号为7901,然后也启动)
执行四次请求时,控制台的输入如下:
这样子我们可能看到请求会按照一定的策略分发给不同端口的服务。
----本文读《微服务架构基础》有感,引用其内容作为笔记记录 供广大学者参考学习。如有侵权,请及时告知。