Spring-cloud 基础学习
Spring-cloud-eureka 基础架构:
核心要素:
服务注册中心: Eureka提供的服务端,提供服务注册和发现的功能
服务提供者: 提供服务的应用,它将自己的服务注册到eureka,以供其他应用发现
(
服务注册:
服务提供者在启动的时候 会通过Rest请求的方式将自己注册到Eureka Server上,同时带上了自身服务的一
些元数据信息.Eureka Server接收到这个Rest请求之后,将元数据信息存储在一个双层结构MAP中,其中第一层
的key是服务名,第二层的key是具体服务的实例名.
通过 client.register-with-eureka 参数来判断是否需要注册到注册中心 这个参数默认为true
在源码中,服务注册的逻辑在if(clientConfig.shouldRegisterWithEureka())中,在该分支中,创建了一个InstanceInfoReplicator
的实例,它会执行一个定时任务,真正触发调用注册的逻辑在discoveryClient.register();服务的注册是通过Rest的方式去进行的,
在发起注册请求的时候,会传递一个instanceInfo的对象,这个就是客户端给服务端注册服务的元数据.
在服务注册的时候,会调用publishEvent函数,将该新服务注册的事件传播出去,然后调用父类的注册实现,将instantInfo的元数据
存储在一个ConcurrentHashMap对象中.注册中心储存了两层map结构,第一层的key存储服务名:instantInfo中的appName属性,第二层
的key存储实例名:instanceInfo中的instanceId属性
服务同步:
当两个服务提供者分别注册到了不同的服务注册中心上,也就是说,它们的信息分别被两个服务注册中心所维护.
由于服务注册中心之间因互相注册为服务,当服务提供者发送注册请求到一个服务注册中心时,它会将请该求
转发给集群中相连的其他注册中心,从而实现注册中心之间的服务同步。通过服务同步,两个服务提供者的信息
就可以通过这两台服务注册中心的任意一台获取到。
服务续约:
在注册完服务之后,服务提供者会维护一个心跳用来持续告诉Eureka Server,以防止Eureka Server的剔除任务
将该服务实例从服务列表中排除出去,我们称该操作为服务续约
服务注册到Eureka Server之后,需要一个心跳去续约,防止被剔除。对于服务续约相关的时间控制参数为
eureka.instance.lease-renewal-interval-in-seconds = 30
eureka.instance.lease-expiration-duration-in-seconds = 30
)
服务消费者: 消费者应用从服务注册中心获取服务列表,从而使消费者可以知道去何处处理调用其所需要的服务
(实现方式: Ribbon Feign)
获取服务:
当我们启动服务消费者的时候,它会发送一个Rest请求给服务注册中心,来获取上面注册的服务清单。为了性能考虑,
Eureka Server会维护一份只读的清单来返还给客户端,同时该缓存清单会30秒更新一次
服务调用:
服务消费者在获取服务清单后,通过服务名可以获取具体提供服务的实例名和该实例的元数据信息。
因为有这些服务实例的详细信息,所以客户端可以根据自己的需要决定具体调用哪个实例,在Ribbon中会采用轮询的方式
进行调用,从而实现客户端的负载均衡。
Eureka注册类配置项: 客户端的配置都是以eureka.client为前缀
指定注册中心(当构建高可用的服务注册中心集群时,我们可以为参数的value配置为多个地址,用逗号隔开):
eureka.client.serviceUrl.defaultZone = http://localhost:9011/eureka/
启用eureka客户端 默认为true
eureka.client.enabled = true
是否从eureka服务端获取注册信息
eureka.client.fetch-register = true
Eureka实例类配置项: 实例类的配置都以eureka.instance为前缀
元数据:
eureka客户端在向服务注册中心发送注册请求的时候,会把例如:服务名称,实例Ip,实例端口等用于服务
治理的重要信息;以及一些用于负载均衡策略或是其他特殊用途的自定义元数据信息
在使用eureka的时候,所有的配置信息都由EurekaInstanceConfigBean进行加载,但在正在进行服务注册的时候,
还是会包装成instanceInfo对象发送给服务端

浙公网安备 33010602011771号