Eureka服务注册中心学习笔记


前言

服务注册中心本质上是为了解耦服务提供者和服务消费者。

对于任何⼀个微服务,原则上都应存在或者支持多个提供者,这是由微服务的分布式属性决定的。

更进⼀步,为了支持弹性扩缩容特性,⼀个微服务的提供者的数量和分布往往是动态变化的,也是无法预先确定的。因此,原本在单体应用阶段常用的静态LB机制就不再适用了,需要引入额外的组件来管理微服务提供者的注册与发现,而这个组件就是服务注册中心。

一、服务注册中心原理

在这里插入图片描述
分布式架构中,服务注册中心存储了服务提供者的地址信息和其他属性信息,消费者通过主动查询注册中心或者被动接收通知来获取服务提供者的地址信息。

主流服务中心对比:

名称语言CAP暴露接口
EurekaJavaAPHTTP
ConsoulGoCPHTTP/DNS
ZookeeperJavaCP客户端
NacosJava支持CP/AP切换HTTP
  • Eureka
    由Netflix开源,并被集成到SpringCloud体系中,它是基于RestfulAPI风格开发的服务注册与发现组件。
  • Consul
    Consul是由HashiCorp基于Go语⾔开发的⽀持多数据中心分布式高可用的服务发布和注册服务软件, 采用Raft算法保证服务的⼀致性,且支持健康检查。
  • Zookeeper
    Zookeeper它是⼀个分布式服务框架,是Apache Hadoop的⼀个子项⽬,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统⼀命名服务、状态同步服务、集群管理、分布式应⽤配置项的管理等。
    zookeeper本质=存储+监听通知
  • Nacos
    Nacos是⼀个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。简单来说 Nacos 就是注册中心 + 配置中心的组合,帮助我们解决微服务开发必会涉及到的服务注册与发现,服务配置,服务管理等问题。Nacos 是Spring Cloud Alibaba 核心组件之⼀,负责服务注册与发现,和配置中心。

二、Eureka仪表盘

Eureka服务端自带了一个仪表盘页面,直接访问Eureka服务端项目地址加端口,可以查看Eureka服务端的各种信息:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、Eureka客户端

  • 服务注册
    服务提供者(Eureka客户端)在启动时会向Eureka服务端发起HTTP请求,注册自己的地址等信息。
  • 服务续约
    注册完成后Eureka客户端会启动一个定时任务,每隔30秒会向服务的发送一次HTTP请求,这是发送心跳,或者叫做续约,服务端默认90秒没收到心态请求,当前客户端就会过期失效。可以通过配置lease-renewal-interval-in-seconds修改发送心跳间隔时间,可以通过配置lease-expiration-duration-in-seconds修改过期时间。
  • 获取服务列表
    客户端启动时会从Eureka服务端获取注册的服务列表信息,缓存到本地,然后每隔30秒重新获取并更新本地缓存数据。可以通过配置eureka.client.registry-fetch-interval-seconds修改间隔时间。

三、Eureka服务端

  • 服务下线
    Eureka客户端正常关闭操作时,会发送一个服务下线的HTTP请求给Eureka服务端,Eureka服务会把这个客户端置为下线状态。
  • 失效剔除
    Eureka服务端会定时每隔60秒检查所有已注册的客户端,检查到有客户端在90秒内没有收到心跳信息,则会注销该客户端。
  • 集群模式同步数据
    在集群模式下,服务端启动时会从其他节点同步数据,服务端上注册的客户端信息发送改变时,会同步给其他节点。
  • 自我保护
    如果在15分钟内超过85%的客户端节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,Eureka Server自动进入自我保护机制。当处于自我保护模式时:
    1.不会剔除任何服务实例(可能是服务提供者和EurekaServer之间⽹络问题),保证了⼤多数服务依然可用。
    2.Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可⽤,当⽹络稳定时,当前Eureka Server新的注册信息会被同步到其它节点中。

四、源码解析

1.Eureka服务端

1.1 服务端启动流程

  • 利用Spring Boot自动装配启动:
    在这里插入图片描述
  • 装配这个配置类前提需要一个Marker的Bean:
    在这里插入图片描述
  • 那么看一下EnableEurekaServer注解类,这个注解注入了一个Marker的Bean,所以说启动类上需要加上@EnableEurekaServer用来开启Eureka服务端的相关功能:
    在这里插入图片描述在这里插入图片描述
  • 再来看EurekaServerAutoConfiguration配置类详情,这里注入了一个EurekaController,这就是Eureka的仪表盘功能,可以通过配置eureka.dashboard来关闭此功能,默认为开启。
    在这里插入图片描述
  • EurekaServerAutoConfiguration注入了PeerAwareInstanceRegistry(集群节点注册器)、PeerEurekaNodes(封装了集群节点相关信息和操作,比如更新集群节点的信息)
    在这里插入图片描述
  • PeerEurekaNodes里面有一个start方法开启一个定时任务,定时更新集群节点信息,这个start方法在这里还没有被调用:
    在这里插入图片描述
  • EurekaServerAutoConfiguration中注入了一个EurekaServerContext对象,这个对象里面有一个被@PostConstruct标记的initialize方法,会在EurekaServerContext实例化完成后调用,在这里启动了PeerEurekaNodes的start方法:
    在这里插入图片描述
    在这里插入图片描述
  • EurekaServerAutoConfiguration中注入了EurekaServerBootstrap启动器,EurekaServerAutoConfiguration类上Import了一个EurekaServerInitializerConfiguration配置类,在EurekaServerInitializerConfiguration配置类中start方法使用这个对象启动初始化容器。
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

  • 主要关注EurekaServerBootstrap类中initEurekaServerContext方法:
    在这里插入图片描述
  • 看下syncUp方法,主要是遍历集群其他节点获取客户端信息并注册到当前Eureka服务器上面:
    在这里插入图片描述
  • 看下注册方法register,这里面可以看出,客户端信息其实就是存储到一个Map集合中的,register也就是对这个Map的操作:
    在这里插入图片描述
  • 接下来再回到EurekaServerBootstrap类中initEurekaServerContext方法,进入PeerAwareInstanceRegistryImpl#openForTraffic中,这里面调用了postInit方法,这个方法里面就是启动一个定时任务,默认60秒执行一次检查服务失效情况。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 服务端HTTP接口暴露流程

  • 首先查看EurekaServerAutoConfiguration配置类,这里注入了一个了Jersey框架(是⼀个发布restful风格接接口的框架,类似springmvc),其主要流程就是扫描配置的包路径下被Path注解标注的接口并暴露出去。
    在这里插入图片描述

在这里插入图片描述

1.3 服务端服务注册接口

  • 我们找到上面暴露接口的jar包和路径,就在eureka-core.jar下的resources包下,有对应的各种接口信息,先来看ApplicationResource下的addInstance接口,就是注册客户端接口:
    在这里插入图片描述
  • addInstance接口调用了registry.register来注册信息:
    在这里插入图片描述
    在这里插入图片描述
  • replicateToPeers方法进去,这里是循环集群下每个节点进行同步,具体同步动作可以进入到replicateInstanceActionsToPeers方法中,这里面有下架、续约、注册等不同动作的同步,其实也就是根据不同动作调用其他节点对应的接口。
    在这里插入图片描述
    在这里插入图片描述

1.4 客户端续约/接收心跳接口

  • 在InstanceResource类下的renewLease接口中,调用了registry.renew进行客户端续约,这个方法里面首先是对当前服务端节点数据更新,更新成功过后再同步到其他节点,同步的细节和注册同步到其他节点的逻辑一样的。
    在这里插入图片描述
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值