Eureka 是Spring Cloud Netflix 微服务套件中的一部分,它基于Netflix Eureka做了二次开发,主要负责完成微服务架构中的服务治理功能。
1:服务注册中心
2:服务提供者
3:服务消费者
1:服务注册:
在服务治理框架中,通常都会构建一个服务注册中心,每个服务提供者需要向注册中心,登记自己的注册信息。比如IP,端口号,版本号,服务名,通信协议等等附加信息告知注册中心,注册中心会根据服务名,进行分类服务清单。例如下图:
eureka维护分类服务清单,是通过一个双层Map, 第一层Map的key就是服务名,例如上图的HELLO-SERVICE,第二层的Key就是具体的实例信息,例如上图的DLBOOH........:hello-service:8081
2:服务发现
由于在服务治理框架下运作程序,服务间的调用不在是通过指定具体的实例地址来实现,服务间的调用通过服务名来调用,例如:http://hello-service:8081/hello。所以当服务调用方 想要调用服务提供方的接口时,服务调用方是不知道服务提供方的具体实例地址的, 因此调用方需要向注册中心Eureka咨询服务,并获取所有服务的实例清单。例如:现有服务B想要调用服务A,服务B就需要向注册中心发起请求获取服务A的实例清单,注册中心返回服务A的实例清单,然后服务B会从清单中以某种策略轮询访问清单中的的实例,实现负载均衡的效果 访问方式可以通过 Ribbon。
实际生产项目中,不会在每一次请求中都获取服务列表清单,这样做效率低下。实际场景中缓存和服务剔除等机制也会有一些不同的实现方式
3:服务同步
当Eureka实现高可用后,服务提供者可分别注册到集群中的不同服务注册中心上,也就是说 它们的信息分别被不同的注册中心维护,此时由于服务中心互相注册为服务(高可用),当服务提供者发送注册请求到一个服务注册中心时,它会将该请求转发同步给集群中的其他注册中心,从而实现服务注册中心的服务同步。通过服务同步,两个服务提供者的服务信息就可以通过这两台服务注册中心中的任意一台获取到
4:服务续约
在注册完服务之后,服务提供者会维护一个心跳用来持续告诉Eureka“我还活着”,以防止Eureka的剔除服务将该服务从列表清单中排除出去,我们称该操作为服务续约
关于服务续约有两个重要的属性,
##用于定义服务续约任务的调用间隔时间,默认为30秒
eureka.instance.lease-renewal-interval-in-seconds=30
##参数用于定义服务失效的时间,默认为90秒
eureka.instance.lease-expiration-duration-in-seconds=90
5:获取服务
当服务消费者程序启动时,它会发送一个Rest请求给注册中心,来获取上面注册的服务清单,为了性能考虑,Eureka会维护一份只读的服务清单来返回给客户端,同时该缓存清单会每隔30秒更新一次。
获取服务是服务消费者的基础,所以必须确保eureka.client.fetch-registry=true 默认为true,若希望修改缓存清单的更新时间,可以通过eureka.client.registry-fetch-interval-seconds=30 进行修改,默认30秒,参数单位秒
6:服务调用
获取服务清单后,通过服务名可以获取实例的名和实例的元数据(ip,port等等)利用Ribbon实现轮询方式调用服务提供方。
7: 服务下线
当服务下线后,正常情况下 我们是不希望,服务消费方继续调用已经下线的服务的,所以再服务提供方正常关闭时,会触发一个服务下线的REST请求,告诉Eureka “我要下线了”。Eureka收到请求后,会将此服务设置为(DOWN),并将此消息广播到出去,更新缓存清单。
8:服务中心的失效剔除
当服务非正常关闭时,比如机器Down了,断电,内存溢出,网络故障等等。这时候是不会触发服务下线的REST的请求,为了将这些已经无法提供的服务剔除,Eureka Server会在启动时,创建一个定时任务,默认每隔60秒将清单中超时没有续约的剔除。