tRPC背景介绍
随着公司战略的升级,对各业务团队的 协作
提出了更高的要求。tRPC
项目即是在建设大中台的背景下诞生的,目标是建设一个使用简单、性能优异、通用性高、以及拥有高度开放性的新一代 RPC 框架。
tRPC 默认使用 Google Protocol Buffer(简称 Protobuf)协议来作为编解码协议,该协议是一种轻便高效的结构化数据存储格式,具有语言无关、平台无关、可扩展性好、向后兼容性强、压缩效率高等特点,加上其通用性,很适合用来做数据存储或 RPC 数据交换。
框架整体采用微内核 (MicroKernel) + 插件(Plugins)
设计,框架标准模式下提供了插件的默认实现,业务开发可以选择不使用,或者使用完全自定义的插件来完成业务开发,以此实现了较高的开放性和可扩展性。
tRPC-Node
是 tRPC 项目的 Node.js 语言实现。也是我这里主要调研的一个版本。
其具体代码实现可以参考如下链接:
实验步骤
- 安装
安装Node版本的trpc需要安装trpc服务端、trpc客户端、pb转换工具,三个部分。
-
安装完整 tRPC-Node,包括客户端和服务端。
-
对 Protobuf 协议的 IDL 文件做代码转换,全局安装转换工具:
tnpm install @tencent/trpc-rpc # 安装trpc
tnpm install -g @tencent/trpc-node-codec #安装pb转化工具
2.协议
参考协议标准,以 greeter.proto 为例:
syntax = "proto3";
package trpc.test.helloworld;
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
string msg = 1;
}
message HelloReply {
string msg = 1;
}
根据 IDL 文件生成 codec 代码及业务代码的脚手架。
# 转换 codec 代码(服务消费者、服务提供者都需要)
trpc-node-cli -t client greeter.js greeter.proto
# 转换脚手架代码(服务提供者需要)
trpc-node-cli -t server handler.js greeter.proto
之后将生成两份脚手架文件。handler.js
内容如下:
class Greeter {
async SayHello(current, request) {
console.log(`SayHello in:`, request)
const reply = {
msg: request.msg
}
return reply
}
}
export default Greeter
服务提供者
服务提供者,需要首先在转换出来的脚手架代码 handler.js
中实现业务逻辑,然后启动一个 tRPC-Node 服务:
import { server, Dispatcher } from '@tencent/trpc-rpc';
import { Greeter } from './greeter';
import { Handler } from './handler';
const dispatcher = new Dispatcher(Greeter, new Handle());
server.bindService(dispatcher).start();
更详细的 tRPC-Server 的文档请参考:packages/rpc-server
服务消费者
作为客户端 RPC 调用另外一个 tRPC 服务:
import { client } from '@tencent/trpc-rpc';
import { Greeter } from './greeter';
// 创建客户端代理
const prx = client.getProxy(Greeter, 'trpc.test.helloServer.Greeter');
// 发起 RPC 调用
const { retCode, costTime, response } = await prx.funcName();
更详细的 tRPC-Client 的文档请参考:packages/rpc-client
完整的一个demo可以参考如下地址: