1:服务发现的背景及概念
我们知道,微服务架构的系统是分布式系统,分布式系统必然存在互相通信。显然服务间需要通过网络互相调用,而远程调用需要提供服务的地址,才可以发起通信,就产生了一个问题,如何知道相应服务的地址呢?
一个直观(而粗糙)的解决方案是,硬编码,即在代码中直接写入被调用的服务的地址。如左图,订单服务想要调用用户服务时,即出现了定位服务的问题。如果硬编码,会有什么问题呢?
1. 无法调用服务的其他实例,整体的负载能力低
2. 服务的可用性降低,如果实例1出现故障或重新发布,则无法自动转移到可用的实例,服务整体可用性大大降低
3. 针对测试与发布环境需要提供不同配置,配置和维护的工作量巨大
Netflix微服务架构图,明显的存在多个微服务交叉调用,硬编码和维护的成本巨大,弹性极差
1.2 服务发现的概念
显然硬编码在实际生产中是不可行的, 在微服务架构下,一个服务自动定位到被调用的服务的过程称为服务发现。(找到需要调用的服务的地址,服务调用者定位到服务的提供者的地址)
服务发现的目标有如下几个: 我们约定提供服务的一方,即RPC的服务端,称为服务提供者调用或说使用服务的一方,即RPC的客户端,称为服务消费者
1. 服务消费者上线时,能够发现合适的服务提供者
2. 当某个服务提供者上线时,消费者能够获悉服务的存在
3. 服务提供者实例发生变动不可用时(如故障或者重新发布而不可用),消费者得到通知,停止对其调用
4. 新增服务实例可以被消费者使用,跟第一条不同的是,这里是扩展操作,即为一个已有服务增加实例(如,3台服务器变成4台服务器)
因此,必然存在以下几个环节:
① 服务注册,提供者将服务公之于众,让服务消费者可以知晓服务的状态
② 服务下线,提供者声明服务不再可用,后续不再调用该服务
③ 服务查询,消费者可以查询到所需调用的服务的地址、端口等等信息,以用于调用
④ 服务健康检查,需要知晓服务提供者当前是否可用,如果不可用则不再对外提供服务
⑤ 服务通知,当服务状态发生变化时确保消费者知晓,则需要通知消费者
1.3服务注册与发现
总结来说,在微服务架构下,服务之间需要互相 调用,服务发现就是解决某个服务如何找到被调用的服务的地址的过程,一般会有服务注册表组件作为中间人,然后服务提供者启动时会将服务注册到服务注册表中,当服务调用者需要调用服务时则从服务注册表中查找相应的服务并调用。这就是服务发现的过程。
具体步骤如下:
①服务提供者启动时,将服务注册到服务注册表
②服务消费者启动时拉取服务列表
③服务消费者需要调用时从服务注册表中选择合适的服务并调用
④服务注册表检测服务提供者的健康状况并更新服务列表
⑤当服务健康状态发生改变时通知客户端更新服务列表
2:使用Spring-Cloud-Eureka实现服务发现
2.1 Eureka介绍
Eureka是NetFlix开源的一款服务发现组件。 Spring Cloud对其进行了封装。
Eureka基于 REST (Representational StateTransfer) 协议通信 参考文章1 参考文章2
Eureka包含两个主要组件
① Eureka-Server,独立部署的系统,负责管理服务信息(接收服务注册、检测服务是否存活),支持配置成集群,保证高可用
② Eureka-Client,集成在服务中(服务提供与消费者都有集成),与Eureka-Server通信,执行服务注册、获取服务列表等
Eureka不存储任何信息,而是使用客户端心跳推送的方式来做健康检测,也就是EurekaClient会在指定间隔时间内发送一段信息给服务端,服务端据此确认服务的健康性
2.2 Eureka-Server搭建 : 创建项目
IDEA中执行以下操作:File>New Project>Spring Initalizr进入如下界面,点击 Next
填写Maven坐标GAV、项目描述等,Next
选择相应的依赖,这里很简单,选择Eureka-Server即可,Next
仔细观察生成的项目,是标准的Spring Cloud项目,与其他Spring Boot 项目不同的有以下地方:
目前项目虽然引入了Eureka-Server的包,但还未启用该功能,我们通过给Application添加注解来启动Eureka-Server功能。
我们给Eureka-Server添加一些必要的配置。Spring-Boot的外化配置特性,配置文件统一放在resources/application.properties中。配置如下:
运行Application,服务启动日志没有报错即表示启动成功。此时访问 localhost:9600可以看见Eureka-Server的Web界面
2.3 Eureka Client搭建
前面的介绍我们知道,Eureka-Client其实是包含在项目中的,分成服务提供者和服务消费者两个角色。我们假设这里有个电影评分服务,显然电影网站(movie)就是服务消费者,评分服务(rating)就是服务提供者了。
2.3.1 Eureka Client搭建:搭建rating服务
2.3.2 Eureka Client搭建:搭建movie项目
小结:
Eureka-Server:服务注册
eureka-client:拉取服务列表
服务调用: 远程调用某个服务的接口
服务发现: 找到需要调用的服务的地址,服务调用者定位到服务的提供者的地址
服务注册: 将服务信息发布到服务注册表中,使该服务可以被查询和调用
Eureka-Server本身也是一个eureka-client