RPC
核心: 远程方法调用
有两个微服务项目a,b,a中需要远程调用b的方法,通过rpc框架,a中只需要使用一个接口调用其方法,来实现调用到b中接口实现类的具体方法内代码
和本地方法调用相反,远程方法调用的方法体是在其他项目里,调用的项目中只存在一个接口
实现
服务提供方
- 接收网络请求:rpc框架内部启动tomcat来接收网络请求
- 处理网络请求:rpc框架中自定义一个servlet,通过service()来内部处理网络请求
- 网络请求内容:调用方的网络请求包含三部分内容:接口名,方法名,方法参数
- 执行服务调用:需要根据接口名找到其实现类执行方法体,通过本地注册表map来存储接口及其实现类,那么b中启动时就分为两步
- 将接口及其实现类添加到本地注册表
- 启动tomcat容器
服务调用方只需要按照参数规定构建http请求发送接收即可
服务调用方
本质是构建一次http请求,如何将其优化为只需要调用接口方法呢
-->只需要让接口有实现类,然后实现类的方法内部构建http请求
-->动态代理生成实现类,在invoke增强方法内获取参数构建http请求
注册中心
用于实现服务注册与发现,确保服务消费者和提供者之间的动态寻址和通信
核心为 共享数据,心跳机制,监听机制
想要不把服务提供方的ip地址写死,引入注册中心,将接口作为key,url组成list作为值进行存储
负载均衡实现?
比如将url组成的list取出,然后利用指定随机算法取出目标url
为什么要采用redis,nacos等单独项目
因为要保证注册中心的map是多线程共享的
注册中心还需要提供哪些实现?
心跳机制:如果一台主机挂掉,则需要到list中删除对应url
本地缓存,变更监控机制
采用注册中心,那调用方每发一次请求都需要到注册中心查数据,然后再发送请求,等于多了一次网络io
那么可以采用本地缓存存储map数据
为了保证数据一致性就需要给注册中心实现变更监控机制,保证map变更要同步本地缓存中的数据
注重点
- 拓展性
- 网络请求对象序列化接口应对多次序列化方式
- 提供参数配置来启动不同类型的网络容器
拓展
报错重试机制
fengdongnan的博客 文章被收录于专栏
记录fengdongnan的知识产出文档,欢迎大家来一起交流学习