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.8K0
举报
文章被收录于专栏:后台全栈之路后台全栈之路

之前我花了三篇文章来介绍 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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Markify:专为 LLM 优化的开源文档解析神器,轻松破解 PDF 难题!
不论是在 RAG 应用,还是当下时髦的 Deep Research 应用中,多格式文件的解析始终是一大挑战,尤其是 PDF 文件,由于其复杂的结构和多样的排版方式,很多工具在解析时效果参差不齐。虽然市面上有不少 PDF 解析工具,但高质量且统一的解决方案却少之又少。之前我们已通过《破解 PDF 解析难题:RAG 中高效解析复杂 PDF 的最佳选择》和《微软开源的 Markitdown 可将任意文件转换为 Markdown 格式,PDF 解析咋样?》详细评测过现有工具。markitdown[1] 虽然很好地解决了各类格式转换为 Markdown 的问题,但在 PDF 解析上仍显不足。
AgenticAI
2025/03/18
3391
Markify:专为 LLM 优化的开源文档解析神器,轻松破解 PDF 难题!
字节跳动 Dolphin vs Mineru:哪个才是你的文档解析最优解?
简单来说,文档解析(Document Parsing) 就是把你那些「看得懂但机器看不懂」的 PDF、电子书、网页,变成机器能直接处理的结构化数据,比如 Markdown、JSON 或数据库。
井九
2025/05/29
4330
字节跳动 Dolphin vs Mineru:哪个才是你的文档解析最优解?
2025最新推荐13个PDF格式转换和PDF内容OCR解析工具
在数字化时代,PDF格式成为了我们处理文档的主流选择。然而,随着信息量的不断增大和内容的复杂化,如何高效地解析和转换PDF文件成为了一个巨大的挑战。幸运的是,随着技术的进步,市面上涌现了许多强大的工具,它们不仅能帮助我们进行格式转换,还能提取和解析复杂的PDF内容。无论是学术论文、财务报告,还是图表和公式,这些工具都能轻松应对。今天,我们将为您推荐13款2025年最新的PDF格式转换与解析工具,它们各具特色,为您提供了多种高效便捷的解决方案。
猫头虎
2025/03/10
9410
2025最新推荐13个PDF格式转换和PDF内容OCR解析工具
Star 6.9k!开源的全能Markdown格式文件提取器:MinerU
大家好,今天要给大家推荐一款堪称全能的开源Markdown格式文件提取器—MinerU。
Python兴趣圈
2024/08/13
1.1K0
Star 6.9k!开源的全能Markdown格式文件提取器:MinerU
《INDIE TOOLS • 半月刊》第 001 期
大家好!我最近上线了新网站《INDIE TOOLS》独立开发出海必备工具站https://www.indietools.work — 专注分享独立开发出海实用资源
沉浸式趣谈
2025/01/10
950
《INDIE TOOLS • 半月刊》第 001 期
用户的声音 | 文档结构化信息提取方案测评:LLM、开源模型部署与云端API,谁是合适选择?
近日,我们收到来自专业用户的使用心得,通过测试浅析结构化信息提取技术,辅助完成技术选型。
合合技术团队
2025/02/19
1800
用户的声音 | 文档结构化信息提取方案测评:LLM、开源模型部署与云端API,谁是合适选择?
[1309]MinerU、Magic-PDF、Magic-Doc
在线体验地址: https://opendatalab.com/OpenSourceTools/Extractor/PDF https://www.modelscope.cn/studios/OpenDataLab/MinerU
周小董
2024/11/24
9860
[1309]MinerU、Magic-PDF、Magic-Doc
《独立开发工具 • 半月刊》 第 001 期
IndieTools 是一个专为独立开发者打造的精选工具和资源平台。通过直观的分类,轻松找到 Web 开发、设计、营销、SEO 等全流程实用工具。让你快速找到所需,专注于创造产品。
沉浸式趣谈
2025/05/27
750
《独立开发工具 • 半月刊》 第 001 期
用 Python 把 PDF 玩的明明白白
PDF 无处不在,无论是在线形式还是印刷形式,但很少有人利用这些有用的功能或掌握这种格式的细微差别。
Ai学习的老章
2024/11/22
4600
用 Python 把 PDF 玩的明明白白
基于RAG&MCP的企业级应用开发
支持多种输出格式,如多模态与NLP的Markdown、按阅读顺序排序的JSON、含有丰富信息的中间格式等。支持多种可视化结果,包括layout可视化、span可视化等,便于高效确认输出效果与质检。支持纯CPU环境运行,并支持 GPU(CUDA)/NPU(CANN)/MPS 加速
happywei
2025/05/23
870
《Indie Tools • 半月刊》第001期
如果本文能给你提供启发和帮助,感谢各位小伙伴动动小手指,一键三连 (点赞、评论、转发),给我一些支持和鼓励,谢谢。
沉浸式趣谈
2025/02/17
690
《Indie Tools • 半月刊》第001期
[1308]pdf转markdown
gptpdf 是一个利用VLLM解析PDF为Markdown的工具,几乎完美支持数学公式、表格等。
周小董
2024/11/24
7350
[1308]pdf转markdown
6 大 RAG 知识库PDF文档处理神器对比,谁才是你的最佳选择?
今天,我们精挑细选 6 款最具代表性的 RAG 知识库文档处理工具,从技术架构、功能特性、适用场景、优劣势等多个维度对比,帮你找到最适合的解决方案!💡🔥
致Great
2025/03/02
1.5K0
6 大 RAG 知识库PDF文档处理神器对比,谁才是你的最佳选择?
种文档格式(如PDF、DOCX、PPTX等)转换为markdown或json
文章链接:https://cloud.tencent.com/developer/article/2469495 如果你日常工作中会涉及到网络相关的内容,那么这款工具 可以去了解下。
大侠之运维
2024/11/25
8890
免费部署PDF转Markdown文件的方法
原文链接指路:https://mp.weixin.qq.com/s/egtS2NM9zADl8ESxrXQrvQ?mpshare=1&scene=1&srcid=0309fALktUg2OtrIvougpl27&sharer_shareinfo=83e02aec0842b1f638728f53ee5e98f9&sharer_shareinfo_first=83e02aec0842b1f638728f53ee5e98f9&version=4.1.33.99589&platform=mac#rd
CloudStudio
2025/03/13
4160
docling,强大的文档解析转换工具,开源免费!
Docling是开源的一款多功能文档解析与转换工具,github的star数达到29.5k专门用于将各类文档转化为适合生成式AI使用的结构化格式 。它支持PDF、DOCX、PPTX、图片、HTML、Markdown等多种流行文档格式的导入,并能将这些格式导出为Markdown和JSON
一只牛博
2025/05/31
2690
docling,强大的文档解析转换工具,开源免费!
2024年RAG:回顾与展望
根据RAG技术结构可以分成三类,代表了不同的技术复杂度,越复杂也代表实现难度越大。但是可能会收到更好的效果,适应更多的场景,这三类类型是:
致Great
2025/01/01
1K2
文档解析之困 | 大模型时代,复杂文档解析如何更精准?
前不久,我们推出了腾讯云大模型知识引擎,最快只需5分钟,客户就能轻松搭建企业专属知识服务助手。作为一个知识引擎,首先就得看懂,且理解「海量知识」——特别是复杂多样的PDF、图片、表格等格式文件!
腾讯云AI
2024/10/18
1.5K0
文档解析之困 | 大模型时代,复杂文档解析如何更精准?
PDF解析,还能做得更好
随着大模型文档智能应用逐渐步入正轨,文档解析类产品成为其中重要的一环。文档解析工具能够“唤醒”沉睡在PDF文件中的知识,将其转化为机器能够识别、读取的信息,将可用数据从txt、csv格式扩展到大批量的电子档、扫描档文件,为数据处理、大模型训练、RAG系统开发提供优质的“燃料”。
合合技术团队
2024/08/01
2720
PDF解析,还能做得更好
破解PDF解析难题:RAG中高效解析复杂PDF的最佳选择
随着检索增强生成(RAG)技术的普及,从朴素 RAG 到高级 RAG,再到 GraphRAG 的快速演进,如微软的 GraphRAG 和 LightRAG 等框架不断涌现。这些框架提升了 RAG 的精度,但大多不支持 PDF 格式,而企业内部却存在大量 PDF 文档。因此,将这些资料有效整合进内部知识库成为技术挑战。
AgenticAI
2025/03/18
3000
破解PDF解析难题:RAG中高效解析复杂PDF的最佳选择
推荐阅读
相关推荐
Markify:专为 LLM 优化的开源文档解析神器,轻松破解 PDF 难题!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档