作为spring cloud的服务注册和发现机制,eureka承担了这个角色。
服务网提供者在启动的时候通过读取到配置中eureka server的地址通过发送REST请求将自己注册到eureka server中,eureka server会将服务提供者发送的服务的元数据信息存储在一个双层的map中,
第一层key是服务名,第二层key是具体服务的实例名(一般名称: applicaitonName-port)。
在服务注册时,会判断:
eureka-client.register-with-eureka=true 如果为true则会进行上述服务注册,如果为false不会启动服务注册

#是否注册服务,默认为true,设置为false时,不会注册服务
eureka.client.register-with-eureka=true

服务同步

当有多个eureka-server服务实例并相互注册时,如果服务提供者值注册了其中一个实例,这时候eureka-server其他实例会将改服务信息同步过去

服务续约

服务注册完之后,服务提供者会通过定时与eureka-server维护心跳机制,来告诉eureka-server自己还活着,防止eureka-server的定时剔除下线服务任务将该服务从服务列表中排除出去

#服务注册后,服务提供者会与eureka-server进行心跳,防止eureka-server将不活跃实例剔除
#eureka-server的服务续约任务的调用时间间隔,默认为30s,即每30s检查一次服务是否存活
eureka.instance.lease-renewal-interval-in-seconds=30
#服务时效的时间,默认为90s,即90s内没有心跳,该服务剔除
eureka.instance.lease-expiration-duration-in-seconds=90

获取服务

当服务消费者启动后,会向eureka-server发送REST请求,获取服务列表,eureka-server会返回一个只读的服务清单给客户端

#消费端是否获取服务列表
eureka.client.fetch-registry=true
#消费端缓存服务列表清单的时效时间
eureka.client.registry-fetch-interval-seconds=30

服务调用

消费者获取到服务清单之后,通过服务名可以获得服务实例的具体信息,客户端可以根据自己需要决定调用哪个实例,在ribbon中默认采用轮询的机制进行调用,从而实现客户端的负载均衡
eureka中有Region和Zone的概念,一个Region中包含多个Zone,每个服务客户端(服务消费者和服务提供者)都会被注册到一个Zone中,每个客户端对应一个Regiion和一个 Zone,在进行服务调用的时候,优先访问处于同一个Zone中的服务提供方,如果访问不到在访问其他Zone

服务下线

当服务实例进行正常的关闭操作时候,会发送一个服务下线的REST请求给eureka-server,eureka-server接收到该请求之后将服务状态设置为DOWN下线状态,并把该事件传播出去。

注册中心的失效剔除

eureka-server在启动的时候会创建一个定时任务,每隔一段时间(默认60s)将当前服务列表中超时(默认90s)没有续约的服务剔除出去

注册中心的自我保护

在实际开发中,在本地调试的时候基本上会发现eureka-server的控制面板中会经常出现如下信息:

eureka 注册中心 map的命名 eureka注册机制_spring


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-server的自我保护机制。服务注册之后,服务会定时与eureka-server之间维护心跳信息,来保活,eureka-server在运行期间会统计心跳失败的比例在15分钟之内是否低于85%,如果低于这个值,则eureka-server会将当前服务列表保护起来,让这些服务实例不会过期,但是如果保护期间服务实例本身出现问题,则服务消费端拿到的可能是已经不存在的服务实例,会出现调用失败,因此客户端必须要有容错机制,例如请求重试,断路器等。

#禁用保护机制,确保注册中心可以将不可用的实例正确剔除
eureka.server.enable-self-preservation=false

常用eureka.instance配置如下:

#服务属于哪一个zone
eureka.instance.metadata-map.zone=region1-zone1
#是否优先使用IP地址作为主机名的标识
eureka.instance.prefer-ip-address=false
#向注册中心发送心跳的时间间隔,默认30s
eureka.instance.lease-renewal-interval-in-seconds=30
#注册中心收到上一次心跳之后等待多长时间没有心跳信息剔除服务
eureka.instance.lease-expiration-duration-in-seconds=90
#非安全通信端口
eureka.instance.non-secure-port=80
#安全通信端口
eureka.instance.secure-port=443
#是否启用非安全通信端口
eureka.instance.non-secure-port-enabled=true
#是否启用安全通信端口
eureka.instance.secure-port-enabled=false
#服务名,默认为spring.application.name,没有则为unknown
eureka.instance.appname=""
#主机名,不配置时候根据操作系统的主机名来获取
eureka.instance.hostname=""
#实例ID,可以通过 ${spring.application.name}:${random.int}来区分不同实例,从而可以不改变端口
eureka.instance.instance-id=${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id:${server.port}}
eureka.instance.status-page-url=
eureka.instance.health-check-url=

常用eureka.client配置如下:

#########################################################
#启用eureka客户端
eureka.client.enabled=true
#是否获取服务列表
eureka.client.fetch-registry=true
#获取配置中服务列表间隔时间
eureka.client.registry-fetch-interval-seconds=30
#更新服务实例信息的变化到注册中心的间隔时间
eureka.client.instance-info-replication-interval-seconds=30
#初始化实例信息到注册中心间隔时间
eureka.client.initial-instance-info-replication-interval-seconds=40
#轮询注册中心地址更改的时间间隔,与spring cloud config配合时动态刷新eureka的serviceURL该参数起作用
eureka.client.eureka-service-url-poll-interval-seconds=300
#读取注册中心信息超时时间
eureka.client.eureka-server-read-timeout-seconds=8
#客户端到每个注册中心的连接总数
eureka.client.eureka-server-total-connections-per-host=50
#客户端到所有注册中心的连接总数
eureka.client.eureka-server-total-connections=200
#客户端与注册中心连接的空闲关闭时间
eureka.client.eureka-connection-idle-timeout-seconds=30
#心跳连接池的线程数
eureka.client.heartbeat-executor-thread-pool-size=2
#心跳超时延迟时间的乘数值
eureka.client.heartbeat-executor-exponential-back-off-bound=10
#缓存刷新线程池线程数
eureka.client.cache-refresh-executor-thread-pool-size=2
#缓存刷新重试延迟时间的乘数值
eureka.client.cache-refresh-executor-exponential-back-off-bound=10
#使用DNS来虎丘注册中心的serviceUrl
eureka.client.use-dns-for-fetching-service-urls=false
#是否注册服务,默认为true,设置为false时,不会注册服务
eureka.client.register-with-eureka=true
#服务消费者优先消费在同一zone的服务提供者
eureka.client.prefer-same-zone-eureka=true
#获取服务实例是否过滤,仅保留UP状态的实例
eureka.client.filter-only-up-instances=true
#服务的region,默认为default,一个服务实例只能有一个region
eureka.client.region="azure"
#region对应的zone信息
eureka.client.availability-zones.azure=azure-region-1,azure-region-2
#zone对应的注册中心地址
eureka.client.service-url.azure-region-1="http://azure-region-1:8081/eureka"
#zone对应的注册中心地址
eureka.client.service-url.azure-region-2="http://azure-region-2:8082/eureka"