Modnar's Zone

tPRC-Go 学习笔记

字数统计: 978阅读时长: 3 min
2024/05/13

模块

plugin 插件模块

tRPC-Go 的 plugin 模块允许第三方提供自己的插件,用一种框架定义的统一回调设置接口来初始化插件。同时,plugin 使得 tRPC-Go 本身提供的一些功能,比如 log,也能通过 plugin 注册的方式来提供日志功能。

plugin 在代码逻辑上,按照 plugin 开发者定义的(而不是配置的)依赖(包括强依赖和弱依赖,强依赖要求当前插件初始化时,依赖的包必须存在;弱依赖要求当前插件初始化时,依赖的包不一定要存在)来决定插件的初始化顺序。在初始化设置时,允许定义 setupHook 函数来包装(默认未定义时会执行一个初始化时长限制的 hook 逻辑)。

log 日志模块

tRPC-Go 的 log 模块允许用户使用其日志功能。此外,tRPC-Go 还允许用户自定义自己的日志插件,比如远程日志读写等。对于 tRPC-Go 本身支持的 zaplogger 而言,其核心使用的是第三方的日志包 zapcore,而此包又有一个比较显著的特殊的地方,就是它本身并不支持 TRACE 级别的日志输出。为了更加普适,tRPC-Go 在对外包装类上提供了 TRACE 级别的日志(其本身开启方式也较为特殊复杂),但由于对 zapcore 的依赖,在日志输出时,日志文件中相关的 TRACE 级别日志也会以 DEBUG 级别(这是 zapcore 的最低级别)日志进行输出。

此外,tRPC-Go 对于日志文件的缓存,支持两种“拆分存储”方式,第一种是按照文件大小来进行组织拆分,第二种是按照日志时间来进行组织拆分。两种模式下分别可以指定文件大小、日志时间间隔来进行拆分,功能较为常见,这里不再赘述。值得注意的是,对于 Go 而言,时间的格式化字符串必须是按照 2006-01-02 15:04:05 这样的模式(参考 time.DateTime)来格式化时间输出的,而配置中也保持了这样的配置方式,对于那些对 Go 的开发规则了解不多的人,这里可能是一个比较困惑的地方。而这里也是笔者认为 tRPC-Go 提供的用户体验不够好的地方。

codec 编码模块

codec 模块提供了包括压缩(解压缩)、序列化(反序列化)在内的涉及编码的接口,对于常见的压缩、序列化标准都进行了封装,同时也定义了 Framer、Message 接口,便于框架对于数据的流程处理。

codec 内定义的 Message 接口,是服务器与客户端之间传递数据的结构,其内部定义了诸多接口,用于获取一系列调用者与被调者的信息。其 Option 的结构定义是诸多 With 接口类传递的参数,本身是一个闭包函数,此处可以留意,后续分析一下这样的好处。

server 服务进程模块

server 定义了关于服务进程的一系列接口,还定义了 Service 相关的接口。Service 默认定义了一个 service 的内部类(不对外),实现了默认的功能接口。是否支持第三方定义的 Service 类型还需要进一步确认。

tRPC-Go 对于 rpcz 还进行了支持,如果后续有精力可以研究一下这块的功能。

transport 接入层抽象模块

transport 提供了对于 TCP、UDP 两种传输层协议的支持,可以分为 ClientTransport 和 ServerTransport 两大类。服务端常见的 ListenAndServe 就是在此处定义的。

因此对于服务端与客户端的并发能力,差异主要集中在此处。

CATALOG
  1. 1. 模块
    1. 1.1. plugin 插件模块
    2. 1.2. log 日志模块
    3. 1.3. codec 编码模块
    4. 1.4. server 服务进程模块
    5. 1.5. transport 接入层抽象模块