【组件治理】tRPC调研笔记

tRPC背景介绍


随着公司战略的升级,对各业务团队的 协作 提出了更高的要求。tRPC 项目即是在建设大中台的背景下诞生的,目标是建设一个使用简单、性能优异、通用性高、以及拥有高度开放性的新一代 RPC 框架。

tRPC 默认使用 Google Protocol Buffer(简称 Protobuf)协议来作为编解码协议,该协议是一种轻便高效的结构化数据存储格式,具有语言无关、平台无关、可扩展性好、向后兼容性强、压缩效率高等特点,加上其通用性,很适合用来做数据存储或 RPC 数据交换。

框架整体采用微内核 (MicroKernel) + 插件(Plugins) 设计,框架标准模式下提供了插件的默认实现,业务开发可以选择不使用,或者使用完全自定义的插件来完成业务开发,以此实现了较高的开放性和可扩展性。

tRPC-Node 是 tRPC 项目的 Node.js 语言实现。也是我这里主要调研的一个版本。

其具体代码实现可以参考如下链接:

实验步骤


  1. 安装

安装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可以参考如下地址:

发表评论

电子邮件地址不会被公开。 必填项已用*标注