Spring Cloud Eureka服务注册中心入门流程分析
目录
- 项目搭建
- 客户端注册
- 聚合层处理
- Eureka架构
- 集群搭建
- 多区域配置
- 自我保护开关
- 心跳机制
- Eureka实例信息存储
- 项目地址
在学习Ribbon使用的时候,我们是直接在配置文件中写死服务地址的,是不是特别的不方便?我们是不是需要一个统一的地方来维护这些服务,以及这些配置发生变化后,我们不需要重启服务。
所以这个时候需要引出一个新组件——eureka。
它主要可以帮助我们实现如下功能:
- 地址的统一维护服务提供者的动态上下线通知
- 服务提供者可以将服务注册到eureka上,eureka通过键值对的形式将信息进行保存。
服务消费者可以直接根据KEY去eureka上获取服务即可。
这里我们首先来看下eureka的整体架构图,逐步分析下具有那些流程:
Eureka 实现服务注册与发现的流程如下:
- 搭建一个 Eureka Server 作为服务注册中心;
- 服务提供者 Eureka Client 启动时,会把当前服务器的信息以服务名(spring.application.name)的方式注册到服务注册中心;
- 服务消费者 Eureka Client 启动时,也会向服务注册中心注册;
- 服务消费者还会获取一份可用服务列表,该列表中包含了所有注册到服务注册中心的服务信息(包括服务提供者和自身的信息);这个列表会缓存到消费者本地,然后会定时轮询更新。
- 在获得了可用服务列表后,服务消费者通过 HTTP 或消息中间件远程调用服务提供者提供的服务。
- 然后在Eureka中还有一个心跳检测机制,从而实现我们的动态上下线感知。
项目搭建
了解了它的整体流程之后,我们来搭建一个Eureka服务。
搭建其实很简单,我们直接创建一个Spring Boot 项目即可,然后选择Eureka Server依赖即可。
最后只需在启动程序上添加@EnableEurekaServer
注解即可。
这个时候启动项目即可进入Eureka的控制面板。(默认端口8761,创建完项目后自行修改)
启动项目之后,大家可能会遇到如下错误:Cannot execute request on any known server
简单翻译就是不能请求到任何确定的服务上。因为我们的eureka-server本身既是服务提供者又是一个项目,所以我们也需要将他自己注册上去,那如何自己注册自己呢?
我们只需要通过如下命令制定好注册中心的地址即可,然后重新启动项目,即可发现我们的服务已经注册上去了。这个地方的话可以不注册,因为会默认注册到8761端口,但是如果搭建集群的话就需要我们自己指定了。
server.port=8761 # 指向服务注册中心的地址 eureka.client.service-url.defaultZone=http://localhost:8761/eureka
我们也可以默认不注册,添加如下配置信息:
# 是否要注册 eureka.client.register-with-eureka=false # 是否要更新注册信息 eureka.client.fetch-registry=false
客户端注册
注册中心搭建完成之后,我们需要将项目进行注册,首先需要引入相关依赖:
<!-- eureka 客户端注册--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
然后需要进行注册地址的配置:
# 注册中心地址 eureka.client.service-url.defaultZone=http://localhost:8761/eureka
这个时候我们重新启动这些项目,即可发现他们已经注册到eureka上了。
但是我们点击后面的状态时,是看不到任何数据的,这个时候我们需要引入actuator
。
<!--actuator--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
然后需要暴露相关端口,我这边是直接暴露了所有,生产环境可不能这么操作。
management.endpoints.web.exposure.exclude=*
聚合层处理
既然我们已经将各个模块的项目注册到eureka上了,我们在聚合层中就不需要在使用写死的配置信息了。
我们将之前的配置信息注释,然后将聚合层注册到eureka上。这个时候可以发现我们的接口是可以正常下单的,说明我们的配置中心生效了,首先就完成了对地址信息统一维护的功能。
这就是我们为什么引入spring cloud的原因,极大的减少了我们的工作量。
Eureka架构
上图是Eureka的整体架构的设计。
我们知道在微服务中,任何节点都是需要做高可用的,也就是不能是单节点。我们的Eureka也是,但是它的集群和我们之前接触的集群是不同的,它没有主从的概念,它所有的节点都是水平的,两两节点间的数据是可以相互复制的,任何一个客户端都可以访问任何一个节点。
因为Eureka遵守的是一个AP理论,这里主要需要保持一个高可用性,因为如果是主从模型,我们在主从同步的时候,如果发生延迟就会存在短期不可用,所以为了保持高可用性,就采用了这种无中心化的集群节点。
上图中的一些关键名词说明如下:
- Application Service: 作为Eureka Client,扮演了服务的提供者,提供业务服务, 向Eureka Server注册和更新自己的信息,同时能从Eureka Server的注册表中获取到 其他服务的信息。
- Eureka Server: 扮演服务注册中心的角色,提供服务注册和发现的功能,每个Eureka Cient向Eureka Server注册自己的信息,也可以通过Eureka Server获取到其他服务的 信息达到发现和调用其他服务的目的。
- Application Client: 作为Eureka Client,扮演了服务消费者,通过Eureka Server获取到注册到上面的其他服务的信息,从而根据信息找到所需的服务发起远程调 用。
- Replicate: Eureka Server中的注册表信息的同步拷贝,保持不同的Eureka Server 集群中的注册表中的服务实例信息的一致性。提供了数据的最终一致性。
- Make Remote Call: 服务之间的远程调用。
- Register: 注册服务实例,Client端向Server端注册自身的元数据以进行服务发现。
- Renew: 续约,通过发送心跳到Server维持和更新注册表中的服务实例元数据的有效 性。当在一定时长内Server没有收到Client的心跳信息,将默认服务下线,将服务实例 的信息从注册表中删除。
- Cancel: 服务下线,Client在关闭时主动向Server注销服务实例元数据,这时Client 的的服务实例数据将从Server的注册表中删除。
集群搭建
Eureka的集群搭建是很简单的,我们重新创建一个eureka-server模块。和上文一样的步骤即可,然后在配置文件中互相指定注册地址。
eureka-server
# 应用名称 spring.application.name=eureka-server server.port=8761 # 指向服务注册中心的地址 eureka.client.service-url.defaultZone=http://localhost:8762/eureka # 是否要注册 #eureka.client.register-with-eureka=false # 是否要更新注册信息 #eureka.client.fetch-registry=false
eureka-server-replica
# 应用名称 spring.application.name=eureka-server-replica server.port=8762 # 指向服务注册中心的地址 eureka.client.service-url.defaultZone=http://localhost:8761/eureka
然后启动项目,可以发现两个项目已经互相注册了 。
由于我们之前的服务都是注册到8761节点上的,这个时候我们随便启动一个服务,可以发现8762节点上也会有相应的服务。
我们需要让其他服务也注册到新的节点上吗?其实是需要的,因为我们是去中心化的节点,所以如果8761节点挂了,那我们还能继续注册到8762节点上,保持我们的高可用性。多个节点我们只需要使用逗号隔开就可以。
eureka.client.service-url.defaultZone=http://localhost:8761/eureka,http://localhost:8762/eureka
多区域配置
我们搭建集群的时候为了实现灾备的功能,可以将各节点部署在不同的区域,然后客户端获取服务的时候可以从就近的区域获取,如果就近区域节点宕机后照样可以去获取其他正常的节点服务。
实现这个功能也很简单,接下来我们对各个项目进行相关的配置。
我们这里主要对两个eureka-server服务以及portal,goods-service项目进行配置,首先因为是分区,我们需要加上如下配置信息,表示地点在北京,以及北京地区的两个区域机房。几个项目都需要进行如下的配置。
# 区域 eureka.client.region=beijing # 配置不同的机房 eureka.client.availability-zones.beijing=zone-1,zone-2 eureka.client.service-url.zone-1=http://localhost:8761/eureka eureka.client.service-url.zone-2=http://localhost:8762/eureka
然后我们来处理goods-service项目,因为我们之前以及做了一个简易的集群,所以我们这里将配置文件复制出来,每个节点使用不同的配置文件。
每个配置文件中最后都需要指定该节点是属于那个区域的。
# 应用服务 WEB 访问端口 server.port=9090 # 注册中心地址 #eureka.client.service-url.defaultZone=http://localhost:8761/eureka,http://localhost:8762/eureka eureka.client.region=beijing eureka.client.availability-zones.beijing=zone-1,zone-2 eureka.client.service-url.zone-1=http://localhost:8761/eureka eureka.client.service-url.zone-2=http://localhost:8762/eureka # 所属区域 eureka.instance.metadata-map.zone=zone-1
我们的另一个节点需要指定配置文件。
goods-service处理完成后,我们在protal项目中进行相同的配置,但是需要额外添加配置让服务默认调用同区域的服务。
eureka.client.region=beijing eureka.client.availability-zones.beijing=zone-1,zone-2 eureka.client.service-url.zone-1=http://localhost:8761/eureka eureka.client.service-url.zone-2=http://localhost:8762/eureka eureka.instance.metadata-map.zone=zone-1 # 默认调用同区域的服务 eureka.client.prefer-same-zone-eureka=true
这个时候我们将所有服务启动,查看相应效果。
可以看到所有的请求默认都是到9090节点上的,这个时候我们将9090节点停止。
停止后,我们再次访问可能会请求失败,可以稍等会请求,这是由于停止后,9090节点的服务并没有立刻从eureka下线,属于自我保护机制的问题。
以上便是使用eureka进行多区域配置的一个简单演示。
Eureka自我保护机制
官方对于自我保护机制的定义:
自我保护模式正是一种针对网络异常波动的安全保护措施,使用自我保护模式能使Eureka集群更加的健壮、稳定的运行。
自我保护机制的工作机制是:如果在15分钟内超过85%的客户端节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,Eureka Server自动进入自我保护机制,此时会出现以下几种情况:
- Eureka Server不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。
- Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用。
- 当网络稳定时,当前Eureka Server新的注册信息会被同步到其它节点中。
因此Eureka Server可以很好的应对因网络故障导致部分节点失联的情况,而不会像ZK那样如果有一半不可用的情况会导致整个集群不可用而变成瘫痪。
我们可以通过如下参数配置比例:
eureka.server.renewal-percent-threshold=0.85
我们怎么确定是谁的85%没有心跳则会触发呢,是图中所示的预期renew值,如果低于10*0.85的客户端没有续约,则进入自我保护机制。
Renews threshold = 服务总数 * 每分钟的续约数量 (60s/客户端续约(心跳)间隔时间) * renewal-percent-threshold
自我保护开关
Eureka自我保护机制,通过配置 eureka.server.enable-self-preservation
来true
打开/false
禁用自我保护机制,默认打开状态,建议生产环境打开此配置。
心跳机制
上文的续约说到底就是我们的心跳机制,整体流程可以参考下图。
Eureka实例信息存储
上文说过我们是通过键值对来存储服务信息的,整体结构大致如下图所示:
项目地址
到此这篇关于Spring Cloud Eureka服务注册中心入门的文章就介绍到这了,更多相关Spring Cloud Eureka服务注册内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!