Java后端
·2025-06-07Day 4
✅ 今天做了:
面试鸭:
cookie,session,token的区别?
为什么要用消息队列?
Mysql的默认隔离级别是什么?
常见的几种设计模式?
Mysql的事务二阶段提交是什么?
Mysql是如何实现业务的?
手写RPC框架-第五节-实现注册中心简易版
包括功能:服务注册,服务发现。
创建服务中心配置类,包含服务中心地址,类别等信息。
创建服务信息类,包含服务名,版本号,地址和端口号等信息,提供获取服务key的方法(服务名+版本号)。
分布式储存器选择etcd,键值对存储,键定义为服务名+版本号,值存储服务信息类对象。
添加默认版本号字段,设值为1.0
为了提供多种注册中心实现方法,跟序列器一样,创建一个注册中心接口,定义方法:初始化,服务注册,服务发现,关闭服务,并进行如下操作:
1.在META-INF目录下创建以注册中心接口全引用为名的文件,内含注册中心类以及对应的实现接口地址。方便之后的读取以及 反射实例化。
2.定义注册中心工厂类,静态代码块,调用spiLoader,读取并记录META-INF目录下定义的注册中心信息。
3.提供getInstance方法,接受注册中心类型名key,通过spiLoader获取key对应的注册中心实现类。
实现各注册中心实现类,继承注册中心接口。
初始化:接受注册中心配置类,根据配置类信息定义注册中心地址,以及创建KVclient
服务注册:接受一个注册信息类,获取服务名等信息,根据默认标识+服务名+版本号为key,注册信息类为value。
定义一个租期LeaseClient,通过grand设置有效时长,获取其id。
最后通过PutOption存入key,value,id添加到etcd。
服务发现:在invoke调用方法中,先获取注册中心配置类,获取注册中心类型,然后通过注册中心工厂的getInstance,传入注册中心类型,获取实现类,创建注册信息类,填入服务名,版本信息,再通过注册信息类的getKey方法获取key,然后调用注册中心的getService,服务发现。在内部,通过前缀匹配来查询,通过输入的key,通过GetOption并设置isPrefix(true),设置一个查询条件,然后通过kvClient的get方法,输入前缀key,以及Getoption查询条件,获取查询到的数据列表,然后以流的形式,讲每一个值转化为注册信息类对象(因为服务注册时,value直接存入的就是信息注册类),然后返回list。在调用时,先用用list的第一个对象。获取到的信息注册类,包含地址,端口号,还要在进行一下地址和端口号的拼接,如果地址包含http,说明地址host本就是一个http接口,则直接拼接host和port,如果不包含,则说明是localhost,需要拼接一个http://然后再放入http请求中
2
0
分享
操作
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
