ICE 模型

https://zeroc.com/products/ice ICE 是很早之前写C++的时候用过,太长时间没有写过C++, 所以本文之作摘要,不做具体分析,如果以后还会用到或有需要的情况下在进行详细整理,而Java的开发者来说Java生态中有更多合适的RPC框架使用 IDL ICE采用自定义Slice(Specification Language for Ice)作为IDL,具体可参考https://doc.zeroc.com/ice/3.7/the-slice-language 代码生成器 ICE提供slice2*工具来生成目标语言代码,slice2java,slice2cpp等 Read more

Corba 模型

Corba(Common Object Request Broker Architecture)是对象管理组织(OMG)定义的一套标准,目的是促进部署在不同平台上的系统的通信,它不仅仅是RPC技术,结合NameService进行服务的注册与查找,已经提供了分布式系统需要的大部分功能,这是一套相对比较老的技术,现在只有一些遗留的系统还在使用Corba,虽然Corba定义是可以通过多个ORB实现互相访问,但不同的语言实现的ORB直接通信总是存在各种问题,所以Corba一般都被同一中语言使用,本文以Java为例,注意:Java 11中已经将Corba相关的包移除了,本文仅做技术参考(相信现在了解Corba的人也不多,使用的人更不多了:)), 参考Java 示例 IDL Java从Java5提供Corba支持,OMG IDL的语法和语义可以参考CORBA/IIOP 2.3.1 Specification., Java相关Corba参考https://docs.oracle.com/javase/7/docs/technotes/guides/idl/compliance.html, IDL 到Java对象的映射关系参考IDL to Java Mapping 代码生成器 JDK中提供了idlj工具来通过idl文件生成Java代码, idlj -td ../ -I . -fallTIE ./hello.idl, 通过idlj生产Java语言代码,-td 指定输出目录,-I 指定需要包含的.idl文件目录 序列化协议 Thrift没有纯粹的序列化对象到指定的格式,而是通过TProtocol的不同实现,在传输的时候进行相应的处理, 可以利用继承TProtocolDecorator来实现自己的数据处理: Transport协议 Thrift使用Socket作为Transport, 通过TProtocol进行数据传输 Corba 处理框架 基本类图 Thrift通过不同的TServer实现和TServerTransport实现来提供丰富的RPC功能,只要熟悉Socket编程,看Thrift的实现是非常容易。Server端Transport主要TServerSocket和TNonblockingServerSocket实现,处理通过一下几种TServer实现: Server 启动流程... Read more

Thrift 模型

IDL Thrift采用自定义的.thrift文件来定义Service和结构体/消息,参考.thrift文件中可以使用的Thrift Types,.thrift文档 Thrift IDL 代码生成器 Thrift 提供了二进制的代码生成工具,可以通过以下链接下载https://thrift.apache.org/download thrift -r -out ../ --gen java hello.thrift, 通过thrift生产目标语言代码 序列化协议 Thrift没有纯粹的序列化对象到指定的格式,而是通过TProtocol的不同实现,在传输的时候进行相应的处理, 可以利用继承TProtocolDecorator来实现自己的数据处理: Transport协议 Thrift使用Socket作为Transport, 通过TProtocol进行数据传输 Thrift 处理框架 基本类图 Thrift通过不同的TServer实现和TServerTransport实现来提供丰富的RPC功能,只要熟悉Socket编程,看Thrift的实现是非常容易。Server端Transport主要TServerSocket和TNonblockingServerSocket实现,处理通过一下几种TServer实现: Server 启动流程 Client 启动流程 实现分析 对于有网络编程经验的人来说Thrift实现非常容易看懂,看下TServer对应实现类的源码就一目了然了,暂不做描述,后面抽时间补上 Read more

gRPC 模型

IDL gRPC的采用protobuf 作为IDL来描述服务接口和消息结构,如果需要,也可以使用其他替代方案。以下示例引用在gRPC concept gRPC定义了4中可用的服务方法: 代码生成器 gRPC 提供protocol buffer compiler 插件产生Server端和Client端的代码: 序列化协议 gRPC采用Protobuf作为序列化协议,client和server端进行数据交互的时候都回将数据序列化成protobuf格式进行传输,具体参考protobuf Transport协议 基于HTTP2的二进制传输(通过HTTP2 frame传输protobuf序列化后的二进制数据) gRPC 处理框架 Java 实现 https://github.com/grpc/grpc-java gRPC的Java实现是基于Netty,对于Java开发者来说这个框架会非常熟悉,这里不做多介绍。示例代码可以参考https://grpc.io/docs/tutorials/basic/java/ 基本类图 注意下午只画了用户在使用时需要接触的主要类,并没有列出框架实现的核心类,Server段主要通过实现*ImpleBase来实现真是的业务逻辑,而Client通过*Grpc来创建合适的*Stub调用定义的服务接口  Server 启动流程 下图描述了Server在初始化的时候的基本流程,服务端的实现类通过addService方法添加到gRPC的逻辑中提供接口的实现逻辑  Client 启动流程 下图描述了Client在使用的时候后的基本流程,Client通过gRPC生成的*Stub(Proxy)类来调用请求Server调用  基于Netty的实现分析 Golang 实现 更多实现 用到的时候在分析了... Read more

RPC 框架

RPC 框架 RPC 模型 IDL IDL 是接口描述语言,没有什么好解释的就是描述定义数据、接口的工具,在RPC模型中IDL可以看作为服务或接口的Meta信息,用来定义服务、接口和数据。 代码生成器 代码生成器是一个通过IDL生成目标语言代码的compiler,通常代码生成器是和IDL绑定的,提供IDL的时候会提供相应的代码生成器,根据IDL描述用户可以使用代码生成器生成目标语言的代码(列如,gRPC的protoc,Corba的idl, Thrift的thrift,ZeroC ICE的的) 序列化协议 在编程领域序列化是将程序语言描述的数据或对象转换成便于存储和传输的数据格式,序列化同时伴有反序列化否则没什么意义, 序列化协议无非两种,一种是二进制序列化,另一种是基于字符串的序列化 Transport协议 Transport协议是指如何进行数据传输,也就是通过何种方式传输什么样的数据,是RPC框架将序列化后的数据进行传输的方式,通常我们描述Transport协议为(基于传输方式的数据类型的传输),例如基于Socket的Json传输,或基于Socket的二进制传输,或基于http的xml传输 RPC 处理框架 通常一个跨语言的RPC框架会包含以上4部分内容,RPC框架为开发者提供了整套的工具和使用方法,针对不同语言的实现每个RPC框架都有所不同,此部分会在具体的RPC框架模型中描述。RPC采用C/S结构: gRPC 模型 [Thrift 模型](https://www.notion.so/Thrift-c72c605f9e554767ab77538fb4c6a193?pvs=21) [ZeroC ICE](https://www.notion.so/ZeroC-ICE-aa063b297d494fb48ce9cea12a45117a?pvs=21) [^_^]: ### Corba 模型(Leacy) Read more