参考文章
Eureka应用注册与集群数据同步源码解析https://mp.weixin.qq.com/s/HXYWFdzCal2NpJCp0WmdZw
(转)springCloud Eureka的缓存机制
https://blog.csdn.net/aaa821/article/details/83023681
Eureka源码
https://blog.csdn.net/u010883443/article/details/108470758
笔记
服务注册,服务发现,服务健康检查,注册中心集群数据同步
为什么要用map这种数据结构存储注册表数据?
答:速度快、效率高,因为是从内存中进行数据的存取,要比操作数据库要快得多。
为什么要使用ConcurrentHashMap这种数据结构?
答:为了支持并发。
eureka数据存储,一小时搞定Eureka
https://my.oschina.net/u/4006148/blog/3169283
数据存储层
private final ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>> registry= new ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>>();
第一层的ConcurrentHashMap的key=spring.application.name也就是客户端实例注册的应用名;value为嵌套的ConcurrentHashMap。
第二层嵌套的ConcurrentHashMap的key=instanceId也就是服务的唯一实例id,value为Lease对象,Lease对象存储着这个实例的所有注册信息,包括IP、端口、属性等。
注册中心
consul机制:服务启动时注册consul,之后consul不断发心跳检查服务是否正常
eureka机制:服务主动向eureka发心跳,eureka收到心跳后,就给这个服务续约,认为服务是正常的。(一段时间没有收到心跳就会认为服务挂了,将服务给剔除)
服务注册和peer同步
发送心态检测(检测服务是否存活)
使用 Jersey 框架实现自身的 RESTful HTTP接口;
使用 HTTP 协议实现服务注册和peer同步;
使用 JDK 自带 Timer 实现定时任务(发送心跳、定时清理过期服务、节点同步等) ;
使用guava (Google)包实现内存缓存。
scheduleAtFixedRate 优先保证任务执行的频率,是以上一个任务开始的时间计时,120秒过去后,检测上一个任务是否执行完毕,如果上一个任务执行完毕,则当前任务立即执行,如果上一个任务没有执行完毕,则需要等上一个任务执行完毕后立即执行。
scheduleWithFixedDelay 优先保证任务执行的间隔,是以上一个任务结束时开始计时,120秒过去后,立即执行
定时刷盘
public class Schedu {
public static void main(String[] args) {
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(4);
//不管你任务需要执行多长时间,反正每隔1秒我就从线程池里取个线程执行任务
scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@SneakyThrows
@Override
public void run() {
long startTime = System.currentTimeMillis(); // 开始时间(毫秒)
//耗时代码
TimeUnit.SECONDS.sleep(2);
long endTime = System.currentTimeMillis(); // 结束时间(毫秒)
long l = (endTime - startTime) / 1000;
System.out.println("代码耗时:"+l+"秒");
int curSecond = LocalTime.now().getSecond();
System.out.println("第"+curSecond+"秒进行了打印");
}
},1, 1, TimeUnit.SECONDS); //首次延迟1秒启动,后面每隔1秒循环执行
//
//========循环延迟的1秒+程序睡眠执行的2秒=每隔3秒执行一次
// 第33秒进行了打印
// 第36秒进行了打印
// 第39秒进行了打印
}
}
线程池启动完成后,首次等待多久开始执行任务
使用 HTTP 协议实现服务注册和peer同步;
使用 JDK 自带 Timer 实现定时任务(发送心跳、定时清理过期服务、节点同步等) ;