IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 自研RPC框架-原理篇 -> 正文阅读

[Python知识库]自研RPC框架-原理篇

1. 背景

  • 笔者工作也有些时间了,在某互联网一二线厂都工作过,当时在某二线厂工作时,部门自研了RPC框架,用来支撑部门C端产品业务开发,当时一直想自己也要写一个RPC框架,但由于一直没有时间,这个想法隔着了很久。最近稍微有点时间,决定自己写一个RPC框架。

  • 其实有很多优秀的RPC框架,常见的如下:

    • Dubbo:国内最早开源的 RPC 框架,由阿里巴巴公司开发并于 2011 年末对外开源,仅支持 Java 语言。
    • Motan:微博内部使用的 RPC 框架,于 2016 年对外开源,仅支持 Java 语言。
    • Tars:腾讯内部使用的 RPC 框架,于 2017 年对外开源,仅支持 C++ 语言。
    • Spring Cloud:国外 Pivotal 公司 2014 年对外开源的 RPC 框架,仅支持 Java 语言
    • gRPC:Google 于 2015 年对外开源的跨语言 RPC 框架,支持多种语言。
    • Thrift:最初是由 Facebook 开发的内部系统跨语言的 RPC 框架,2007 年贡献给了 Apache 基金,成为 Apache 开源项目之一,支持多种语言。
    • hprose:一个MIT开源许可的新型轻量级跨语言跨平台的面向对象的高性能远程动态通讯中间件。它支持众多语言:nodeJs, C++, .NET, Java, Delphi, Objective-C, ActionScript, JavaScript, ASP, PHP, Python, Ruby, Perl, Golang 。
  • 写一个RPC框架分两步:第一步要搞清楚RPC框架的原理和工作机制,第二步就是编写rpc框架了。

2. RPC原理详解

2.1 RPC调用流程

  • RPC框架调用流程中主要有五个对象,客户端(Client)、客户端代理(Client Stub)、网络服务(Network Service)、服务端代理(Service Stub)、服务端(Service)。
  • 客户端(Client)作为服务消费方以本地调用方式调用服务。
  • 客户端代理(Client Stub)接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体。然后找到服务地址,并将消息发送服务器。
  • 服务端代理(Service Stub)将接收到消息后进行解码,Service Stub根据解码结果调用本地服务。
  • 反向链路可参考下图流程:

在这里插入图片描述

2.2 透明化远程服务调用

  • 如何封装通信细节才能让用户像以本地调用方式远程调用服务呢?对java对象来说就是使用代理。
  • 代理的方式包括jdk动态代理和字节码生成,大部分公司实现RPC框架时还是选择动态代理。
  • RPCProxyClient代理类中invoke方法中封装与远程服务通信的细节。

在这里插入图片描述

public class RPCProxyClient implements java.lang.reflect.InvocationHandler{    
	private Object obj;     、
	public RPCProxyClient(Object obj){
	        this.obj=obj;    
	}     
	// 得到被代理对象; 
	public static Object getProxy(Object obj){        
		return java.lang.reflect.Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new RPCProxyClient(obj));    
	}     
	
	// 调用此方法执行
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//结果参数;                
		Object result = new Object();        
		// 执行通信相关逻辑        
		// ...        
		return result;    
	}
}

2.3 消息的编码和解码

  • 请求消息结构:
    • 接口名称:如果不传,服务端就不知道调用哪个接口了;
    • 方法名:一个接口内可能有很多方法,如果不传方法服务端也就不知道调用哪个方法;
    • 参数类型&参数值:参数类型有很多,比如bool、int、long、double、string、map、list,甚至如Struct(class);以及相应的参数值;
    • 超时时间
    • requestID, 标识唯一请求ID
  • 消息的编解码涉及到序列化框架的选择,目前互联网公司广泛使用Protobuf、Thrift、Avro等成熟的序列化解决方案来搭建RPC框架,这些都是久经考验的解决方案。
  • 消息通信方式可以采用java NIO,netty等。我们的自研RPC框架也采用netty框架。
  • 消息编码和解码细节可以参考下图

在这里插入图片描述

2.4 发布自己的服务

  • 如何让别人使用我们的服务,两种办法:

    • 1.自动告知,通过zookpeer充当一个服务注册表,让多个服务形成一个集群,让服务消费者通过服务注册表获取具体的服务访问地址(ip+端口)去访问具体的服务提供者。
    • 人肉告知,显然这种方式不是很合理。
  • zookpeer的原理参加下图介绍

在这里插入图片描述

2.5 Protobuf序列化框架

  • 前面RPC框架中提到了选择合适的序列化框架,笔者曾经公司的C端产品使用Protobuf序列化框架,性能很强悍,支撑了公司百万QPS的业务。自研的RPC框架也可使用该序列化框架。
  • 这里我们不做过多介绍,细节及使用可以参考下图

在这里插入图片描述

3.总结

  • 以上我们搞清楚了RPC框架的原理和细节,以及涉及到序列化Protobuf、通信netty等其他框架。
  • 后面我们将根据我们介绍的原理和知识点自研一个RPC框架,后面会有系列文章详细介绍。

扫码关注公众号

  • 后台回复“Hadoop”、“Hbase”、“Spark”等免费获取更多Hadoop、Hbase、Spark等学习教材及实战资料在这里插入图片描述
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-09-10 23:57:30  更:2021-09-10 23:57:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 13:52:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计