注册中心
图解底层原理
设置多级缓存的原因
优化并发冲突,服务发现和服务注册会有读写的并发冲突,如果使用加锁的方式,则会影响性能。使用多级缓存,就能解决同时读写内存数据结构造成的并发冲突问题,同时能进一步提升服务请求的响应速度。
两个定时线程的作用
在服务注册到服务中心的时候,注册表就会有对应的数据产生,并会立马同步给 ReadWrite缓存
。
服务消费者在进行服务发现的时候,拉取的是 ReadOnly缓存
里的注册服务的列表信息,每隔30秒(可自定义配置)会从 ReadOnly缓存
拉取一次数据。
会有一个定时线程,会定时检查和定时同步 ReadOnly缓存
和 ReadWrite缓存
的数据。只有 ReadOnly缓存
同步了最新的服务注册信息,服务消费者拿到了最新的 ReadOnly缓存
,服务消费者才会发现新注册的服务提供者。
发送心跳,服务注册中心会维护所有服务的心跳,同样也会有一个后台线程去定时检查,哪个服务提供者在过去的一段时间里没有发送心跳,服务注册中心就会认为那个服务提供者发生了故障。一旦发现说有服务里面有服务出现了故障,则会重新同步 ReadWrite缓存
里面的服务列表数据,首先会清空缓存里面的所有的服务数据,然后重新从服务注册表里面拉取最新的,没有故障的服务列表。
名词解读
服务注册表
存放所有服务提供者注册的服务信息(ip+port)ReadWrite缓存
二级缓存,本质是hashMap,包含失效机制,保存数据信息对外输出。ReadOnly缓存
一级缓存,本质是hashMap,数据无过期时间,保存数据信息对外输出。定时线程
主要负责定时同步一级缓存与二级缓存的数据信息。可以设置对应的定时时间。定时线程
定时检查服务注册表当中的服务是否发送了心跳。如果在规定时间内服务没有心跳,则会认为服务出现故障了。
Feign + Ribbon 服务调用和负载均衡
对接口打了一个注解,Fegin针对这个注解标注的接口生成动态代理,然后针对fegin的动态代理去调用方法的时候,会在底层生成http协议格式的请求。
底层会使用HTTP通信的框架组件,比如HttpClient,先得使用Ribbon去从本地的Eureka注册表的缓存里获取对方的及其的列表,然后进行负载均衡,选择一台及其出来,接着针对那台机器发送http请求过去即可。