RPC

核心: 远程方法调用

有两个微服务项目a,b,a中需要远程调用b的方法,通过rpc框架,a中只需要使用一个接口调用其方法,来实现调用到b中接口实现类的具体方法内代码

和本地方法调用相反,远程方法调用的方法体是在其他项目里,调用的项目中只存在一个接口

实现

服务提供方

  1. 接收网络请求:rpc框架内部启动tomcat来接收网络请求
  2. 处理网络请求:rpc框架中自定义一个servlet,通过service()来内部处理网络请求
  3. 网络请求内容:调用方的网络请求包含三部分内容:接口名,方法名,方法参数
  4. 执行服务调用:需要根据接口名找到其实现类执行方法体,通过本地注册表map来存储接口及其实现类,那么b中启动时就分为两步
    1. 将接口及其实现类添加到本地注册表
    2. 启动tomcat容器

服务调用方只需要按照参数规定构建http请求发送接收即可

服务调用方

本质是构建一次http请求,如何将其优化为只需要调用接口方法呢

-->只需要让接口有实现类,然后实现类的方法内部构建http请求

-->动态代理生成实现类,在invoke增强方法内获取参数构建http请求

注册中心

用于实现服务注册与发现,确保服务消费者和提供者之间的动态寻址和通信

核心为 共享数据,心跳机制,监听机制

想要不把服务提供方的ip地址写死,引入注册中心,将接口作为key,url组成list作为值进行存储

负载均衡实现?

比如将url组成的list取出,然后利用指定随机算法取出目标url

为什么要采用redis,nacos等单独项目

因为要保证注册中心的map是多线程共享的

注册中心还需要提供哪些实现?

心跳机制:如果一台主机挂掉,则需要到list中删除对应url

本地缓存,变更监控机制

采用注册中心,那调用方每发一次请求都需要到注册中心查数据,然后再发送请求,等于多了一次网络io

那么可以采用本地缓存存储map数据

为了保证数据一致性就需要给注册中心实现变更监控机制,保证map变更要同步本地缓存中的数据

注重点

  • 拓展性
    • 网络请求对象序列化接口应对多次序列化方式
    • 提供参数配置来启动不同类型的网络容器

拓展

报错重试机制

fengdongnan的博客 文章被收录于专栏

记录fengdongnan的知识产出文档,欢迎大家来一起交流学习

全部评论

相关推荐

评论
点赞
4
分享

创作者周榜

更多
牛客网
牛客企业服务