1.客户端功能
当添加了一个eureka-client组件到一个springboot工程时,依赖,属性,注解会启动一个eureka-client进程,完成和服务端交互
1.1注册:
程序启动时会携带自身的信息,包括服务名称,包括ip地址,包括端口号,等参数,以http协议请求访问 defaultZone
可以通过 eureka.client.register-with-eureka=true/false决定当前客户端是否进行注册
(注册是为了被别人调用,抓取是为了调用别人---可以控制是否开启注册或者抓取)
1.2抓取注册信息:
在启动之后,客户端默认每隔30秒中,继续访问服务端接口,进行抓取注册信息的功能,将服务端所有注册好的信息,同步到本地
可以通过 eureka.client.fetch-registry=true/false决定开启关闭抓取功能
1.3心跳续约:
为了让注册中心动态管理存活的有效的客户端,客户端默认每隔30秒中,向服务端发送一次心跳存活请求.在服务端接到请求,更新客户端信息时间戳.
同一个服务,可以有多个客户端作为服务提供者同时注册在注册中心
2.服务端功能
2.1管理注册信息:
接收到客户端注册时,会接收参数(客户端服务名称,ip,port,等等),在内存生成一个双层map对象 Map<String,Map<String,String>>
第一层map的key值:服务名称
第一层map的value值:第二层map对象(管理了所有同服务名称的服务提供者)
第二层map的key值:区分不同实例的名字
第二层map的value值:保存了该节点该服务提供者详细信息的instance对象(ip:port,时间戳)
图解如下:
8091和8092两个客户端拥有相同的服务名称(service-hi),那么他们在第一层map中存的key就是同一个,其他的信息将作为内部map的key-value继续存储
客户端注册到注册中心,是双层map,第一次生成一个key ,之后就是在map的value中在嵌套map添加key,value(保证了服务名称不重名,功能不一样,服务名称应该不一样)
2.2超时剔除:
服务端启动定时任务,每隔60秒钟运行一次定时任务,扫描所有注册信息instance对象时间戳,计算判断,如果发现有超过90秒心跳,将会作为超时的实例从注册信息中删除。
2.3保护机制:
正常的微服务集群,肯定会因为故障,网络延迟导致总是有超时的实例从注册信息提出.网络故障的面积非常大,影响了集群中大部分的节点发送心跳,如果严格执行超时提出,导致微服务集群注册信息丢失,整个集群的功能瘫痪.设置了一个超时剔除的阈值(15%,超过总体节点数量15%,同一时间剔除),开启保护机制,不提出任何服务信息.
配置服务端属性
eureka.server.enable-self-preservation=false