spring cloud之eureka

来源:互联网 发布:淘宝一心升二心 编辑:程序博客网 时间:2024/06/05 03:32

Spring Cloud为开发人员提供了快速构建分布式系统中的一些通用模式(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,领导选举,分布式 会话,群集状态)。 分布式系统的协调导致了锅炉板模式,并且使用Spring Cloud开发人员可以快速地站起来实现这些模式的服务和应用程序。 它们可以在任何分布式环境中正常工作,包括开发人员自己的笔记本电脑,裸机数据中心和受管平台,如Cloud Foundry。

中文文档:https://springcloud.cc/

官方文档:http://projects.spring.io/spring-cloud/#quick-start


首先介绍一下spring cloud的全局服务:

eureka:注册中心(服务发现),给服务调用者提供真实的服务供应者链接,在多台eureka实例的环境下,eureka集群会自动相互同步服务供应者的数据,在同步的时候会带一个isReplica的参数,该参数的作用为防止循环同步,其原理为当服务供应者启动服务的时候默认会去读application.properties(yml)、bootstrap.properties(yml)中的eureka相关的配置,如果只配置一个eureka服务地址,那么只会去这一个eureka地址中注册并暴露自己的坐标,注册时会传4个参数:IP、Port、ServerId、InstanceId,当eureka服务受理以后会对其他的eureka服务注册该服务提供者。在这里小提一下,在eureka服务集群启动的时候会相互注册,每一个eureka服务都是相对独立的也就是无状态的,是对等的关系(p2p),在每一个eureka服务中都会以concurrentMap的方式存储其他的节点用于数据同步。

Configuration center:配置中心,所有服务的配置文件可以由配置中心提供

zuul:spring cloud配套的网关,类似nginx,可以静态路由到某一个页面,如www.baidu.com。也可以动态路由到某一个server

ribbon:客户端负载均衡器

Hystrix熔断器,主要作为熔断,降级相关操作 


全局关系图如下:




今天这一章节主要回顾和整理eureka的相关知识。


Q:springcloud中客户端和服务端是怎么样通过注解生效的?

A:在eureka服务的pom文件里去定义spring-cloud-netflix-eureka-server的引用,在项目启动的时候如果在类上定义了@EnableEurekaServer会自动的去扫描该jar包下是否存在spring.factories,该配置主要的功能为定义初始化配置的类,在server端为EurekaServerAutoConfiguration.class,在客户端pom里定义spring-cloud-netflix-eureka-client,同样在该jar包下会有一个对应的spring.factories的文件,在初始化的时候会去执行EurekaClientAutoConfiguration.class和EurekaDiscoveryClientConfiguration.class从而完成eureka服务端和客户端的初始化工作。


Q:服务提供者怎么注册到服务中心的?

A:在程序加载时会启动一个线程,该线程会将将服务的信息注册到 eurekaserver 服务的信息(IP,端口,service_id,instance_id) 实例化的过程中,定时任务DiscoveryClient.class中的HeartbeatThread做心跳检测,renew方法做刷新实例信息:发送心跳。如果返回404,代表没注册,则进入注册流程调用renew方法里的register方法进行注册。


Q:服务中心怎么接收注册请求?

A:在eureka服务中通过rest接口接收注册请求,其中请求部分是通过jersey这个框架实现的rest接口(其中jersey的path参数就相当于springmvc中的requestmapping,spring cloud 集成eureka server原生包中的Jersey RESTful接口 ),接受注册请求以后通过InstanceRegistry.class中的register方法进行注册操作,在该方法中需要注意到的是文章开始所提到的isReplication参数的作用(解决eureka之间同步时循环复制)。


Q:服务中心怎么存储注册信息?

A存储在AbstractInstanceRegistry的registry中,该变量是一个ConcurrentHashMap类型的。


Q:服务中心自身是怎么实现高可用的?

A:p2p的方式(peer2peer)  对等(无中心化)eureka server实例


Q:服务集群之间怎么同步信息?如何去重?

A:eurekaserver初始化时,维护了一个PeerEurekaNodes.peerEurekaNodes列表该列表保存的是集群节点信息,

有更新的时候通过PeerAwareInstanceRegistryImpl中的replicateToPeers方法遍历所有节点,并传播信息防止循环复制

isReplication参数


原创粉丝点击