精华内容
下载资源
问答
  • 关注 公众号:技术从心 欢迎交流

     

    关注 公众号:技术从心 欢迎交流

    展开全文
  • Eureka底层架构原理

    2020-07-23 16:21:48
    EurekaClient作为java客户端,在服务启动后周期性的(默认30s)向EurekaServer发送心跳 EurekaServer在一定时间(默认90s)没有收到某个服务的心跳就会注销该实例,EurekaClient发送canel命令后也会注销该实例 ...

    1.服务注册和发现的原理

    • EurekaServer启动的时候注册自己的IP端口服务名称等信息
    • EurekaClient作为java客户端,在服务启动后周期性的(默认30s)向EurekaServer发送心跳
    • EurekaServer在一定时间(默认90s)没有收到某个服务的心跳就会注销该实例,EurekaClient发送canel命令后也会注销该实例
    • EurekaServer之间会相互复制注册表信息
    • EurekaClient会缓存注册表信息

    服务注册与发现

    比如现在我们有一个服务消费者 服务A,和两个节点的服务提供者,服务B。服务A 和服务B 在启动的时候都会向注册中心进行服务注册。

    服务A 也会定时从服务注册中心定时去拉取服务注册表信息到本地来,这个过程叫服务发现,默认是30S 一次,当然了可以自己去配置。

    如下图:

    实际上当服务在拉取服务注册表的时候,其实客户端不是直接从 Eureka 中的 服务注册表中获取数据的。

    Eureka 做了二级缓存,第一级叫做 ReadOnly 缓存,二级叫做 ReadWrite 缓存。

    客户端会直接从ReadOnly 缓存中读取注册表信息。

    当服务在进行注册的时候,先往服务注册表中写入注册信息,服务注册表更新了,立马会同步一份数据到 ReadWrite 缓存中去。

    那什么时候 ReadWrite 缓存中的数据会到 ReadOnly 缓存中去?

    此时有一个定时任务会定时去检查 ReadWrite 是否跟  ReadOnly 不一致,不一致就把数据同步到 ReadOnly 中去。

    这个定时任务也默认是 30S。也可以自己配置。

    二级缓存的好处在于,优化并发读写的冲突。

    如果服务进行注册的时候,同时有服务来读去注册表信息,就会存在频繁的读写加锁的操作,写的时候就不能读,导致性能下降,所以我们需要避免大量的读写都去操作一个表。

    那么有了这两层,其实大部分的读操作都会走 ReadOnly 缓存。只需要定时把 ReadWrite 缓存中的数据写入到 ReadOnly 就好了。

    心跳与故障检测
    服务注册中心还有一个很重要的功能就是 心跳与故障检查。心跳跟故障检测其实就是为了知道注册上来的这些服务是不是还活着的。

    Eureka 还会开启一个定时任务定时去检查心跳,默认也是30秒,也可以自己设置。

    当出现机器故障没有在约定的时间间隔内上报自己的状态,那么Eureka 就会把这台机器剔除注册表,同时更新到 ReadWrite 缓存中去。如图:

    但是把数据从ReadWrite 缓存同步到 ReadOnly 缓存是有时间间隔的。当服务消费者A 也只有等待下一次请求更新的时候才会把自己列表里面的服务给更新掉。

    所以有时候会出现你注册上去的服务经过及时秒才被服务消费者发现,或者服务的某个节点出现故障,没有及时剔除掉。这里就是同步机制的时间差问题。

    以上就是 Eureka 的核心运行原理了。

    2.Eureka的两大主体:EurekaServer和EurekaClient

    EurekaServer

          提供服务注册,服务信息提供,服务管理(通过Eureka Client的Cancel、心跳监控、renew等方式来维护该服务提供的信息以确保该服务可用以及服务的更新。)

    EurekaServer之间的信息同步:

          每个Eureka Server同时也是Eureka Client,多个Eureka Server之间通过P2P复制的方式完成服务注册表的同步。同步时,被同步信息不会同步出去。也就是说有3个Eureka Server,Server1有新的服务信息时,同步到Server2后,Server2和Server3同步时,Server2不会把从Server1那里同步到的信息同步给Server3,只能由Server1自己同步给Server3。

    EurekaClient:

          Eureka Client会拉取、更新和缓存Eureka Server中的信息。即使所有的Eureka Server节点都宕掉,服务消费者依然可以使用缓存中的信息找到服务提供者。

          Eureka Client在微服务启动后,会周期性地向Eureka Server发送心跳(默认周期为30秒)以续约自己的信息。如果Eureka Server在一定时间内没有接收到某个微服务节点的心跳,Eureka Server将会注销该微服务节点(默认90秒)。

    其它动作:

    Register:服务注册

          当Eureka客户端向Eureka Server注册时,它提供自身的元数据,比如IP地址、端口,运行状况指示符URL,主页等。

    Renew:服务续约

          Eureka Client会每隔30秒发送一次心跳来续约。 通过续约来告知Eureka Server该Eureka客户仍然存在,没有出现问题。 正常情况下,如果Eureka Server在90秒没有收到Eureka客户的续约,它会将实例从其注册表中删除。 建议不要更改续约间隔。

    Fetch Registries:获取注册列表信息

          Eureka客户端从服务器获取注册表信息,并将其缓存在本地。客户端会使用该信息查找其他服务,从而进行远程调用。该注册列表信息定期(每30秒钟)更新一次。每次返回注册列表信息可能与Eureka客户端的缓存信息不同, Eureka客户端自动处理。如果由于某种原因导致注册列表信息不能及时匹配,Eureka客户端则会重新获取整个注册表信息。 Eureka服务器缓存注册列表信息,整个注册表以及每个应用程序的信息进行了压缩,压缩内容和没有压缩的内容完全相同。Eureka客户端和Eureka 服务器可以使用JSON / XML格式进行通讯。在默认的情况下Eureka客户端使用压缩JSON格式来获取注册列表的信息。

    Cancel:服务下线

          Eureka客户端在程序关闭时向Eureka服务器发送取消请求。 发送请求后,该客户端实例信息将从服务器的实例注册表中删除。该下线请求不会自动完成,它需要调用以下内容:DiscoveryManager.getInstance().shutdownComponent();

    Eviction 服务剔除

          在默认的情况下,当Eureka客户端连续90秒没有向Eureka服务器发送服务续约,即心跳,Eureka服务器会将该服务实例从服务注册列表删除,即服务剔除。

    参考自:https://blog.csdn.net/javageektech/article/details/100981603 

     

    展开全文
  • Eureka的基本概念 Register——服务注册 当Eureka Client向Eureka Server注册时,Eureka Client提供自身的元数据,比如IP地址、端口、运行状况指标的Url、主页地址等信息。 Renew——服务续约 Eureka ...

    Eureka的基本概念

    1. Register——服务注册
      当Eureka Client向Eureka Server注册时,Eureka Client提供自身的元数据,比如IP地址、端口、运行状况指标的Url、主页地址等信息。

    2. Renew——服务续约
      Eureka Client 在默认的情况下会每隔30秒发送一次心跳来进 行服务续约。通过服务续约来告知Eureka Server该Eureka Client仍然可用,没有出现故障。正常情况下,如果Eureka Server在90秒内没有收到Eureka Client的心跳,Eureka Server会将Eureka Client实例从注册列表中删除。注意:官网建议不要更改服务续约的间隔时间。

    3. Fetch Registries——获取服务注册列表信息
      Eureka Client从Eureka Server获取服务注册表信息,并将其缓存在本地。Eureka Client会使用服务注册列表信息查找其他服务的信息,从而进行远程调用。该注册列表信息定时(每30秒)更新一次,每次返回注册列表信息可能与Eureka Client的缓存信息不同,Eureka Client会自己处理这些信息。如果由于某种原因导致注册列表信息不能及时匹配,EurekaClient会重新获取整个注册表信息。EurekaServer缓存了所有的服务注册列表信息,并将整个注册列表以及每个应用程序的信息进行了压缩,压缩内容和没有压缩的内容完全相同。EurekaClient和Eureka Server可以使用JSON和XML数据格式进行通信。在默认的情况下,Eureka Client使用JSON格式的方式来获取服务注册列表的信息。

    4. Cancel——服务下线
      Eureka Client在程序关闭时可以向Eureka Server发送下线请求。发送请求后,该客户端的实例信息将从Eureka Server 的服务注册列表中删除。该下线请求不会自动完成,需要在程序关闭时调用以下代码:
      DiscoveryManager .getInstance().shutdownComponent() ;

    5. Eviction——服务剔除
      在默认情况下,当Eureka Client连续90秒没有向Eureka Server发送服务续约(即心跳)时,EurekaServer会将该服务实例从服务注册列表删除,即服务剔除。

    Register服务注册

    服务注册,即Eureka Client向Eureka Server提交自己的服务信息,包括IP地址、端口、ServiceId等信息。如果Eureka Client在配置文件中没有配置ServiceId,则默认为配置文件中配置的服务名,即${spring.application.name}的值。

    当Eureka Client启动时,会将自身的服务信息发送到Eureka Server。这个过程其实非常简单,现在来从源码的角度分析服务注册的过程。

    在工程的Maven 的依赖包下,找到eureka-client-1 .6.2.jar包。在com.netflix.discovery 包下有一个DiscoveryClient类,该类包含了Eureka Client向Eureka Server注册的相关方法。其中,DiscoveryClient 实现了EurekaClient 接口,并且它是一个单例模式,而EurekaClient 继承了LookupService接口。它们之间的关系如图5-4所示:

    在DiscoveryClient类中有一个服务注册的方法register(),该方法通过Http请求向Eureka Server注册:

    在DiscoveryClient类下继续追踪register()方法,这个方法被InstanceInfoReplicator类的run()方法调用,其中InstanceInfoReplicator实现了Runnable 接口,run()方法代码如下:

     而InstanceInfoReplicator 类是在DiscoveryClient 初始化过程中使用的,其中有一个initScheduledTasks()方法,该方法主要开启了获取服务注册列表的信息。如果需要向EurekaServer注册,则开启注册,同时开启了定时任务向Eureka Server服务续约,具体代码如下:

    再来跟踪Eureka server端的代码,在Maven的eureka-core:1.6.2的jar包下。打开com.netlix.eureka包,会发现有一个EurekaBootStrap 的类,BootStrapContext 类在程序启动时具有最先初始化的权限,代码如下:

    其中,PeerAwareInstanceRegistryImpl 和PeerEurekaNodes 两个类从其命名上看,应该和服务注册以及Eureka Server高可用有关

    先追踪PeerAwareInstanceRegstryImpl 类,在该类中有一个register(方法,该方法提供了服务注册,并且将服务注册后的信息同步到其他的Eureka Server服务中。代码如下:

    点击其中的super.register(info, leaseDuration, isReplication)方法,进入其父类AbstractInstanceRegistry可以发现更多细节,注册列表的信息被保存在一个 Map中。

    AbstractInstanceRegistry类的replicateToPeers(方法用于将注册列表信息同步到其他Eureka Server的其他Peers节点,追踪代码,发现该方法会循环遍历向所有的Peers 节点注册,最终执行类PeerEurekaNode的register()方法,该方法通过执行一个任务向其他节点同步该注册信息,代码如下:

    经过一系列的源码追踪, 可以发现PeerAwareInstanceRegistryImpl类的register()方法实现了服务的注册,并且向其他Eureka Server的Peer节点同步了该注册信息,

    那么register()方法被谁调用了呢?在前文中有关Eureka Client的分析中可以知道,Eureka Client是通过Http 来向Eureka Server注册的,那么Eureka Server 肯定会提供一个服务注册的API接口给Eureka Client 调用,PeerAwareInstanceRegistryImpl的register()方法最终肯定会被暴露的Http接口所调用

    在IDEA开发工具中,同时按住“Alt" +鼠标左键(查看某个类被谁调用的快捷键),可以很快定位到ApplicationResource类的addInstance()方法,即服务注册的接口,其代码如下:

    Renew服务续约

    服务续约和服务注册非常相似,通过前文中的分析可以知道,服务注册在EurekaClient程序启动之后开启,并同时开启服务续约的定时任务。在eureka-client-1.6.2.jar的DiscoveryClient的类下有renew()方法,其代码如下:

    另外,Eureka Server 的续约接口在eureka-core:1.6.2.jar 的com.netflix.eureka 包下的InstanceResource类下,接口方法为renewLease(),它是一个 RESTful API接口。其中有一个registry.renew()方法,即服务续约,代码如下:

    服务续约有两个参数是可以配置的,即EurekaClient发送续约心跳的时间参数Eureka Server 在多长时间内没有收到心跳将实例剔除的时间参数。在默认情况下,这两个参数分别为30秒和90秒,官方的建议是不要修改,如果有特殊需求还是可以调整的,只需要分别在Eureka Client和Eureka Server的配置文件application.yml中加以下的配置:

    • EurekaClient发送续约心跳的时间参数:     eureka.instance.leaseRenewalIntervalInSeconds
    • Eureka Server 在多长时间内没有收到心跳将实例剔除的时间参数:eureka.instance.leaseExpirationdurationInSeconds

    为什么Eureka Client获取服务实例这么慢

           1.Eureka Client的注册延迟
                   EurekaClient启动之后,不是立即向EurekaServer注册的,而是有一个延迟向服务端注册的时间。通过跟踪源码,可以发现默认的延迟时间为40秒,源码在eureka-client-1.6.2.jar 的DefaultEurekaClientConfig类中,代码如下:

           解决方案:将实例信息变更同步到 Eureka Server的初始延迟时间,从默认的40秒修改到10秒,即修改或添加以下配置:

    eureka:
       client:
         ## InstanceInfoReplicator 将实例信息变更同步到 Eureka Server的初始延迟时间 ,默认为40秒
         initial-instance-info-replication-interval-seconds: 10
    

           2.Eureka Server的响应缓存
                   Eureka Server 维护每30秒更新一次响应缓存, 可通过更改配置eureka.server.responseCacheUpdateIntervalMs来修改。所以即使是刚刚注册的实例,也不会立即出现在服务注册列表中。

            3.Eureka Client的缓存
                   Eureka Client保留注册表信息的缓存。该缓存每30秒更新一次(如前所述)。因此,Eureka Client刷新本地缓存并发现其他新注册的实例可能需要30秒。

                解决方案:在测试环境下,可以在Eureka-Client服务中适当提高 Eureka-Client端拉取 Server注册信息的频率,比如将默认频率由30秒改为5秒,即修改或添加以下配置:

    eureka:
      client:
        registry-fetch-interval-seconds: 5

            4.LoadBalancer 的缓存
                    Ribbon的负载平衡器从本地的EurekaClient获取服务注册列表信息。 Ribbon本身还维护了缓存,以避免每个请求都需要从EurekaClient获取服务注册列表。此缓存每30秒刷新一次(可由ribbon.ServerListRefreshInterval 配置),所以可能至少需要30秒的时间才能使用新注册的实例。

           综上因素,一个新注册的实例,默认延迟40秒向服务注册中心注册,所以不能马上被Eureka Server发现。另外,刚注册的Eureka Client也不能立即被其他服务调用,原因是调用方由于各种缓存没有及时获取到最新的服务注册列表信息。

     

    Eureka自我保护模式

    当有一个新的EurekaServer出现时,它尝试从相邻Peer节点获取所有服务实例注册表信息。如果从相邻的Peer节点获取信息时出现了故障,Eureka Server 会尝试其他的Peer节点。如果EurekaServe能够成功获取所有的服务实例信息,则根据配置信息设置服务续约的阈值。在任何时间,如果Eureka Serve接收到的服务续约低于为该值配置的百分比(默认为15分钟内低于85%),则服务器开启自我保护模式,即不再剔除注册列表的信息。

    这样做的好处在于,如果是EurekaServer自身的网络问题而导致EurekaClient无法续约,EurekaClient的注册列表信息不再被删除,也就是EurekaClient还可以被其他服务消费。
    在默认情况下,Eureka Server的自我保护模式是开启的,如果需要关闭,则在配置文件添加以下代码:

    eureka:
    	server:
    		enable-self-preservation: false

     

    eureka注册发现的工作原理图

     

     Eureka的高可用架构

           在这个架构中有两个角色,即Eureka Server和Eureka Client。而EurekaClient又分为Applicaton Service和Application Client,即服务提供者和服务消费者。

           每个区域有一个Eureka集群,并且每个区域至少有一个Eureka Server可以处理区域故障,以防服务器瘫痪。
    Eureka Client向Eureka Server 注册,将自己的客户端信息提交给Eureka Server。然后,Eureka Client通过向Eureka Server 发送心跳(每30秒一次) 来续约服务。如果某个客户端不能持续续约,那么Eureka Server断定该客户端不可用,该不可用的客户端将在大约90秒后从EurekaServe服务注册列表中删除。服务注册列表信息和服务续约信息会被复制到集群中的每个EurekaServe节点。来自任何区域的EurekaClient都可以获取整个系统的服务注册列表信息。根据这些注册列表信息,Application Client可以远程调用Applicaton Service来消费服务。

     

    参考链接:

    Eureka服务注册、服务续约源码解析、为何Eureka获取服务实例这么慢、自我保护模式

    Eureka 参数调优问题(注册延迟、缓存等)

     

     

     

    展开全文
  • Eureka工作原理

    万次阅读 多人点赞 2019-07-03 10:46:48
    Eureka 工作原理 上节内容为大家介绍了,注册中心 Eureka 产品的使用,以及如何利用 Eureka 搭建单台和集群的注册中心。这节课我们来继续学习 Eureka,了解它的相关概念、工作流程机制等。 Eureka 作为 Spring Cloud...

    Eureka 工作原理

    上节内容为大家介绍了,注册中心 Eureka 产品的使用,以及如何利用 Eureka 搭建单台和集群的注册中心。这节课我们来继续学习 Eureka,了解它的相关概念、工作流程机制等。

    Eureka 作为 Spring Cloud 体系中最核心、默认的注册中心组件,研究它的运行机制,有助于我们在工作中更好地使用它。

    Eureka 核心概念

    回到上节的服务注册调用示意图,服务提供者和服务的消费者,本质上也是 Eureka Client 角色。整体上可以分为两个主体:Eureka Server 和 Eureka Client。
    在这里插入图片描述

    Eureka Server:注册中心服务端

    注册中心服务端主要对外提供了三个功能:

    服务注册
    服务提供者启动时,会通过 Eureka Client 向 Eureka Server 注册信息,Eureka Server 会存储该服务的信息,Eureka Server 内部有二层缓存机制来维护整个注册表

    提供注册表
    服务消费者在调用服务时,如果 Eureka Client 没有缓存注册表的话,会从 Eureka Server 获取最新的注册表

    同步状态
    Eureka Client 通过注册、心跳机制和 Eureka Server 同步当前客户端的状态。

    Eureka Client:注册中心客户端
    Eureka Client 是一个 Java 客户端,用于简化与 Eureka Server 的交互。Eureka Client 会拉取、更新和缓存 Eureka Server 中的信息。因此当所有的 Eureka Server 节点都宕掉,服务消费者依然可以使用缓存中的信息找到服务提供者,但是当服务有更改的时候会出现信息不一致。

    Register: 服务注册
    服务的提供者,将自身注册到注册中心,服务提供者也是一个 Eureka Client。当 Eureka Client 向 Eureka Server 注册时,它提供自身的元数据,比如 IP 地址、端口,运行状况指示符 URL,主页等。

    Renew: 服务续约
    Eureka Client 会每隔 30 秒发送一次心跳来续约。 通过续约来告知 Eureka Server 该 Eureka Client 运行正常,没有出现问题。 默认情况下,如果 Eureka Server 在 90 秒内没有收到 Eureka Client 的续约,Server 端会将实例从其注册表中删除,此时间可配置,一般情况不建议更改。

    服务续约的两个重要属性

    服务续约任务的调用间隔时间,默认为30秒
    eureka.instance.lease-renewal-interval-in-seconds=30
    
    服务失效的时间,默认为90秒。
    eureka.instance.lease-expiration-duration-in-seconds=90
    

    Eviction 服务剔除
    当 Eureka Client 和 Eureka Server 不再有心跳时,Eureka Server 会将该服务实例从服务注册列表中删除,即服务剔除。

    Cancel: 服务下线
    Eureka Client 在程序关闭时向 Eureka Server 发送取消请求。 发送请求后,该客户端实例信息将从 Eureka Server 的实例注册表中删除。该下线请求不会自动完成,它需要调用以下内容:

    DiscoveryManager.getInstance().shutdownComponent()

    GetRegisty: 获取注册列表信息
    Eureka Client 从服务器获取注册表信息,并将其缓存在本地。客户端会使用该信息查找其他服务,从而进行远程调用。该注册列表信息定期(每30秒钟)更新一次。每次返回注册列表信息可能与 Eureka Client 的缓存信息不同,Eureka Client 自动处理。

    如果由于某种原因导致注册列表信息不能及时匹配,Eureka Client 则会重新获取整个注册表信息。 Eureka Server 缓存注册列表信息,整个注册表以及每个应用程序的信息进行了压缩,压缩内容和没有压缩的内容完全相同。Eureka Client 和 Eureka Server 可以使用 JSON/XML 格式进行通讯。在默认情况下 Eureka Client 使用压缩 JSON 格式来获取注册列表的信息。

    获取服务是服务消费者的基础,所以必有两个重要参数需要注意:

    # 启用服务消费者从注册中心拉取服务列表的功能
    eureka.client.fetch-registry=true
    
    # 设置服务消费者从注册中心拉取服务列表的间隔
    eureka.client.registry-fetch-interval-seconds=30
    

    Remote Call: 远程调用
    当 Eureka Client 从注册中心获取到服务提供者信息后,就可以通过 Http 请求调用对应的服务;服务提供者有多个时,Eureka Client 客户端会通过 Ribbon 自动进行负载均衡。

    自我保护机制

    默认情况下,如果 Eureka Server 在一定的 90s 内没有接收到某个微服务实例的心跳,会注销该实例。但是在微服务架构下服务之间通常都是跨进程调用,网络通信往往会面临着各种问题,比如微服务状态正常,网络分区故障,导致此实例被注销。

    固定时间内大量实例被注销,可能会严重威胁整个微服务架构的可用性。为了解决这个问题,Eureka 开发了自我保护机制,那么什么是自我保护机制呢?

    Eureka Server 在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 即会进入自我保护机制。

    Eureka Server 触发自我保护机制后,页面会出现提示:

    在这里插入图片描述

    Eureka Server 进入自我保护机制,会出现以下几种情况:
    (1 Eureka 不再从注册列表中移除因为长时间没收到心跳而应该过期的服务
    (2 Eureka 仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上(即保证当前节点依然可用)
    (3 当网络稳定时,当前实例新的注册信息会被同步到其它节点中

    Eureka 自我保护机制是为了防止误杀服务而提供的一个机制。当个别客户端出现心跳失联时,则认为是客户端的问题,剔除掉客户端;当 Eureka 捕获到大量的心跳失败时,则认为可能是网络问题,进入自我保护机制;当客户端心跳恢复时,Eureka 会自动退出自我保护机制。

    如果在保护期内刚好这个服务提供者非正常下线了,此时服务消费者就会拿到一个无效的服务实例,即会调用失败。对于这个问题需要服务消费者端要有一些容错机制,如重试,断路器等。

    通过在 Eureka Server 配置如下参数,开启或者关闭保护机制,生产环境建议打开:

    eureka.server.enable-self-preservation=true
    

    Eureka 集群原理

    再来看看 Eureka 集群的工作原理。我们假设有三台 Eureka Server 组成的集群,第一台 Eureka Server 在北京机房,另外两台 Eureka Server 在深圳和西安机房。这样三台 Eureka Server 就组建成了一个跨区域的高可用集群,只要三个地方的任意一个机房不出现问题,都不会影响整个架构的稳定性。

    在这里插入图片描述

    从图中可以看出 Eureka Server 集群相互之间通过 Replicate 来同步数据,相互之间不区分主节点和从节点,所有的节点都是平等的。在这种架构中,节点通过彼此互相注册来提高可用性,每个节点需要添加一个或多个有效的 serviceUrl 指向其他节点。

    如果某台 Eureka Server 宕机,Eureka Client 的请求会自动切换到新的 Eureka Server 节点。当宕机的服务器重新恢复后,Eureka 会再次将其纳入到服务器集群管理之中。当节点开始接受客户端请求时,所有的操作都会进行节点间复制,将请求复制到其它 Eureka Server 当前所知的所有节点中。

    另外 Eureka Server 的同步遵循着一个非常简单的原则:只要有一条边将节点连接,就可以进行信息传播与同步。所以,如果存在多个节点,只需要将节点之间两两连接起来形成通路,那么其它注册中心都可以共享信息。每个 Eureka Server 同时也是 Eureka Client,多个 Eureka Server 之间通过 P2P 的方式完成服务注册表的同步。

    Eureka Server 集群之间的状态是采用异步方式同步的,所以不保证节点间的状态一定是一致的,不过基本能保证最终状态是一致的。

    Eureka 分区
    Eureka 提供了 Region 和 Zone 两个概念来进行分区,这两个概念均来自于亚马逊的 AWS:
    region:可以理解为地理上的不同区域,比如亚洲地区,中国区或者深圳等等。没有具体大小的限制。根据项目具体的情况,可以自行合理划分 region。
    zone:可以简单理解为 region 内的具体机房,比如说 region 划分为深圳,然后深圳有两个机房,就可以在此 region 之下划分出 zone1、zone2 两个 zone。

    上图中的 us-east-1c、us-east-1d、us-east-1e 就代表了不同的 Zone。Zone 内的 Eureka Client 优先和 Zone 内的 Eureka Server 进行心跳同步,同样调用端优先在 Zone 内的 Eureka Server 获取服务列表,当 Zone 内的 Eureka Server 挂掉之后,才会从别的 Zone 中获取信息。

    Eurka 保证 AP

    Eureka Server 各个节点都是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。而 Eureka Client 在向某个 Eureka 注册时,如果发现连接失败,则会自动切换至其它节点。只要有一台 Eureka Server 还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的(不保证强一致性)。

    Eurka 工作流程

    了解完 Eureka 核心概念,自我保护机制,以及集群内的工作原理后,我们来整体梳理一下 Eureka 的工作流程:

    1、Eureka Server 启动成功,等待服务端注册。在启动过程中如果配置了集群,集群之间定时通过 Replicate 同步注册表,每个 Eureka Server 都存在独立完整的服务注册表信息

    2、Eureka Client 启动时根据配置的 Eureka Server 地址去注册中心注册服务

    3、Eureka Client 会每 30s 向 Eureka Server 发送一次心跳请求,证明客户端服务正常

    4、当 Eureka Server 90s 内没有收到 Eureka Client 的心跳,注册中心则认为该节点失效,会注销该实例

    5、单位时间内 Eureka Server 统计到有大量的 Eureka Client 没有上送心跳,则认为可能为网络异常,进入自我保护机制,不再剔除没有上送心跳的客户端

    6、当 Eureka Client 心跳请求恢复正常之后,Eureka Server 自动退出自我保护模式

    7、Eureka Client 定时全量或者增量从注册中心获取服务注册表,并且将获取到的信息缓存到本地

    8、服务调用时,Eureka Client 会先从本地缓存找寻调取的服务。如果获取不到,先从注册中心刷新注册表,再同步到本地缓存

    9、Eureka Client 获取到目标服务器信息,发起服务调用

    10、Eureka Client 程序关闭时向 Eureka Server 发送取消请求,Eureka Server 将实例从注册表中删除

    这就是Eurka基本工作流程

    总结

    讲了 Eureka 核心概念、Eureka 自我保护机制和 Eureka 集群原理。通过分析 Eureka 工作原理,我可以明显地感觉到 Eureka 的设计之巧妙,通过一些列的机制,完美地解决了注册中心的稳定性和高可用性。

    Eureka 为了保障注册中心的高可用性,容忍了数据的非强一致性,服务节点间的数据可能不一致, Client-Server 间的数据可能不一致。比较适合跨越多机房、对注册中心服务可用性要求较高的使用场景。

    展开全文
  • Eureka实现原理

    2021-07-28 18:21:00
    Eureka服务集群以及原理 服务注册 提供服务ip地址,端点等各项服务发现基本信息 服务取消 客户端连续一段时间没有向Eureka服务端发送服务续约消息,就会将其从服务列表剔除 Eureka服务存储和缓存 在Eureka,...
  • Eureka 实现原理

    千次阅读 2019-06-13 13:53:00
    Eureka 是 Netflix 出品的用于实现服务注册和发现的工具。 Spring Cloud 集成了 Eureka,并提供了开箱即用的支持。其中, Eureka 又可细分为 Eureka Server 和 Eureka Client。 上图是来自eureka的官方架构图,这...
  • eureka底层原理

    千次阅读 2020-09-17 15:41:09
  • Eureka是Spring Cloud的组件之一,那么EureKa实现原理到底是什么?
  • 最近接手一个项目,需要重启服务时先注销掉当前服务,再重启程序,这样就不会因为ribbon负载均衡到重启的服务上从而丢失请求,那么我们...向eurekaserver发送delete请求 比如说现在想注销下图中的PRODUCER服务 那么...
  • 【SpringCloud基础】Eureka实现原理

    千次阅读 2017-10-23 20:31:47
    Eureka基础架构 Eureka服务治理基础架构包括三个核心要素。 1、服务注册中心 Eureka分为客户端和服务端,Eureka服务端提供服务注册与发现的功能。 2、服务提供者 提供服务的应用,Spring Boot应用或者遵循...
  • SpringCloud微服务_3 Eureka注册中心实现原理 作者:田超凡 版权所有,转载请注明原作者,仿冒侵权必究法律责任 1 Eu...
  • Eureka: 负责各个服务的注册于发现,分为服务端和客户端 在每个客户端启动的时候,会自动的将自己的服务名称,ip地址,端口号等信息注册到注册中心。 服务端是一个注册中心,里面有一个注册表,保存了各服务所在的...
  • 然而Netflix的服务发现组件Eureka已经停止更新,大多公司在使用的时候就发现过其一个细小的Bug;而其他的众多组件也将停止维护。所以急需其他的一些替代产品,也就是spring cloud alibaba,目前正在蓬勃发展。 说到...
  • Eureka原理笔记

    2020-04-23 11:53:41
    Eureka底层用Jersey实现,也是MVC架构,依靠过滤器处理请求 主要功能 服务注册 默认90s 服务剔除 判断是否启动自我保护机制,如果没开启,就把一批过期节点从注册表中删掉,缓存中也删掉 自我保护机制-15分钟...
  • Eureka 是 Netflix 出品的用于实现服务注册和发现的工具。 Spring Cloud 集成了 Eureka,并提供了开箱即用的支持。其中, Eureka 又可细分为 Eureka Server 和 Eureka Client。 1.基本原理 上图是来自eureka的...
  • 声明:本文中所使用的 Springboot1.5.22,SpringCloud 版本为 Edgware.SR4,Eureka 版本根据SpingCloud 依赖为 1.4.5.RELEASE 项目依赖如下 <dependencyManagement> <dependencies> <dependency&...
  • Spring Cloud-Eureka Client 原理解析Netflix 和 SpringCloudSpring Cloud Netflix Eureka 服务发现实现原理DiscoveryClient 接口@EnableDiscoveryClient 注解Eureka 架构图源码解析配置信息读取读取 eureka.client....
  • 前面入门系列已经讲了eureka的简单使用,这篇对于eureka原理进行解析说明 1、Eureka架构图 官方给的架构图。至于各个流程是怎么样的,看下面 2、Eureka核心功能点 服务注册(register):Eureka Client会...
  • 二、Eureka Server设计精妙的注册表存储结构 三、Eureka Server端优秀的多级缓存机制 四、总结     一、问题起源   Spring Cloud架构体系中,Eureka是一个至关重要的组件,它扮演着微服务注册中心的角色...
  • SpringCloud底层原理

    2021-01-27 14:22:08
    毫无疑问,SpringCloud是目前微服务架构领域的翘楚,无数的书籍...Eureka、Ribbon、Feign、Hystrix、Zuul入手,来剖析其底层的工作原理。先来给大家说一个业务场景,假设咱们现在开发一个电商网站,要实现支付订单的
  • SpringCloud-Eureka原理解析

    万次阅读 多人点赞 2019-04-27 10:24:41
    微服务架构中最核心的部分是服务治理,服务治理最基础...随着微服务架构的发展,出现了很多微服务架构的解决方案,其中包括我们熟知的Dubbo和Spring Cloud。 ...Spring Cloud支持了Zookeeper、Consul和Eureka,官方推...
  • 这节课讲述如何开发微服务架构应用程序以及如何使用Eureka集群实现高可用服务治理。(带源码和源码讲解)
  • 不过大多数讲解还停留在对Spring Cloud功能使用的层面,其底层的很多原理,很多人可能并不知晓。因此本文将通过大量的手绘图,给大家谈谈Spring Cloud微服务架构的底层原理。 实际上,Spring Cloud是一个全家桶式的...
  • Spring Cloud针对服务注册与发现,进行了一层抽象,并提供了三种实现: Eureka(支持得最好)、Consul、Zookeeper。 由于项目中使用到了Eureka,所以对Eureka有了一个深入的了解. 1.Eureka概述  Eureka 是 Netflix...
  • 负载均衡Ribbon底层实现

    千次阅读 2018-12-06 10:32:30
    上篇文章讲述了SpringCloud框架如何实现负载均衡,非常简单,今天,我们采用Debug方式追底层源码,探究它是如何实现负载均衡的,已经底层负载机制为什么是轮询 上篇文章:负载均衡Ribbon 准备 准备一个Eureka,三个...
  • Eureka服务注册、续约、注销原理

    千次阅读 2019-03-14 10:00:55
    这篇文章,我们将深入学习Eureka底层中服务注册、续约、注销的基本原理。 1.服务注册 在微服务架构中,一个服务提供者本质上也是一个Eureka客户端。启动时,会调用Eureka所提供的服务注册相关方法,向Eureka服务器...
  • 在之前的Spring Cloud Config的基础上,搭建简单的Eureka Server 没有代码,很多试验做不起来,我们先创建个Eureka Server再说。 本篇主要讲如何创建Eureka Server和Eureka Client,还有个重点是通过源码分析...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,583
精华内容 2,233
关键字:

eureka底层实现原理