Eureka是Spring Cloud中的注册中心,类似于Dubbo中的Zookeeper。那么到底什么是注册中心,我们为什么需要注册中心? 我们首先来看一个传统的单体应用:
在单体应用中,所有的业务都集中在一个项目中,当用户从浏览器发起请求时,直接由前端发起请求给后端,后端调用业务逻辑,给前端请求作出响应,完成一次调用。整个调用过程是一条直线,不需要服务之间的中转,所以没有必要引入注册中心。
随着公司项目越来越大,我们会将系统进行拆分,例如一个电商项目,可以拆分成订单模块、物流模块、支付模块、CMS模块等等。这样,当用户发起请求时,就需要各个模块之间进行写作,这样不可避免的要进行模块之间的调用。此时,我们的系统架构就会发生变化:
在这里,模块之间的调用,变得越来越复杂,而且模块之间还存在强耦合。例如:A调用B,那么就要在A中写上B的地址,也意味着B的部署位置要固定,同时,如果以后B要进行集群化部署,A也需要修改。
为了解决服务之间的耦合,注册中心闪亮登场。
Eureka
Eureka是Netflix公司提供的一款服务注册中心,Eureka基于REST来实现服务的注册于发现,曾经Eureka是Spring Cloud中最重要的核心组件之一。Spring Cloud中封装了Eureka,在Eureka的基础上,优化了一些配置,然后提供了可视化的页面,可以方便的查看服务的注册情况以及服务注册中心集群的运行情况。
Eureka由两部分组成:服务端和客户端,服务端就是注册中心,用来接收其他服务的注册,客户端则是一个Java客户端,用来注册,并可以实现负载均衡等。
图中,可以看出,Eureka中,有三个角色:
- Eureka Server:注册中心
- Eureka Provider:服务提供者
- Eureka Consumer:服务消费者
Eureka Server
Eureka Server主要对外提供了三个功能:
- 服务注册,所有的服务都注册到Eureka Server上面来。
- 提供注册表,注册表就是所有注册上来服务的一个列表,Eureka Client在调用服务时,需要获取这个注册表,一般来说,这个注册表会缓存下来,如果缓存失效,则直接获取最新的注册表。
- 同步状态,Eureka Client通过注册、心跳等机制和Eureka Server同步当前客户端的状态
Eureka Client
Eureka Client主要用来简化每一个服务和Eureka Server之间的交互。Eureka Client会自动拉取、更新以及缓存Eureka Server中的信息,这样,即使Eureka Server所有节点宕机,Eureka Client依然能够获取到想要调用的服务地址(但是地址可能不准确)。
服务注册
服务提供者将自己注册到服务注册中心(Eureka Server),需要注意,所谓的服务提供者,只是一个业务上上的划分,本质上他就是一个Eureka Client。当Eureka Client向Eureka Server注册时,他需要提供自身的一些元数据信息,例如IP地址、端口、名称、运行状态等。
服务续约
Eureka Client注册到Eureka Server上之后,事情没有结束,刚刚开始而已。注册成功后,默认情况下,Eureka Client每隔30秒就要向Eureka Server发送一条心跳信息,来告诉Eureka Server我还在运行。如果Eureka Server连续90秒都没有收到Eureka Client的续约消息(连续三次没发送),它会认为Eureka Client已经掉线了,会将掉线的Eureka Client从当前的服务注册列表中剔除。
服务续约,有两个相关的属性(一般不建议修改):
eureka.instance.lease-renewal-interval-in-seconds=30
eureka.instance.lease-expiration-duration-in-seconds=90
- eureka.instance.lease-renewal-interval-in-seconds 表示服务的续约时间,默认是30秒
- eureka.instance.lease-expiration-duration-in-seconds 服务失效时间,默认是90秒
服务下线
当Eureka Client下线时,它会主动发送一条消息,告诉Eureka Server,我下线啦。
获取注册表信息
Eureka Client从Eureka Server上获取服务的注册信息,并将其缓存在本地。本地客户端,在需要调用远程服务时,会从该信息中查找远程服务所对应的IP地址、端口等信息。Eureka Client上缓存的服务注册信息会定期更新(30秒),如果Eureka Server返回的注册表信息与本地缓存的注册表信息不同的话,Eureka Client会自动处理。
这里,也涉及到两个属性,一个是是否允许获取注册表信息:
eureka.client.fetch-registry=true
Eureka Client上缓存的服务注册信息,定期更新的时间间隔,默认30秒:
eureka.client.registry-fetch-interval-seconds=30