服务发现:Eureka客户端
服务发现是微服务架构中的一项核心服务。如果没有该服务,我们就只能为每一个服务调用者手工配置可用服务的地址,这不仅繁琐而且非常容易出错。Eureka包括了服务端和客户端两部分。服务端可以做到高可用集群部署,每一个节点可以自动同步,有相同的服务注册信息。
向Eureka注册服务
当客户端向Eureka注册自己时会提供一些元信息,如主机名、端口号、获取健康信息的url和主页等。Eureka通过心跳连接判断服务是否在线,如果心跳检测失败超过指定时间,对应的服务通常就会被移出可用服务列表。
译者注:向Eureka Server注册过的服务会每30秒向Server发送一次心跳连接, Server会根据心跳数据更新该服务的健康状态并复制到其他Server中。如果超过90秒没有收到该服务的心跳数据,则Server会将该服务移出列表。
注册项目实际就是一个普通的Spring Boot应用,使用@EnableDiscoveryClient注解后,会自动向Eureka注册中心,变成Rureka服务端实例,
服务注册中心实际也是一个普通SpringBoot应用,使用了@EnableEurekaServer注解后,启动应用,Eureka有一个带UI的主页,注册信息都在/访问
Basic Architecture
上图简要描述了Eureka的基本架构,由3个角色组成:
Eureka Server
提供服务注册和发现
Service Provider
服务提供方
将自身服务注册到Eureka,从而使服务消费方能够找到
Service Consumer
服务消费方
从Eureka获取注册服务列表,从而能够消费服务
需要注意的是,上图中的3个角色都是逻辑角色。在实际运行中,这几个角色甚至可以是同一个实例,比如在我们项目中,Eureka Server和Service Provider就是同一个JVM进程。
More in depth
上图更进一步的展示了3个角色之间的交互。
Service Provider会向Eureka Server做Register(服务注册)、Renew(服务续约)、Cancel(服务下线)等操作。
Eureka Server之间会做注册服务的同步,从而保证状态一致
Service Consumer会向Eureka Server获取注册服务列表,并消费服务
实现细节:
ApplicationResource类接收Http服务请求,调用PeerAwareInstanceRegistryImpl的register方法
private final PeerAwareInstanceRegistry registry;//实现注册 InstancInfo包含 instancdId、appName、ipAddr、port、securePosrt....
@POST
@Consumes({"application/json", "application/xml"})
public Response addInstance(InstanceInfo info, @HeaderParam("x-netflix-discovery-replication") String isReplication) {
logger.debug("Registering instance {} (replication={})", info.getId(), isReplication);
....处理失败返回
this.registry.register(info, "true".equals(isReplication));
return Response.status(204).build();
}
PeerAwareInstanceRegistryImpl完成服务注册后,调用replicateToPeers向其它Eureka Server节点(Peer)做状态同步
Chapter9-1-1 实现简单注册功能
未完待续。。。
参考资料:http://docs.springcloud.cn/user-guide/eureka/
参考资料:http://nobodyiam.com/2016/06/25/dive-into-eureka/(细节实现)
网友评论