下面我们以 Eureka 注册中心为例,说一下注册中心的作用:
假如我们有一个订单服务 order-service
,需要消费用户服务 user-service
,而 user-service
是集群部署,有三个节点:8081,8082,8083,那么我们的订单服务应该调用哪一台呢?如果后续又增加了 8084、8085 两个节点后又该怎么调用呢?
所以这时候我们就需要用到注册中心来对服务进行管理了。这里涉及两个概念:
服务提供者
。服务消费者
。我们如何利用注册中心来共享服务的地址呢?
1)首先,当服务提供者启动服务的时候,就会把自己的信息注册到注册中心中,注册中心就会保存服务提供者的这三个节点的地址和端口了。
2)其次,因为目前的远程调用都是相对的,假如有其他微服务也需要去调用 order-service 微服务,那么就需要将订单服务也注册到注册中心上。注册中心也就会保存 order-service 微服务的地址了。
3)当注册中心保存好这些信息之后,服务消费者就回去注册中心拉取这些信息了。比如说,order-service 调用 user-service 就会拉取到 8081、8082、8083 三个地址,那么应该选择哪个地址去调用呢?这时候,在 user-service 内部会做一个负载均衡,假设选中了8081,那么 order-service 就会直接调用 8081 的 user-service 服务。
以上就是 Eureka 的基本工作流程。服务注册主要指的是服务提供者把自己的信息注册到注册中心中,然后由服务提供者去注册中心去拉取,发现服务提供者的信息。
假如三台 user-service 服务提供者中,有一台宕机了,那么这时候应该怎么办呢?
是这样的,服务提供者的每一个微服务都会每隔30秒向注册中心发送一个心跳进行续约
,证明当前是一个健康的实例。假如某个实例一直没有发送请求,比如8083节点挂了,注册中心如果90秒没有收到心跳,注册中心就会认为某一台实例挂机了,然后在服务列表中把8083的服务干掉了。那么相对应的 order-service 服务消费者去注册中心拉取信息的时候,就会发现8083节点不在了,只剩下8081和8082了,这个实际上就是服务的健康监控
。
Nacos 和 Eureka 的思路还是基本一致的,我们的服务提供者需要把自己的信息注册到 Nacos,服务消费者需要去注册中心去拉取数据,通过这种方式来获取服务列表信息,比如 IP和端口地址等。同样 Nacos 也有健康检测,服务提供者也会定期发送自己的心跳到 Nacos,证明当前某个节点是存活的。这里不同的是有一个名称:临时实例
。
下面这是正常在微服务中 Nacos 的配置:
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.200.130:8848
ephemeral: false # 设置为非临时实例,默认true
ephemeral
意思是临时的,平时我们不会去设置它,那么Nacos默认就是采用临时实例。如果使用的是临时实例,那么和我们的 Eureka 差不多,它的健康检测也是通过心跳去检测的。假如我们这里设置了 false
,那么当前这个实例就是非临时实例
了。
如果是非临时实例
,Nacos 注册中心会主动地询问,查看当前的服务提供者是否存活。之前是由服务提供者主动发送心跳告诉注册中心还活着,非临时实例中就反过来了。而 Eureka 中没有非临时实例的概念,这就是一点不同。
另外一点,如果服务提供者的地址发生变更了,Nacos 注册中心会主动推送变更的信息到服务消费者,也就是说 Nacos 不仅仅有 pull,还有 push。
由于 Nacos 注册中心的主动推送,那么服务消费者中服务列表的更新就会更加的及时,从而减少服务不可用的时间。
心跳模式
,非临时实例采用主动检测模式
;AP
方式,当集群中存在非临时实例时,采用 CP
模式;Eureka 采用 AP
方式。配置中心
, Eureka 则只有注册中心,这也是很多人选择使用 Nacos 的一个重要原因。整理完毕,完结撒花~