作为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的控制面板中会经常出现如下信息:
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"