Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >腾讯 tRPC-Go 教学——(4)tRPC 组件生态和使用

腾讯 tRPC-Go 教学——(4)tRPC 组件生态和使用

原创
作者头像
amc
修改于 2025-04-18 11:36:24
修改于 2025-04-18 11:36:24
1.8K6
举报
文章被收录于专栏:后台全栈之路后台全栈之路

之前我花了三篇文章来介绍 tRPC 怎么用。而 tRPC 给开发者带来的便利, 在整整三篇文章中,我也只是介绍了它可以方便服务在 HTTP、trpc、grpc 三种协议之间灵活切换。诚然, tRPC 作为能够统一腾讯内开发框架的一个生态级产品,它的能力显然不止这些。这一篇文章,咱们来一起初窥 tRPC 的周边生态有哪些, 以及其中的第三方组件使用方法。

系列文章


tRPC-ecosystem 介绍

tRPC 的主仓库是 trpc-group,在这之外,tRPC 的周边生态系统则放在 trpc-echosystem。这个组主要包含的事 tRPC 服务之外的周边生态代码, 从分类上,主要包括以下这些方面:

  • 名字服务(naming)和寻址器(selector)
  • 配置(config)
  • 日志(log)
  • 指标上报(metrics)
  • 拦截器(filter)
  • 第三方软件组件

本文所说的 “第三方软件组件”,指的是诸如 MySQLRedis、ElasticSearch 等软件组件客户端 Go 实现。在 tRPC 生态系统组下的 go-database 仓库,我们打开仓库,就可以看到这些熟悉的名称:

数据库

开源库封装

bigcache

clickhouse

cos

goredis

gorm

hbase

kafka

mysql

timer

本地/分布式定时器

tRPC 把各种组件集成到生态中来,主要目的是为了在维持这些开源库的使用习惯的基础上,同时 复用 tRPC 的各种能力,比如路由寻址、监控上报等等功能。

本文我们就从 上一篇文章 定义的 user 服务来看, 如何引入 trpc-database 的 MySQL。


逻辑设计

在前文中,我们给 user 服务只设计了一个接口 GetAccountByUserName,这个接口的功能,简单而言就是根据入参,从数据库中捞取指定的用户信息。

实体和接口设计

我们采用自顶向下的设计模式,从上层所需的接口往下设计。tRPC 业务代码 GetAccountByUserName 所在的层,我们称为 service 层(有些框架称为 handler 层、接口层、服务层等)。

这个接口的逻辑很简单,由于太简单了,因此我们不需要常规的多一个 logic 层封装, 而是直接提供一个 repo 层实现就可以,从这个实现中直接根据 username 获取帐户信息(repo 层有些框架称为 infrastructure 层)。我们简单设计一下需要传输的实体定义:

代码语言:go
AI代码解释
复制
// Account 表示一个帐户信息
type Account struct {
	Username     string
	PasswordHash string
}

至于这个 repo 层依赖, 我们以一个 Dependency 类型定义出来:

代码语言:go
AI代码解释
复制
// Dependency 表示用户服务初始化依赖
type Dependency interface {
	// QueryAccountByUsername 通过用户名查询帐户信息, 如果帐户不存在则返回 (nil, nil)
	QueryAccountByUsername(ctx context.Context, username string) (*entity.Account, error)
}

type userImpl struct {
	dep Dependency
}

可以看到,我把 Dependency 定义为一个 interface, 当然也可以定义为其他的类型,总之是任意方便用于注入测试的一个类型。在以后的文章中,我会说明注入模式的好处。

然后,我们使用这个 Dependency 作为参数, 用于初始化 user 主服务:

代码语言:go
AI代码解释
复制
// RegisterUserService 注册用户服务
func RegisterUserService(s server.Service, d Dependency) error {
	impl := &userImpl{dep: d}
	user.RegisterUserService(s, impl)
	return nil
}

至于 impl 的 GetAccountByUserName 方法实现, 太显而易见了,就不列在本文里了,读者可以自行查阅代码细节。

MySQL 表结构

接下来我们实现在 service 层中依赖的 repo 接口。我们先设计一下 MySQL 的表结构:

代码语言:sql
AI代码解释
复制
CREATE TABLE IF NOT EXISTS `t_trpc_demo_user_account` (
    `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键 ID',
    `username` varchar(128) NOT NULL COMMENT '用户名称',
    `password_hash` varchar(64) NOT NULL COMMENT '用户密码哈希值',
    `create_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `update_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    `delete_at_ms` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间戳, 毫秒',
    PRIMARY KEY (`id`),
    KEY `i_username` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='用户账户表';

在 Go 里面,我们并不需要定义所有的字段,而是我们所需要的字段就可以了:

代码语言:go
AI代码解释
复制
type userAccountItem struct {
	ID           int64  `db:"id"`
	Username     string `db:"username"`
	PasswordHash string `db:"password_hash"`
}

repo 层实现

在 repo/account 的代码中,可以写得与 tRPC 一点关系也没有,我们使用 sqlx 来实现对数据的存取, 然而,我使用注入的方式, 我们让调用方传入一个 sqlx DB 的 getter:

代码语言:go
AI代码解释
复制
// UserAccountRepository 用户账户仓库
type UserAccountRepository struct {
	dep Dependency
}

// Dependency 表示用户账户仓库初始化依赖
type Dependency struct {
	DBGetter func(context.Context) (mysql.Client, error)
}

// InitializeUserAccountRepository 初始化用户账户仓库
func (r *UserAccountRepository) InitializeUserAccountRepository(d Dependency) error {
	r.dep = d
	return nil
}

这个仓库的真正实现中,我们并没有直接使用 sqlx 类型,而是使用了 trpc,主要的就是对 *sqlx.DB 追加了一层 context 封装。


服务部署

好了,现在两个服务的代码都写好了。这个时候我们就要开始启动这个由两个服务的 “集群” 了。

MySQL

咳咳,其实 MySQL 不属于 trpc 框架里的。生产环境中,我们的 MySQL 一般是云上购买的数据库。从学习的角度,我用的是 Mac 进行开发,Docker 用来开发调试,我的 MySQL 也是部署在 Mac Docker 下,3306 端口,用户名 root,密码 123456,数据库名称 db_test

user 服务

user 服务对外提供一个 trpc 协议的接口;同时,它也依赖一个 MySQL。一如既往地,代码的逻辑其实很简单,最主要的、我们来看看这个 MySQL 服务的 启动配置:

代码语言:yaml
AI代码解释
复制
server:
  service:
    - name: demo.account.User
      ip: 127.0.0.1
      # nic: eth0
      port: 8002
      network: tcp
      protocol: trpc
      timeout: 1800

client:
  service:
    - name: db.mysql.userAccount
      target: ip://root:123456@tcp(host.docker.internal:3306)/db_test?charset=utf8mb4&parseTime=true&loc=Local&timeout=1s
      timeout: 1000

先看 server 部份,为了便于调试,我直接监听环回地址 127.0.0.1,协议配置的也是 trpc,而不再是之前文章中惯用的 http。

然后咱们来看新的一个配置项—— client:client 配置和 server 有点像,也是一个 service 数组。这个配置中定义了服务对下游各种依赖的寻址方法和相关配置。上面的配置中,最显眼的就是 target 参数了。这个参数规定了如何寻址指定的下游服务,以及相关的参数。

可以看到 DB 的地址是: host.docker.internal,因为我的服务运行在 Docker 容器中,得使用 host.docker.internal 才可以访问主机的端口。

在 tRPC 的 selector(寻址器)逻辑中,我们之前提过,框架默认注册了 ip 这个 selector,因此我们这里复用了这个功能。此外,selector 配置中剩余的参数,则会被传递到下游组件实现中。同样的逻辑,我们无需修改业务代码的实现,就可以通过 client 配置修改下游的依赖。

http 服务

有了前面我们的描述,针对 http 服务,我们就可以轻车熟路了。http 服务(全名为 http-auth-server)的 启动配置 如下:

代码语言:yaml
AI代码解释
复制
server:
  service:
    - name: demo.httpauth.Auth
      nic: eth0
      port: 8001
      network: tcp
      protocol: http
      timeout: 1800

client:
  service:
    - name: demo.account.User
      target: ip://127.0.0.1:8002
      network: tcp
      protocol: trpc
      timeout: 1000

调试

我们启动两个终端,分别进入两个代码目录中,分别启动两个服务:

代码语言:bash
AI代码解释
复制
cd app/user/; go run . -conf conf/trpc_go.yaml
cd app/http-auth-server/; go run . -conf conf/trpc_go.yaml

然后我们再打开一个终端,使用命令调试一下我们的接口:

代码语言:bash
AI代码解释
复制
curl '172.17.0.6:8001/demo/auth/Login?username=amc'

可以获得返回:

代码语言:json
AI代码解释
复制
{"err_code":404,"err_msg":"用户不存在","data":null}

这就说明逻辑通过,这个 404 是我在 代码中 写的当查询不到用户名的返回信息。

OK,那我们往数据库中插入一个条目吧(正常情况下应该是通过页面创建的)

代码语言:sql
AI代码解释
复制
INSERT INTO t_trpc_demo_user_account (`username`, `password_hash`) VALUES ('amc', '75c498407830cb766fb20d619f3e08280ad7c5b9')

其中 75c498407830cb766fb20d619f3e08280ad7c5b9 就是 123456 的 sha256 值。这个时候我们再执行一下 curl 命令,则可以得到返回:

代码语言:json
AI代码解释
复制
{"err_code":404,"err_msg":"密码错误","data":null}

哎,用户找到了,但是密码错误。所以我们最后,再将代码带上:

代码语言:bash
AI代码解释
复制
curl '172.17.0.6:8001/demo/auth/Login?username=amc&password_hash=8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92'

此时的返回就是:

代码语言:json
AI代码解释
复制
{"err_code":0,"err_msg":"success","data":null}

成功了~逻辑也算是自测 OK 啦~~


小结

至此,我们使用四篇简短的小文章,介绍了如何搭建一个最基本的 tRPC 微服务集群,这个集群包含了以下内容:

  1. 一个对前端的 HTTP API 服务
  2. 一个纯后端服务
  3. 可配置化的服务配置和服务发现

读者看完这四篇文章之后,其实就已经掌握了所有使用 tRPC 提供服务的最基本功能了。至少,笔者自己搭建的私人 web 服务的 API,也就只用到了这些知识点。

然而,要部署一个真正完整的、拥有良好可观测性的服务集群,我们还需要学习和使用更多 tRPC 的知识。下一步,我们来介绍一下 tRPC 日志功能的实现吧。


本文章采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。

原作者: amc,欢迎转载,但请注明出处。

原文标题:《腾讯 tRPC-Go 教学——(4)tRPC 组件生态和使用》

发布日期:2024-02-06

原文链接:https://cloud.tencent.com/developer/article/2387742

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
6 条评论
热度
最新
可以发一个稍复杂的项目吗?想学习一下代码风格和组织方式
可以发一个稍复杂的项目吗?想学习一下代码风格和组织方式
44点赞举报
我把我那个省了一万多核的单体系统的结构,结合我们最新的项目架构整理一下吧,不过是比较靠后的内容哈
我把我那个省了一万多核的单体系统的结构,结合我们最新的项目架构整理一下吧,不过是比较靠后的内容哈
回复回复点赞举报
大佬快更新
大佬快更新
回复回复点赞举报
查看全部4条回复
加油,期待持续更新
加油,期待持续更新
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
腾讯 tRPC-Go 教学——(3)微服务间调用
前两篇文章(1、2),我构建了一个简单的 HTTP 服务。 HTTP 服务是前后端分离架构中,后端最靠近前端的业务服务。不过纯后台 RPC 之间,出于效率、性能、韵味等等考虑,HTTP 不是我们的首选。本文我们就来看看腾讯是怎么使用 tRPG-Go 构建后台微服务集群的。
amc
2024/01/29
1.4K0
腾讯 tRPC-Go 教学——(3)微服务间调用
腾讯 tRPC-Go 教学——(6)服务发现
本文我们来讲一讲对于微服务架构来说,最重要的一个点了:服务发现及其对应的名字服务功能。
amc
2024/05/01
1.1K0
腾讯 tRPC-Go 教学——(6)服务发现
腾讯 tRPC-Go 教学——(7)服务配置和指标上报
配置,是一个服务的重要组成部份。一般来说,业务的逻辑写在代码中,而与系统架构、运维等等偏运维的功能,通过配置来处理。tRPC 框架的配置,可以分为两类:冷配置和热配置。
amc
2024/05/19
1.2K8
腾讯 tRPC-Go 教学——(7)服务配置和指标上报
腾讯 tRPC-Go 教学——(5)filter、context 和日志组件
本文咱们来介绍一下在 tRPC 中的 filter 机制、context 用法,以及在相关机制上可以实现的 tracing log 能力。
amc
2024/03/04
1.2K0
腾讯 tRPC-Go 教学——(5)filter、context 和日志组件
腾讯 tRPC-Go 教学——(1)搭建服务
2023 年底腾讯统一的 RPC 框架 tRPC 正式开源。遍观全网,似乎大部份是对 tRPC 概念上的宣传、架构上的设计,而如何开发、如何部署的文章凤毛麟角。于是笔者小试牛刀撰此文,或许会成为一系列,希望能抛砖引玉。
amc
2024/01/14
2.8K2
腾讯 tRPC-Go 教学——(1)搭建服务
腾讯 tRPC-Go 教学——(2)trpc HTTP 能力
上一篇文章 中我们快速搭建了一个 http API 服务,并且我们可以看到,对外提供了 URL query 和 application/json 两种服务模式。那么实际上,我们到底实现了什么、并且能够做些什么?读者可能还是没有直观的感受,因此必要先来简单 review 一下。就让我们先放下敲代码的小手,一起看看刚刚写出来的都是些什么玩意儿吧。
amc
2024/01/16
1.8K0
腾讯 tRPC-Go 教学——(2)trpc HTTP 能力
腾讯 tRPC-Go 教学——(8)通过泛 HTTP 能力实现和观测 MCP 服务
最近 MCP 大火,其实 tRPC 也可以提供泛 HTTP 接入的能力。内网其实已经对 mcp-go 进行了封装并支持,但是相关代码还没有同步到开源版上。
amc
2025/04/18
5170
腾讯 tRPC-Go 教学——(8)通过泛 HTTP 能力实现和观测 MCP 服务
tRPC智能体生态又升级:发布A2A协议的实现trpc-a2a-go
代码已开源至 GitHub:https://github.com/trpc-group/trpc-a2a-go
腾讯开源
2025/04/20
2920
tRPC智能体生态又升级:发布A2A协议的实现trpc-a2a-go
逆微服务潮流?基于腾讯 tRPC-Go 单体化改造怎么节省上万核 CPU
微服务架构一直以来是服务治理的基本盘之一,落地到云原生上,往往是每个 K8s pods 部署一个服务,独立迭代、独立运维。
amc
2023/11/07
1.6K0
逆微服务潮流?基于腾讯 tRPC-Go 单体化改造怎么节省上万核 CPU
tRPC初探,开源RPC框架新成员
在最近的技术探索中,我触到了一个全新的开源RPC框架——tRPC。这个新框架给我留下了深刻的印象,我想借此机会分享一下我的初体验和一些观察。
闫同学
2023/12/03
4.7K2
鹅厂火热开发框架:trpc-go设计理念介绍
作者:ronaldoliu,腾讯 IEG 后台开发工程师 trpc-go 是目前公司运用广泛的一个开发框架,支持多协议扩展,能够一键集成各种公司现有平台的功能,非常方便。那么它到底是怎么做到的呢? trpc-go 是目前公司里非常火热的一个开发框架,集成了很多开箱即用的功能,非常方便。trpc-go 代码量不算太多,但是写得还是有点绕,直接阅读可能会比较晕。因此本文主要对 trpc-go 的模块设计进行一个分享,帮助大家构建一个整体视图,后续有需要再针对性的去阅读各模块源码即可。 做后端开发的同学肯定接触过
腾讯技术工程官方号
2023/01/11
4.8K6
鹅厂火热开发框架:trpc-go设计理念介绍
腾讯 tRPC-Go 框架核心实现源码解读
tRPC 是一套由腾讯开源的高性能、跨多种编程语言、插件化的 RPC 框架。tRPC-Go 是框架在 Golang 编程语言下的官方实现。
Martin Hong
2024/05/14
7770
tRPC-Go 链路透传消息的源码级解读
在分布式链路追踪等场景下,会使用到微服务调用链路上的透传能力,tRPC-Go 基于 tRPC 协议的头部设计实现了对链路透传的支持,这篇文章从源码角度分析链路透传的设计实现,文章中会涉及 tRPC-go 里不同场景中如何正确使用链路透传功能。
Martin Hong
2024/05/14
2070
腾讯文档大仓服务治理:基于自研tRPC框架的研发提效实践
01、背景现状 tRPC 是腾讯自研的高性能、跨平台、插件化、具备高度服务治理能力的 RPC 框架, 目前在公司内各大业务广泛使用并已对外开源,详见:腾讯开
腾讯云开发者
2024/04/02
1.1K0
腾讯文档大仓服务治理:基于自研tRPC框架的研发提效实践
Typescript 全栈最值得学习的技术栈 TRPC
如果你想成为一个 Typescript 全栈工程师,那么你可能需要关注一下 tRPC 框架。
愧怍
2023/03/14
3.5K0
Typescript 全栈最值得学习的技术栈 TRPC
Typescript 全栈最值得学习的技术栈 TRPC
如果你想成为一个 Typescript 全栈工程师,那么你可能需要关注一下 tRPC 框架。
愧怍
2023/03/11
2.1K0
Typescript 全栈最值得学习的技术栈 TRPC
【技术分享】Go 工程化-前端性能监控接入层 Layout 设计实践
 作者:黎志航&张翔,腾讯监控高级工程师 前言 本文主要介绍 腾讯云前端性能监控(RUM)在全新接入层上的 Go 工程化实践,介绍 Go 项目布局(下文称 Project Layout)的设计理念、设计规范、项目上的思考与实践,以及如何在多人协作开发下高效完成项目。 腾讯云前端性能监控介绍 前端性能监控(Real User Monitoring,RUM)是一站式前端监控解决方案,专注于 Web、小程序等场景监控。前端性能监控聚焦用户页面性能(页面测速,接口测速,CDN 测速等)和质量(JS 错误,Aja
腾讯云可观测平台
2022/02/21
1K0
腾讯开源 tRPC:多语言、高性能 RPC 开发框架
互联网发展早期,业务场景差异大,试错迭代速度很快。这导致其后台服务使用的语言技术栈、开发框架、通信协议、服务治理系统、运维平台等或多或少存在差异。
腾讯云开发者
2023/10/26
2K5
腾讯开源 tRPC:多语言、高性能 RPC 开发框架
回归单体成为潮流?腾讯文档如何实现灵活架构切换
软件架构从来没有所谓的银弹,好的架构除了良好的设计,更少不了持续的迭代优化。腾讯文档在业务挑战之下,实现了一种灵活切换单体、微服务的架构设计方案,对业界同类型同场景项目具备较高可借鉴性。本文将详细介绍腾讯文档在实现单体服务和微服务切换过程中所采用的具体方法和技术,以及所取得的收益。
腾讯云开发者
2023/12/13
7340
回归单体成为潮流?腾讯文档如何实现灵活架构切换
开源公告|tRPC-Java开发框架
tRPC-Java是tRPC开发框架Java语言的实现,符合tRPC设计规范和特点。 同时针对Java开发者生态做了更友好的设计与扩展。
腾讯开源
2023/12/23
5400
开源公告|tRPC-Java开发框架
推荐阅读
相关推荐
腾讯 tRPC-Go 教学——(3)微服务间调用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档