1.1 本地函数的调用 1.将a和b的值压线 2.通过函数指针找到calculate函数,进入函数取出栈中的值2和3,将其赋予x和y 3.计算x*y,并将结果存在z 4.将z的值压线,然后从calculate返回 6.从栈中取出z返回值,并赋值给result 1.2远程函数调用 PRC需要解决的问题 1.函数映射 2.数据转换成字节流 3.网络传输 1.3PRC概念模型 1984年Nelson发表了论文《implementing Remote Procedure》,其中提出了RPC的过程由五个模型组成:User、User- Stub、PRC- Runtime、Server- Stub、Server 1.4 一次PRC的完整过程 IDL文件 IDL.通过一种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信 生成代码 通过编译器工具把IDL文件转换成语言对应的静态库 编解码 从内存中表示到字节序列的转换称为编码,反之为解码,也常叫做序列化和反序列化 通信协议 规范了数据在网络中传输内容和格式。除必须的请求/响应数据外,通常还会包含额外的元数据 网络传输 通常基于成熟的网络库走 TCP/UDP传输 1.5 PRC的好处 1 单一职责,有利于分工协作和运维开发 2 可扩展性强,资源使用率更优 3 故障隔离,服务的整体可靠性更高 1.6 PRC带来的问题 (1 服务宕机,对方应该如何处理 2 在调用过程中发生网络异常,如何保证消息的可达性? 3 请求量突增导致服务无法及时处理,有哪些应对措施)—PRC框架 01.小结 1.本地函数调用和PRC调用的区别:函数映射、数据转成字节流、网络传输 2.PRC的概念模型:User、User- Stub、PRC- Runtime、Server- Stub、Server 3.一次PRC的完整过程,并讲解了PRC的基本概念定义 4.PRC带来好处的同时也带来了不少新的问题,将由PRC框架来解决 2.1分层设计-以Apache Thrift为例-2.2编解码层-2.3编解码层-生成代码-2.4编解码层-数据格式 语言特定的格式:许多编程语言都内建了将内存对象编码为字节序列的支持,假如Java有Java.io.Serializable 文本格式:JSON、XML、CSV等文本格式,具有人类可读性 二进制编码:具备跨语言的高性能等优点,常见有Thrift的BinaryProtobuf等 2.5编解码层-二进制编码 TLV编码:Tag:标签,可以理解为类型 Length:长度 Value:值,Value也可以是个TLV结构 2.6编解码层 -选型 兼容性 支持自动增加新的字段,而不影响老的服务,这将提高系统的灵活度 通用性:支持跨平台、跨语言 性能:从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长 2.7协议层-2.8协议层-概念-2.9协议层 协议构造-2.10 协议层-协议解析-2.11网络通信层-2.12网络通信层-Sockwts API-2.13 网络通信层-网络库 提供易用API-功能-性能——等…