Netflix-微服务设计必看-Eureka-的内部运作机制-深入剖析 (netflix)
在微服务架构中,服务发现和注册是确保各个微服务之间通信和协作的核心组件。Netflix Eureka 作为一款开源的服务发现和注册工具,在现代分布式系统中扮演着重要角色。本文将从代码层面深入探讨 Netflix Eureka 的底层实现原理,为读者详细呈现其内部运行机制。
Netflix Eureka 架构
Netflix Eureka 由 Eureka 服务器和 Eureka 客户端两部分构成。它们协同工作,构建了一个完整的服务发现和注册系统。
Eureka 服务器
![深入剖析](https://tyye.cn/zb_users/theme/tpure/style/images/lazyload.png)
Eureka 服务器负责存储和管理所有已注册的服务实例信息,保证服务发现的准确性。Eureka 服务器的核心是 InstanceRegistry、LeaseManager 和 SelfPreservationFilter。
InstanceRegistry(实例注册表)
实例注册表负责存储所有已注册的服务实例信息,包括它们的元数据,如实例 ID、主机名、端口等。从代码层面来看,InstanceRegistry 是一个包含了实例信息的内存数据结构,通常使用 ConcurrentHashMap 来存储,当一个新的服务实例注册时,InstanceRegistry 的 register 方法被调用,将该实例信息添加到注册表中;当一个服务实例不再可用,需要从 Eureka 服务器取消注册时,InstanceRegistry 的 cancel 方法被调用,从注册表中移除该实例信息。
LeaseManager(租约管理器)
租约管理器负责管理实例的租约,租约是 Eureka 服务器中的一个重要概念,用于确保实例的健康状态。在代码层面,LeaseManager 维护了一个租约的集合,并提供了操作租约的方法,主要包括:
- 注册实例并创建租约:register 方法负责为新注册的实例创建租约,并将其添加到租约管理器中。
- 续约租约:renew 方法用于更新租约的到期时间,延长租约的有效期。
- 移除租约:cancel 方法负责在实例取消注册时移除租约。
在服务实例注册时,LeaseManager 的 register 方法被调用,创建一个新的租约,并将其添加到租约管理器中。在服务实例定期发送心跳续约请求时,LeaseManager 的 renew 方法被调用,更新租约的到期时间,确保租约的有效性。当一个服务实例取消注册时,LeaseManager 的 cancel 方法被调用,从租约管理器中移除相应的租约。
SelfPreservationFilter(自我保护过滤器)
自我保护机制是 Netflix Eureka 服务器(服务端)中的一项重要功能。它旨在确保在网络抖动等异常情况下,Eureka 服务器不会过早地剔除正常运行的服务实例,从而保持服务的可用性和稳定性。当 Eureka 服务器开启自我保护机制时,它会监测心跳续约失败的实例数量。如果在某个时间段内,心跳续约失败的实例数量超过了预定的阈值,Eureka 服务器将进入自我保护模式。
在自我保护模式下,Eureka 服务器不会剔除任何正常运行的实例,以免影响整个系统的稳定性。这是为了避免在网络抖动等情况下,误判正常实例失效。需要注意的是,虽然自我保护机制保护了 Eureka 服务器上的服务注册表,但在自我保护模式下,Eureka 服务器将不再从已注册的实例中移除长时间未续约的实例,这可能会导致注册表中存在已经下线或失效的实例。因此,自我保护机制只是应对短期网络问题的临时解决方案,当问题解决后,Eureka 服务器会自动退出自我保护模式,重新
Eureka 客户端
Eureka 客户端是运行在各个微服务实例上的轻量级代理,负责将本实例注册到 Eureka 服务器,并定期发送心跳续约请求以维持租约。Eureka 客户端的核心是 DiscoveryClient。
DiscoveryClient
DiscoveryClient 是 Eureka 客户端的核心组件,负责与 Eureka 服务器交互,完成服务注册、续约和查询等操作。从代码层面来看,DiscoveryClient 负责发送注册请求、心跳续约请求和查询请求等 HTTP 请求,并处理 Eureka 服务器返回的响应。
总结
Netflix Eureka 作为一款开源的服务发现和注册工具,在现代分布式系统中发挥着至关重要的作用。通过深入剖析其底层实现原理,我们了解到 Eureka 服务器和 Eureka 客户端是如何协同工作,确保服务发现和注册的准确性和可靠性。这些知识对于设计和构建可扩展、高可用的微服务架构至关重要。
Eureka工作原理及快速使用
Eureka 是 Netflix 出品的用于实现服务注册和发现的工具,Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现 Eureka采用C-S的设计架构,包含Eureka Server 和Eureka Client两个组件 Applecation-server :服务提供者 Application-cliene:服务消费者 服务启动后向Eureka注册,Eureka Server会将注册信息向其他Eureka Server进行同步,当服务消费者要调用服务提供者,则向服务注册中心获取服务提供者地址,然后会将服务提供者地址缓存在本地,下次再调用时,则直接从本地缓存中取,完成一次调用。 在默认配置中EurekaServer服务在一定时间(默认为90秒)没接受到某个服务的心跳连接后,EurekaServer会注销该服务。 但是会存在当网络分区发生故障,导致该时间内没有心跳连接,但该服务本身还是健康运行的情况。 Eureka通过“自我保护模式”来解决这个问题。 在自我保护模式中,Eureka Server会保护服务注册表中的信息,不再注销任何服务实例。 CAP理论指出,一个分布式系统不可能同时满足C(一致性)、A(可用性)和P(分区容错性)。 由于分区容错性P在是分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡。 Zookeeper保证CP Zookeeper 为主从结构,有leader节点和follow节点。 当leader节点down掉之后,剩余节点会重新进行选举。 选举过程中会导致服务不可用,丢掉了可用行。 Eureka保证CP Eureka各个节点都是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。 而Eureka的客户端在向某个Eureka注册或时如果发现连接失败,则会自动切换至其它节点,只要有一台Eureka还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的(不保证强一致性)。 Eureka服务端依赖 服务端配置 将微服务注册到Eureka中 服务实例配置
docker comepose文件怎么写
使用SpringCloud构建实际的微服务架构。 基本概念:使用Docker进行集成测试混合持久化微服务架构服务发现API网关Docker使用Docker对每一个服务进行构建和部署。 使用DockerCompose在一个开发机上进行端到端的集成测试。 混合持久化混合持久化其实就是说使用多种数据库来存储。 不同的微服务实例都会使用它们自己的数据库,并通过REST服务或者消息总线来通信,举个例子,你可以使用基于以下数据库来构建微服务:Neo4j(图形化)MongoDB(文档化)MySQL(关联)微服务架构这个例子展示了如何使用微服务创建一个新的应用。 由于在项目中的每一个微服务只有一个单一的父项目。 开发者为此得到的收益是可以在本机上运行和开发每一个微服务。 添加一个新的微服务非常简单,当发现微服务时将会自动发现运行时的集群环境上。 ServiceDiscovery项目中包含两个发现服务,一个在NetflixEureka,另一个使用了ConsulfromHashicorp。 多种发现服务提供了多种选择,一个是使用(Consul)来做DNS服务集群,另一个是(Consul)基于代理的API网关。 API网关每一个微服务都关联Eureka,在整个集群中检索API路由。 使用这个策略,每一个在集群上运行的微服务只需要通过一个共同的API网关进行负载均衡和暴露接口,每一个服务也会自动发现并将路由请求转发到自己的路由服务中。 这个代理技术有助于开发用户界面,作为平台完整的API通过自己的主机映射为代理服务。 Docker实例下面的实例将会通过Maven来构建,使用Docker为每一个微服务构建容器镜像。 我们可以很优雅的使用DockerCompose在我们自己的主机上搭建全部的微服务集群。 开始构建在这之前,请先移步至项目的GitHub仓库。 pose/install/。 环境要求能够运行实例程序,需要在你的开发机上安装下面的软件:Maven3Java8DockerDockerCompose构建项目通过命令行方式来构建当前项目,在项目的根目录中运行如下的命令:$mvncleaninstall项目将会根据中的每一个项目声明中下载相应的依赖jar包。 每一个服务都将会被构建,同时Maven的Docker插件将会自动从本地DockerRegistry中构建每一个容器镜像。 Docker将会在构建成功后,根据命令行运行mvncleaninstall来清除相应的资源。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。