手写注册中心

参考文章

RPC注册中心五–注册中心之持久化的操作

深入理解Eureka核心原理-图解

consul重启导致服务必须跟着重启解决方案

一小时搞定Eureka

阅读源码的技巧

Eureka重要对象简介

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 实现定时任务(发送心跳、定时清理过期服务、节点同步等) ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值