赞
踩
Netflix Eureka 是一款由 Netflix 开源的基于 REST 服务的注册中心,用于提供服务发现功能。Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件的一部分,基于 Netflix Eureka 进行了二次封装,主要负责完成微服务架构中的服务治理功能。
Spring Cloud Eureka 是一个基于 REST 的服务,并提供了基于 Java 的客户端组件,能够非常方便的将服务注册到 Spring Cloud Eureka 中进行统一管理。
Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件的一部分,基于 Netflix Eureka 做了二次封装,主要负责实现微服务架构中的服务治理功能。
服务治理是微服务架构中必不可少的一部分,阿里开源的 Dubbo 框架就是针对服务治理的。服务治理必须要有一个注册中心,除了用 Eureka 作为注册中心外,我们还可以使用 Consul、Etcd、Zookeeper 等来作为服务的注册中心。
Eureka 由两部分组成:服务端和客户端,服务端就是注册中心,用来接收其它的服务注册,客户端是一个java客户端,用来注册,并可以实现负载均衡等功能。
主要是因为 Eureka 是基于 AP 原则构建的,而 ZooKeeper 是基于 CP 原则构建的。在分布式系统领域有个著名的 CAP 定理,即 C 为数据一致性;A 为服务可用性;P 为服务对网络分区故障的容错性。这三个特性在任何分布式系统中都不能同时满足,最多同时满足两个。Zookeeper 有一个 Leader,而且在这个 Leader 无法使用的时候通过 Paxos(ZAB)算法选举出一个新的 Leader。这个 Leader 的任务就是保证写数据的时候只向这个 Leader 写入,Leader 会同步信息到其他节点。通过这个操作就可以保证数据的一致性。
想要保证 AP 就要用 Eureka,想要保证 CP 就要用 Zookeeper。
拆开来看注册和中心。注册比如用户注册,就是将自己的信息注册在某个平台上。中心可以理解成一个统一管理信息的平台。所以注册中心顾名思义是统一管理所有注册信息的平台。
指的是服务在启动时将自身的信息注册到注册中心中,方便信息进行统一管理。服务注册是客户端向注册中心提交信息的动作。
想要参与服务注册发现的实例首先需要向Eureka服务器注册信息 注册在第一次心跳发生时提交
服务注册--客户端配置选项
1 2 3 4 5 6 |
|
服务注册--服务器端配置选项
1 2 3 4 |
|
指的是从注册中心获取对应服务的信息,是客户端向注册中心拉取pull信息的动作。
概念:实现服务治理,即管理所有的服务信息和状态。 eureka分为两部分,Server端和Client端 Client端向Server端定时发送心跳包。 Server端根据Clinet端的心跳包,来维护一个服务列表(判断服务是否在线)。
1 2 3 |
|
server和client通过心跳保持 服务列表,而只有状态为UP的服务才能被访问。看eureka界面中的status。 比如心跳一直正常,服务一直UP,但是此服务DB连不上了,无法正常提供服务(有的时候业务出现问题catch住异常,也可以手动传输DOWN让服务下线)。 此时,我们需要将 微服务的健康状态也同步到server。只需要启动eureka的健康检查就行。这样微服务就会将自己的健康状态同步到eureka。配置如下即可。 开启手动控制 在client端配置:将自己真正的健康状态传播到server。
1 2 3 4 |
|
Client端配置Actuator
1 2 3 4 |
|
改变健康状态的Service
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
集群之间的同步复制是通过HTTP的方式进行,基于网络的不可靠性,集群中的Eureka Server间的注册表信息难免存在不同步的时间节点,不满足CAP中的C(数据一致性)。
Eureka有三个角色:
Eureka Server
:注册中心Eureka Provider
:服务提供者Eureka Consumer
:服务消费者Eureka Server主要对外提供了三个功能:
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从当前的服务注册列表中剔除。
服务续约,有两个相关的属性(一般不建议修改):
1 2 3 4 |
|
当 Eureka Client 下线时,它会主动发送一条消息,告诉Eureka Server,我下线了。
Eureka Client 从Eureka Server 上获取服务的注册信息,将其缓存在本地。本地客户端在需要调用远程服务时,会从该信息中查找远程服务所对应的IP地址、端囗等信息。Eureka Client 上缓存的服务注册信息会定期更新(30秒),如果 Eureka Server 返回的注册表信息与本地缓存的注册表信息不同的话,Eureka Client 会自动处理。
这里,也涉及至两个属性,一个是是否允许获取注册表信息:
1 |
|
Eureka Client 上缓存的服务注册信息,定期更新的时间间隔,默认30秒:
1 |
|
打开start.spring.io/ 或者阿里云的快速start start.aliyun.com/bootstrap.h… ,开始构建对应的服务端项目。推荐使用阿里云的快速start,因为访问速度更快些。
自动生成完成后,在resource目录下,新建application.yml
文件替换原来的application.properties
。内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
在SpringBoot的启动类上添加@EnableEurekaServer 注解,表示是Eureka 服务端。
项目创建成功后,在项目启动类上添加注解,标记该项目是一个Eureka Server:
1 2 3 4 5 6 7 |
|
然后启动项目,项目启动成功后在浏览器访问:http://localhost:8001 就可以看到Eureka的管理页面了。
目前还没有任何一个服务注册到 Eureka 中,不过从上图中,我们还是可以看到关于 Eureka 服务器内存、CPU 、IP等的相关信息。
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE。
图中红色警告翻译为:紧急!Eureka已经不能确认这些已经启动的实例是否可用,由于最近的续订次数小于续订阈值(续订期望值),为了安全起见(实例可用),当前这些实例不会删除。 这是因为Eureka进入自我保护模式(SELF PRESERVATION MODE)。
高可用:可以通过运行多个Eureka server实例并相互注册的方式实现。Server节点之间会彼此增量地同步信息,从而确保节点中数据一致。
写一个地址也行(但是server得互相注册),EurekaServer会自动同步,但为了避免极端情况,还是写多个。 集群中各个server会从其他server同步注册表信息。
1 2 3 4 5 6 |
|
单个 Eureka 服务可能存在的单点失效问题,我们通常都需要构建一个 Eureka 服务器集群来确保注册中心本身的可用性。与传统的集群构建方式不同,如果我们把 Eureka 也视为一个服务,也就是说 Eureka服务自身也能注册到其他 Eureka 服务上,从而实现相互注册,并构成一个集群。 同样可以通过单节点构建步骤构建两个Eureka Server服务A和B。对应的yml配置如下:
1 2 3 4 5 6 7 8 |
|
1 2 3 4 5 6 7 8 |
|
**eureka.instance.hostname **是Eureka 实例管理类配置项 ,用于指定当前 Eureka 服务的主机名称。 需要在本机的hosts文件中添加以下信息:
127.0.0.1 eurekaA
127.0.0.1 eurekaB
eureka.client.serviceUrl.defaultZone
用于指向集群中的其他 Eureka 服务器。register-with-eureka
(是否将自己实例注册到Eureka Server中) 和 fetch-registry
(是否应从Eureka Server获取Eureka注册表信息)配置项应该都使用其默认的 true 值,我们不需要对其进行显式的设置。客户端引入的pom坐标有差异,需要引入客户端坐标:
1 2 3 4 |
|
在启动类上需要加@EnableDiscoveryClient
注解表示是Eureka客户端。
1 2 3 4 5 6 7 |
|
yml配置如下:
1 2 3 4 5 6 7 8 9 10 |
|
配置完成后可以在eureka控制台查看到相关注册信息。
启动命令
- java -jar eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=a
- java -jar eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=b
注意:启动第一个a之后你会发现控制台报错,是因为它一直发送心跳,而同时b还没有上线,等b也启动后错误即可消失。如果还报错,那就是代码的问题了。
启动成功后,就可以看到两个服务之间互相注册,共同组成一个集群。
背景:用户量比较大或者用户地理位置分布范围很广的项目,一般都会有多个机房。这个时候如果上线springCloud服务的话,我们希望一个机房内的服务优先调用同一个机房内的服务,当同一个机房的服务不可用的时候,再去调用其它机房的服务,以达到减少延时的作用。
概念:region:能够简单理解为地理上的分区。好比亚洲地区,或者华北地区,再或者北京地区等等,没有具体大小的限制,根据项目具体的状况,能够自行划分region。 zone:能够简单理解为 region 内的具体机房,好比说 region 划分为华北地区,而后华北地区有两个机房,就能够在此 region 之下划分出 zone1、zone2 两个 zone eureka 也借用了 region 和 zone 的概念架构
如图所示,有一个 region:华北地区,下面有两个机房,机房A 和机房Burl
服务注册相关:
eureka: client: # 尽可能向同一区域的 eureka 注册,默认为true prefer-same-zone-eureka: true #地区 region: huabei availability-zones: huabei: zone-1,zone-2 service-url: zone-1: http://Eureka的Ip地址:8761/eureka/ zone-2: http://Eureka的Ip地址:8761/eureka/
当存在多个注册中心时,选择逻辑为cdn
注册失败后每隔一个心跳时间,会再次尝试。it
为了保证服务注册到同一个 zone 的注册中心,必定要注意 availability-zones 的顺序,必须把同一 zone 写在最前面
eureka: instance: # 服务和注册中心的心跳间隔时间,默认为30s lease-renewal-interval-in-seconds: 30 # 服务和注册中心的心跳超时时间,默认为90s lease-expiration-duration-in-seconds: 90 metadata-map: # 当前服务所属的 zone zone: zone1
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。