Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >腾讯 tRPC-Go 教学——(7)服务配置和指标上报

腾讯 tRPC-Go 教学——(7)服务配置和指标上报

原创
作者头像
amc
修改于 2025-04-18 11:37:40
修改于 2025-04-18 11:37:40
1.3K8
举报
文章被收录于专栏:后台全栈之路后台全栈之路

这篇文章我们就来讲一讲 tRPC 的配置功能,以及自定义指标监控功能吧。

系列文章

配置,是一个服务的重要组成部份。一般来说,业务的逻辑写在代码中,而与系统架构、运维等等偏运维的功能,通过配置来处理。tRPC 框架的配置,可以分为两类:冷配置和热配置。


冷配置

简述

之前的文章 中,我们其实已经接触到一个配置了,那就是服务启动时的 trpc_go.yaml 文件。这个文件,我们可以将它称为 tRPC 服务的 “冷配置”,冷配置的意思就是说服务一旦启动了之后,就不再发生变更,除非服务重启。

开发者也可以在 trpc_go.yaml 中加入自己的自定义配置项,从而定制化自己服务的行为。在 tRPC 中,支持自定义的冷配置,是通过 plugin 来实现的,业务配置只允许被配置在 yaml 文件的 plugin: 层级下。

获取方法

读者可以查阅 tRPC 针对 plugins 的官方 文档。简单而言,开发者需要实现 plugin 工厂类型,然后注册到 tRPC 框架中。当 trpc_go.yaml 文件中包含了这一类型时,框架就会调用自定义的这一工厂类型,开发者可以解析其中的 yaml 配置,并且执行自己的插件逻辑。

说实话,这段实现的过程太麻烦了。tRPC 框架推出的时候,距离 Go 推出泛型还早呢。现在 Go 泛型 推出好久了,读者可以参考我实现的一个 tRPC 小工具,工具自动解析配置到指定的结构体类型中,然后通过回调函数的方式通知业务逻辑。

如果你只是简单地作为配置来看待的话,那更简单,直接用我提供的 plugins.Bind() 函数,工具还自动将解析好的数据 new 到指定位置中。

针对 Bind 函数的例子,读者可以参阅我在 trpc-go-demo 中,user 服务 读取 trpc_go.yamlconfig.client_yaml 配置项的代码可以看到。下面我简单说下 Bind 函数的用法:

  • 开发者首先要定义一个自己的 struct 类型,指定各字段的 yaml tag,比如我例子中,直接定义了一个匿名 struct 类型(反正只使用一次,无需命名):
代码语言:go
AI代码解释
复制
import "github.com/Andrew-M-C/trpc-go-utils/plugin"

// ......

	clientYamlConf := struct {
		Key string `yaml:"key"`
	}{}
  • 然后,利用 Go 泛型的类型推测机制,开发者只需要将上面这个 struct 类型的地址作为 Bind 的参数即可:
代码语言:go
AI代码解释
复制
plugin.Bind("config", "client_yaml", &clientYamlConf)
  • 调完 trpc.NewServer()
  • Bind 函数会根据泛型类型,自动声明一个 tRPC plugin 功能的工厂类型,然后调用 tRPC 的 plugin.Register 函数
  • 当 trpc_go.yaml 文件中包含了指定的配置(如例子中的 config.client_yaml 项)存在时,tRPC 框架就会自动调用上一步中 Bind 函数注册的内部工厂类型
  • Bind 函数调用 yaml.Unmarshal 函数解析配置到指定类型的 struct 中
  • 如果配置文件解析错误,tRPC 框架会直接 panic 退出
  • trpc.NewServer() 函数正常返回,就说明配置不存在或者是解析成功。此时开发者就可以检查相应的配置情况了

可以看到,这个泛型函数完成了许多逻辑,可以大大减少开发者的代码量,提高代码的可读性。这也是我们团队在内网使用 tRPC 的主要思路:框架逻辑尽量封装,将主要精力放在业务开发中,而不是框架适配上。这里我将外网版的逻辑也给出来,欢迎读者参考使用。

此外,我还提供了另一个 Register 函数,这个函数与 Bind 的区别是:完成了 unmarshal 动作之后,还会再调用回调函数通知开发者。事实上,Bind 就是通过封装 Register 函数实现的。


热配置

简述

所谓的热配置,指的就是服务框架启动不必要的、可以保存在远端配置中心的、在服务运行过程中可能随时变化,并且需要服务实时或准实时加载的配置数据。

在腾讯内,我们一般是使用一个名为 “七彩石”(Rainbow)的配置系统来实现配置的编辑、审核、灰度和发布。但不像北极星,七彩石并没有开源(不过七彩石提供了商业化私有化部署服务,感兴趣的团队可以考虑)。因此我们对外的配置,为了图方便,经常是使用 etcd 来实现的。

针对热配置,可以查阅 tRPC 官方的 config 文档。不过这个文档 blah-blah 说了很多,实际上这么多能力,我们团队在实际业务中,大部份是用不上的,特别是文档中的 GetBoolGetInt 等等一系列方法。

配置的获取和监听

在实际逻辑中,我们的配置是结构化的 JSON 或者是 YAML 配置文件,保存于配置系统中。对我们而言,配置系统的 GetWatch 能力才是核心。正如前文所述我们在内部使用的七彩石配置中心在外网中无法使用,因此我基于开源的 tRPC etcd 封装,实现了一个非常接近与我们团队所使用的配置功能封装。

其实配置的获取与前文 plugin 的封装思路很类似,就是将远端的配置数据,与本地代码/服务中的一个 struct 指针相互绑定。我们的框架功能封装中,主要是利用 Go 在存取指针值时是协程安全的这一特性,当监听到远端配置更新时,在逻辑内部完成数据获取、反序列化、通知等逻辑。主要逻辑是以下两个仓库:

我们回到前几篇文章中的 demo。在之前的文章中提到的 http-auth-server 中,我们留意一下 main 包中的 initDependency() 函数,对 repo 层的初始化逻辑:

代码语言:go
AI代码解释
复制
	r, err := repo.NewRepo(repo.Dependency{
		GeneralConfigKeyName: "/http-auth-server/general.json",
	})

NewRepo 函数的实现,GeneralConfigKeyName 参数是用来初始化 http-auth-server 的配置模块,在 InitializeGeneralConfigGetter 方法中,调用了我的 config 包中的 config.Bind 函数——是不是很眼熟?是的,这个函数与前文的 plugin.Bind 函数的逻辑非常类似,但是,更进一步的是,在逻辑内部,是调用了 tRPC 的 config 接口的 Watch 函数,实时监听配置的变化。

这样一来,开发者只需要一个非常简单的泛型调用,就可以实现与远端配置热更新 / 同步的功能。还是我们团队的思路:尽量减少框架代码,将精力专注在业务逻辑的开发中。


客户端寻址热更新

简介

腾讯内部的七彩石配置中心,除了业务逻辑配置本身,作为内部 tRPC 生态的一部份,还提供了一个功能:客户端寻址热更新。这是什么意思呢?我来详细解释一下吧——

我们回顾一下之前的一篇文章:腾讯 tRPC-Go 教学——(3)微服务间调用,如果要调用一个 tRPC 下游服务,我们需要在 trpc_go.yaml 中配置诸如以下信息:

代码语言:yaml
AI代码解释
复制
client:
  service:
    - name: demo.account.User
      target: ip://127.0.0.1:8002
      network: tcp
      protocol: trpc
      timeout: 1000

当发起 RPC 时,框架才知道如何寻址。从前文我们知道,trpc_go.yaml 是 tRPC 服务的 “冷配置”。但是,我们在内网使用时,实际上这部分内容,是放在七彩石配置中心作为 “热配置” 的。将寻址信息作为热配置,有很多好处:

  1. 冷热配置整合在一起,能够更统一地管理配置的版本、内容和发布
  2. 通过热配置,可以实时修改下游的路由、寻址方式、超时时间等参数,配合 filter 功能,实现更加灵活的 RPC 控制

这个功能,我们团队一般直接称为 “client.yaml”,与冷配置的 trpc_go.yaml 相对应。

其中 2 可能有点抽象,我举一下我本人在业务中的例子吧:

业务迁移

如果读者学习过各种 腾讯云认证 的话,在云架构工程师相关的考试中,肯定会有一个经典的题目就是如何将业务数据从私有 IDC 环境逐步切换到云上。如果你使用的是 tRPC,那么这道题实在是太简单了——改一下配置中心的 client 配置就完成迁移咯。

紧急熔断

我之前有一篇 文章 提到过,我们有一个服务拥有非常大的 QPS,在那篇文章中我们把 CPU 从 18,000 核降低到 1000 左右。这个项目在实际应用中曾经有一个 bug 导致 Redis 请求量比设计规格大了三个数量级,作为缓存的 Redis 瞬间雪崩。我们要想办法停止 Redis 的请求,但又不能停止线上服务(因为正在业务一天中的高峰期)。

理论上,我们可以将后端的 Redis 网络断开,但是在当时的架构下,无法做到;或者我们直接销毁 Redis 实例,以后再重新申请(流程很麻烦,谁都不想再来一次)。

我们选择的方案为:当时我们用的是七彩石的 client.yaml 热更新功能,我们直接将对应的 Redis 的寻址改为 ip://127.0.0.1:12345,这样一来,所有针对该 Redis 的调用均会失败,变相熔断了 Redis 服务。直到进入业务低谷期,我们滚动更新服务修复 bug 之后,再将正确的 Redis 寻址恢复回来。

实现方案

前文提过,七彩石是不对外开源的,外部开源的配置系统中,我们比较常用的就是简单的 etcd 配置。但是开源的 etcd 中并不支持这一小节所提及的 client.yaml 热更新,因此我基于 etcd, 自己实现了一份,调用 etcd.RegisterClientProvider 函数,告诉工具需要监听的 etcd key,这样,工具就会自动监听对应的 client.yaml 并解析和更新到 tRPC 框架中。

读者可以实验一下。我们还是按照以前的 http-auth-server 调用 user 的套路,将两个服务启动。从 user 服务的 plugin 相关 代码 可以看到,通过前文所述的 clientYamlConf 变量,获取了冷配置中 client.yaml 需要监听的 etcd key。这个配置,在 demo 的 trpc_go.yaml 中配置为 /user/client.yaml

接着,在获取了 tRPC server 变量之后,user 的 main 包调用:

代码语言:go
AI代码解释
复制
etcdutil.RegisterClientProvider(context.Background(), s, clientYamlConf.Key)

将 client.yaml 的 key 注册到框架中。最开始,我的 client.yaml 配置如下:

代码语言:yaml
AI代码解释
复制
client:
  filter:
    - tracelog
  service:
    - name: db.mysql.userAccount
      namespace: dev
      target: ip://root:123456@tcp(host.docker.internal:3306)/db_test?charset=utf8mb4&parseTime=true&loc=Local&timeout=1s
      timeout: 1000

这是个可触达的 MySQL 地址。正如前面我们的测试方法一样,我们像 http-auth-server 发起一个请求:

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

获得响应:

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

这个错误表示服务连上了 DB,查到了用户 amc,但是密码错误(当然了,我都没传密码参数)。接着,我们保持服务正常运行,但是将 client.yaml 的地址修改一下:

代码语言:yaml
AI代码解释
复制
client:
  filter:
    - tracelog
  service:
    - name: db.mysql.userAccount
      namespace: dev
      target: ip://root:123456@tcp(127.0.0.1:3306)/db_test?charset=utf8mb4&parseTime=true&loc=Local&timeout=1s
      timeout: 1

这个时候,观察日志,会发现服务打出了一段 DEBUG 信息:

代码语言:shell
AI代码解释
复制
2024-05-18 14:40:31.008 DEBUG   config/config.go:74     [amc.util.config] 配置 '/user/client.yaml' 更新, 原始数据: '["client:\n  filter:\n    - tracelog\n  service:\n    - name: db.mysql.userAccount\n      namespace: dev\n      target: ip://root:123456@tcp(127.0.0.1:3306)/db_test?charset=utf8mb4\u0026parseTime=true\u0026loc=Local\u0026timeout=1s\n      timeout: 1"]'

etcd client.yaml 工具监听到了 etcd 配置的更新。这个时候我们再试一下前文的 curl 命令,这一次,我们得到的响应是这样的:

代码语言:json
AI代码解释
复制
{"err_code":-1,"err_msg":"获取 DB 失败 (dial tcp 127.0.0.1:3306: connect: connection refused)"}

很明显,DB 查询目标变了,并且很清楚地告诉调用方错误的原因。这也从侧面说明了 client.yaml 配置更新生效了。

trpc-database

虽然我们做到了 client.yaml 的热更新,但实际上 tRPC 生态内各个 RPC 组件其实并不都支持。首先,tRPC 原生的下游调用框架(也就是 tRPC client),是支持热更新的,因为它发起 RPC 时,是先从 client.yaml 中获取寻址信息之后再从 network transport 池中获取连接再发起请求。

其次,tRPC-database 封装的 MySQL 也支持 client.yaml 热更新,它的调用方式与 tRPC client 类似。

但是,tRPC-database 的 GormRedis 不支持热更新,因为他们的实现方式均为发起一个针对远端 server 的连接之后,就维持一套连接池,不再变化了。

读者可能就疑惑了:前文 你不是说过 Redis 可以热切换吗,怎么这会儿又不行了?稍安勿躁,虽然官方不支持,但我们又可以封装呀~~

这就要讲一下我实现的,基于 tRPC-database 的另一层封装了,目前我实现了 GormRedis,这两个工具对外都提供了一个 ClientGetter 函数,返回一个 client 的获取器,业务请不要直接使用 client 实例,而是在每次发起一次事务时,使用 getter 函数获取一个 client 实例执行逻辑。而在 getter 的 内部,在每次获取 client 实例之前,都会简单检查一下 client.yaml 是否发生变更,如果变更了的话,则会重新生成 client 实例并返回给业务方。

各位开发者在使用其他 tRPC-database 组件时,也可以简单实验一下,针对不支持热更新的组件,也可以参照我的这个思路进行封装。

话说,我在内网版的实现是与七彩石强绑定的;而我在开源版的实现更为优雅。因此笔者打算依照开源版的实现思路优化内网版哈哈。


指标监控

指标监控嘛,这个是笔者的弱项,因此只能简单提一嘴了。在腾讯内网中,我们团队几位开发者一致同意:针对 trpc 生态的最好的监控系统,是内部一个名叫 “伽利略” 的可观测系统、监控和治理中心。但是很可惜的是,这个系统目前没有对外开源,所以外网开发者只能选择其他替代。目前官方支持的有 PrometheusOpenTelemetry,有些复杂,笔者还没时间详细学习——还是伽利略好,只需要花一个上午,就可以学习明白并且完整接入。

因此笔者这里只能介绍一下我们团队在日常开发中,所使用到的自定义属性上报功能吧。我们主要是用 metrics.IncrCountermetrics.SetGauge 两个函数,前者主要是上报一个事件的次数,后者是用来上报事件的口径值用于统计 average、min、max、分布等。

最典型的例子是:当发起一次调用之后,我们使用 counter 上报一次调用次数;调用成功,则 count 一次 succ,如果是失败则 count 一次 fail;同时,本次调用的耗时,则 gauge 一次微秒数。

我个人也实现了一个基于日志的极为简单的自定义属性日志记录插件,读者们可以拿来作为指标的补充调试用工具使用。


阶段性总结

我为什么要写 tRPC 系列文章

讲完这篇文章后,tRPC 作为微服务架构基本生态的内容就结束了。回顾了一下,这么多篇文章下来,我觉得我写的并不好。最初打算写这一系列文章时,是因为我看了 tRPC 对外开源的文档之后,我脑子里满是:地铁、老人、手机。说实话,作为使用者,我最想知道的是一个框架到底怎么用,有没有例子,有没有推荐的架构,而不是上

来就尬吹框架的能力有多少,架构多丰富,但是一点儿接地气的教程都没有。我就举个例子吧,tRPC 的 plugin 功能,试问官方 文档 说了些啥?我不信有初学者能够一眼看明白。而作为趟过 tRPC 不少水的使用者,知道 plugin 怎么用的情况下来看这篇官方 README,才能搞明白它罗列了些什么。问题是 README 应该是一个入门式的文档,初学者都看不明白的 README 完全不合格。

我还是挺认可 tRPC 的理念和设计方向的(尽管部份细节不敢苟同,但是不妨碍我对整体的认可),这么好的东西,不能因为不成功的运营而沉没。但是面对这 tRPC 文档的现状,在搞不明白 tRPC 团队开源和宣传计划(嗯对,我在内网交流后,依然搞不明白)的情况下,我也只好尽我个人的绵薄之力,尽力宣传。我也只是开个头、结合我们团队在内网的实际使用姿势,介绍一下相应的 tRPC 的内容。一方面我也希望这一系列文章可以成为我们团队新员工的引导文,另一方面是对自己的技术文档沉淀,也希望吸引更多的开发者关注和使用 tRPC。

接下来写什么

之前的文章中,有读者在 评论 中提到希望了解我们的代码风格和组织样式。正好我们当时做 单体服务 的时候,就是在我们的 tRPC 大仓中改造的,我也可以藉此介绍下我们团队的几种代码组织方式,给读者一些参考吧。此外,对于我个人所使用过的几种服务框架,也一并做一些对比和推荐吧。


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

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

原文标题:《腾讯 tRPC-Go 教学——(7)服务配置和指标上报》

发布日期:2024-05-19

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

CC BY-NC-SA 4.0 DEED.png
CC BY-NC-SA 4.0 DEED.png

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

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

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

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

评论
登录后参与评论
8 条评论
热度
最新
快7个月过去了,大佬什么时候更新
快7个月过去了,大佬什么时候更新
33点赞举报
trpc 相关的是吗,本来想写一写我目前推崇的服务目录模式的,不过目前没空写呀😂
trpc 相关的是吗,本来想写一写我目前推崇的服务目录模式的,不过目前没空写呀😂
回复回复点赞举报
等大佬闲了更新,我看目录用的比较多的是这个https://github.com/golang-standards/project-layout/blob/master/README_zh.md 年底了,祝大佬顺利晋升,绩效五星
等大佬闲了更新,我看目录用的比较多的是这个https://github.com/golang-standards/project-layout/blob/master/README_zh.md 年底了,祝大佬顺利晋升,绩效五星
回复回复点赞举报
查看全部3条回复
大佬,PCG内部用的123平台进行部署,外网有什么好用的部署姿势吗,感觉作为一个go新手,用tRPC进行开发确实很舒服,但是跟大佬观感一样,这运营确实差太多了。至少这个得20k star往上的水平。
大佬,PCG内部用的123平台进行部署,外网有什么好用的部署姿势吗,感觉作为一个go新手,用tRPC进行开发确实很舒服,但是跟大佬观感一样,这运营确实差太多了。至少这个得20k star往上的水平。
22点赞举报
外网我还没有特别的研究。如果是小系统,我觉得不用在运维系统完整性上下过多工夫,两三个节点直接裸起服务就行了。如果是比较大的项目,还是上云服务,用云原生的 k8s 吧,剩下一堆运维烦心事
外网我还没有特别的研究。如果是小系统,我觉得不用在运维系统完整性上下过多工夫,两三个节点直接裸起服务就行了。如果是比较大的项目,还是上云服务,用云原生的 k8s 吧,剩下一堆运维烦心事
回复回复1举报
嗯嗯🤔
嗯嗯🤔
回复回复点赞举报
期待大佬更新
期待大佬更新
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
腾讯 tRPC-Go 教学——(1)搭建服务
2023 年底腾讯统一的 RPC 框架 tRPC 正式开源。遍观全网,似乎大部份是对 tRPC 概念上的宣传、架构上的设计,而如何开发、如何部署的文章凤毛麟角。于是笔者小试牛刀撰此文,或许会成为一系列,希望能抛砖引玉。
amc
2024/01/14
2.9K2
腾讯 tRPC-Go 教学——(1)搭建服务
腾讯 tRPC-Go 教学——(6)服务发现
本文我们来讲一讲对于微服务架构来说,最重要的一个点了:服务发现及其对应的名字服务功能。
amc
2024/05/01
1.1K0
腾讯 tRPC-Go 教学——(6)服务发现
腾讯 tRPC-Go 教学——(3)微服务间调用
前两篇文章(1、2),我构建了一个简单的 HTTP 服务。 HTTP 服务是前后端分离架构中,后端最靠近前端的业务服务。不过纯后台 RPC 之间,出于效率、性能、韵味等等考虑,HTTP 不是我们的首选。本文我们就来看看腾讯是怎么使用 tRPG-Go 构建后台微服务集群的。
amc
2024/01/29
1.4K0
腾讯 tRPC-Go 教学——(3)微服务间调用
逆微服务潮流?基于腾讯 tRPC-Go 单体化改造怎么节省上万核 CPU
微服务架构一直以来是服务治理的基本盘之一,落地到云原生上,往往是每个 K8s pods 部署一个服务,独立迭代、独立运维。
amc
2023/11/07
1.6K0
逆微服务潮流?基于腾讯 tRPC-Go 单体化改造怎么节省上万核 CPU
腾讯 tRPC-Go 教学——(4)tRPC 组件生态和使用
之前我花了三篇文章来介绍 tRPC 怎么用。而 tRPC 给开发者带来的便利, 在整整三篇文章中,我也只是介绍了它可以方便服务在 HTTP、trpc、grpc 三种协议之间灵活切换。诚然, tRPC 作为能够统一腾讯内开发框架的一个生态级产品,它的能力显然不止这些。这一篇文章,咱们来一起初窥 tRPC 的周边生态有哪些, 以及其中的第三方组件使用方法。
amc
2024/02/06
1.8K6
腾讯 tRPC-Go 教学——(4)tRPC 组件生态和使用
腾讯 tRPC-Go 教学——(2)trpc HTTP 能力
上一篇文章 中我们快速搭建了一个 http API 服务,并且我们可以看到,对外提供了 URL query 和 application/json 两种服务模式。那么实际上,我们到底实现了什么、并且能够做些什么?读者可能还是没有直观的感受,因此必要先来简单 review 一下。就让我们先放下敲代码的小手,一起看看刚刚写出来的都是些什么玩意儿吧。
amc
2024/01/16
1.9K0
腾讯 tRPC-Go 教学——(2)trpc HTTP 能力
回归单体成为潮流?腾讯文档如何实现灵活架构切换
软件架构从来没有所谓的银弹,好的架构除了良好的设计,更少不了持续的迭代优化。腾讯文档在业务挑战之下,实现了一种灵活切换单体、微服务的架构设计方案,对业界同类型同场景项目具备较高可借鉴性。本文将详细介绍腾讯文档在实现单体服务和微服务切换过程中所采用的具体方法和技术,以及所取得的收益。
腾讯云开发者
2023/12/13
7430
回归单体成为潮流?腾讯文档如何实现灵活架构切换
腾讯 tRPC-Go 框架核心实现源码解读
tRPC 是一套由腾讯开源的高性能、跨多种编程语言、插件化的 RPC 框架。tRPC-Go 是框架在 Golang 编程语言下的官方实现。
Martin Hong
2024/05/14
8170
鹅厂火热开发框架:trpc-go设计理念介绍
作者:ronaldoliu,腾讯 IEG 后台开发工程师 trpc-go 是目前公司运用广泛的一个开发框架,支持多协议扩展,能够一键集成各种公司现有平台的功能,非常方便。那么它到底是怎么做到的呢? trpc-go 是目前公司里非常火热的一个开发框架,集成了很多开箱即用的功能,非常方便。trpc-go 代码量不算太多,但是写得还是有点绕,直接阅读可能会比较晕。因此本文主要对 trpc-go 的模块设计进行一个分享,帮助大家构建一个整体视图,后续有需要再针对性的去阅读各模块源码即可。 做后端开发的同学肯定接触过
腾讯技术工程官方号
2023/01/11
4.9K6
鹅厂火热开发框架:trpc-go设计理念介绍
腾讯 tRPC-Go 教学——(5)filter、context 和日志组件
本文咱们来介绍一下在 tRPC 中的 filter 机制、context 用法,以及在相关机制上可以实现的 tracing log 能力。
amc
2024/03/04
1.3K0
腾讯 tRPC-Go 教学——(5)filter、context 和日志组件
微服务不香了?单体化改造为我们节省上万核 CPU!
微服务一直以来是服务治理的基本盘之一,落地到云原生上,往往是每个 K8s pods 部署一个服务,独立迭代、独立运维。
腾讯云开发者
2023/11/14
8920
微服务不香了?单体化改造为我们节省上万核 CPU!
tRPC初探,开源RPC框架新成员
在最近的技术探索中,我触到了一个全新的开源RPC框架——tRPC。这个新框架给我留下了深刻的印象,我想借此机会分享一下我的初体验和一些观察。
闫同学
2023/12/03
4.8K2
腾讯 tRPC-Go 教学——(8)通过泛 HTTP 能力实现和观测 MCP 服务
最近 MCP 大火,其实 tRPC 也可以提供泛 HTTP 接入的能力。内网其实已经对 mcp-go 进行了封装并支持,但是相关代码还没有同步到开源版上。
amc
2025/04/18
5630
腾讯 tRPC-Go 教学——(8)通过泛 HTTP 能力实现和观测 MCP 服务
保姆级教程!Golang微服务简洁架构实战
导语 | 本文从简洁架构的理论出发,依托trpc-go目录规范,简单阐述了整体代码架构如何划分,具体trpc-go服务代码实现细节,和落地步骤,并讨论了和DDD的区别。文章源于我们组内发起的go微服务最佳实践的第一部分,希望从开发和阅读学习中总结出一套go微服务开发的方法论,互相分享一下在寻求最佳的实践过程中的思考和取舍的过程。本次主要讨论目录如何组织,目录的组织其实就是架构的设计,一套通用架构的设计,可以让开发专注于逻辑设计和具体场景的代码设计,好的架构设计可以预防代码的腐败,并且相关的规范操作简单,可以
腾讯云开发者
2022/03/10
4.6K0
tRPC智能体生态又升级:发布A2A协议的实现trpc-a2a-go
代码已开源至 GitHub:https://github.com/trpc-group/trpc-a2a-go
腾讯开源
2025/04/20
3500
tRPC智能体生态又升级:发布A2A协议的实现trpc-a2a-go
ThinkPHP8框架集成Swoole实现高性能RPC服务
RPC 即远程过程调用(Remote Procedure Call),是一种分布式计算技术,允许一个程序在不同的计算机上调用另一个程序的函数或方法,就像调用本地程序中的函数一样简单。RPC 隐藏了底层网络通信的细节,使得开发者能够像处理本地调用一样处理远程调用。
Tinywan
2024/07/05
7110
ThinkPHP8框架集成Swoole实现高性能RPC服务
腾讯文档大仓服务治理:基于自研tRPC框架的研发提效实践
01、背景现状 tRPC 是腾讯自研的高性能、跨平台、插件化、具备高度服务治理能力的 RPC 框架, 目前在公司内各大业务广泛使用并已对外开源,详见:腾讯开
腾讯云开发者
2024/04/02
1.1K0
腾讯文档大仓服务治理:基于自研tRPC框架的研发提效实践
【每日精选时刻】面试多起来了;深度解析Java类加载机制;逆微服务潮流?基于腾讯 tRPC-Go 系统单体化改造
大家吼,我是你们的朋友煎饼狗子——喜欢在社区发掘有趣的作品和作者。【每日精选时刻】是我为大家精心打造的栏目,在这里,你可以看到煎饼为你携回的来自社区各领域的新鲜出彩作品。点此一键订阅【每日精选时刻】专栏,吃瓜新鲜作品不迷路!
社区好文捕手-煎饼狗子
2023/11/09
5660
【每日精选时刻】面试多起来了;深度解析Java类加载机制;逆微服务潮流?基于腾讯 tRPC-Go 系统单体化改造
腾讯开源 tRPC:多语言、高性能 RPC 开发框架
互联网发展早期,业务场景差异大,试错迭代速度很快。这导致其后台服务使用的语言技术栈、开发框架、通信协议、服务治理系统、运维平台等或多或少存在差异。
腾讯云开发者
2023/10/26
2K5
腾讯开源 tRPC:多语言、高性能 RPC 开发框架
tRPC-Go 链路透传消息的源码级解读
在分布式链路追踪等场景下,会使用到微服务调用链路上的透传能力,tRPC-Go 基于 tRPC 协议的头部设计实现了对链路透传的支持,这篇文章从源码角度分析链路透传的设计实现,文章中会涉及 tRPC-go 里不同场景中如何正确使用链路透传功能。
Martin Hong
2024/05/14
2210
推荐阅读
相关推荐
腾讯 tRPC-Go 教学——(1)搭建服务
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档