首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >腾讯 tRPC-Go 教学——(1)搭建服务

腾讯 tRPC-Go 教学——(1)搭建服务

原创
作者头像
amc
修改于 2025-04-18 11:34:14
修改于 2025-04-18 11:34:14
3K2
举报
文章被收录于专栏:后台全栈之路后台全栈之路

2023 年底腾讯统一的 RPC 框架 tRPC 正式开源。遍观全网,似乎大部份是对 tRPC 概念上的宣传、架构上的设计,而如何开发、如何部署的文章凤毛麟角。于是笔者小试牛刀撰此文,或许会成为一系列,希望能抛砖引玉。

系列文章


tRPC 简介

我们先知道一点,tRPC 可以实现两个功能:

  1. 服务之前使用 protobuf 互相进行网络 RPC 调用
  2. 给 web 前端提供 API 接口

好了,剩下的我现在不想废话,我们先直接上代码,建服务!然后再来好好介绍 tRPC 的好处。

本文件不打算将服务的目录结构应怎么设计,这是各个团队内部按照自己风格需要去统一规范的事情。此外,本文也假定读者已经懂得使用 go.mod 组织和进行仓库和版本控制。


制订协议

我们先尝试一下给 web 前端提供一个 API 接口。首先,我们定义一个简单的协议 (GitHub 代码),假设命名为 echo.proto

代码语言:proto
AI代码解释
复制
syntax = "proto3";
package demo.simplest;

option go_package = "github.com/Andrew-M-C/trpc-go-demo/proto/simplest";

message HelloRequest {
  string greeting = 1;
}

message HelloResponse {
  int32  err_code  = 1;
  string err_msg   = 2;
  string response  = 3;
  double timestamp = 4;
}

service HelloWorld {
  rpc Hello(HelloRequest) returns (HelloResponse); // @alias=/demo/Hello
}

很好理解,经典的 echo 功能,外加一个时间戳。我们这就定义好了一个非常简单的服务。接下来,我们需要把这个服务转换成 trpc 桩代码。为此,我们需要借助 trpc 的一个工具来实现。

其中有一个比较特别的是 // @alias=/demo/Hello。我以后会讲解它的作用。


trpc 工具链安装

首先,trpc 工具是基于 protoc 实现的,所以,我们首先需要安装 protoc。假设我们的开发环境是 Linux,那么可以执行以下命令安装(可能需要 sudo):

代码语言:bash
AI代码解释
复制
wget https://github.com/protocolbuffers/protobuf/releases/download/v25.1/protoc-25.1-linux-x86_64.zip
7z x protoc-25.1-linux-x86_64.zip -o/usr/local -y
rm protoc-25.1-linux-x86_64.zip*
chmod +x /usr/local/bin/protoc
protoc --version

上面的命令,读者可以对应我的 demo 项目中 Makefile 文件的 installpb 规则。

接着把 trpc 工具安装了:

代码语言:bash
AI代码解释
复制
go install trpc.group/trpc-go/trpc-cmdline/trpc@latest
trpc version

这个则对应 Makefile 的 make installtrpc 规则。


生成桩代码

安装了工具链之后,我们就可以进入前面我们定义的 proto 文件所在的目录,执行以下命令:

代码语言:bach
AI代码解释
复制
trpc create -f --protofile=echo.proto --protocol=trpc --rpconly --nogomod --mock=false

这串命令可以对应 Makefile 的 make pb 规则。我个人觉得用上面这个参数组合是最舒服最方便的。读者可以先不用管这些参数的意思,先照着用就可以了。随着 trpc 输出一串卖萌的提示之后:

代码语言:bash
AI代码解释
复制
[create] Create tRPC project `echo` post process: succeed! ('▽')

可以看到,在目录下生成了 echo.pb.goecho.trpc.go 两个文件。其中前者定义的是在 proto 文件中定义的各种数据类型;而后者则是 trpc 工具链的关键功能:HelloWorld 的客户端和服务端。


撰写业务逻辑

我们就按照最最简单的模式,一个 main package 搞定一切(当然正式的业务肯定要做好功能划分)。我们新建一个 simplest_main.go 文件,输入以下内容:

代码语言:go
AI代码解释
复制
package main

import (
	"context"
	"fmt"
	"time"

	// proto package 的路径请读者自行调整
	"github.com/Andrew-M-C/trpc-go-demo/proto/simplest"
	"trpc.group/trpc-go/trpc-go"
)

func main() {
	s := trpc.NewServer()
	simplest.RegisterHelloWorldService(s, helloWorldImpl{})
	_ = s.Serve()
}

type helloWorldImpl struct{}

func (helloWorldImpl) Hello(ctx context.Context, req *simplest.HelloRequest) (*simplest.HelloResponse, error) {
	rsp := &simplest.HelloResponse{}
	rsp.Response = fmt.Sprintf("%s to you, too", req.Greeting)
	rsp.TimestampMsec = time.Now().UnixMilli()
	return rsp, nil
}

逻辑很简单,我就不废话了。


启动服务

单纯编译上面的代码之后,还不足以实现一个完整的服务。trpc 服务还需要搭配一个配置文件,这个文件我们通常命名为 trpc_go.yaml。对于咱们这个服务,这个配置文件的内容为:

代码语言:yaml
AI代码解释
复制
server:
  service:
    - name: demo.simplest.HelloWorld
      nic: eth0
      # ip: 127.0.0.1
      port: 8000
      network: tcp
      protocol: http
      timeout: 1800

然后,咱们就可以启动服务了:

代码语言:bash
AI代码解释
复制
go run . -conf conf/trpc_go.yaml

可以看到 trpc 在标准输出输出以下文字:

代码语言:log
AI代码解释
复制
2024-01-14 14:28:09.886 INFO    client/client_linux.go:35       client  is empowered with tnet! 🤩 
2024-01-14 14:28:09.887 DEBUG   maxprocs/maxprocs.go:47 maxprocs: Leaving GOMAXPROCS=4: CPU quota undefined
2024-01-14 14:28:09.888 INFO    server/service.go:167   process:19556, http service:demo.simplest.HelloWorld launch success, tcp:172.17.0.4:8000, serving ...

这个时候,我们可以执行以下请求:

代码语言:bash
AI代码解释
复制
curl http://172.17.0.4:8000/demo/Hello?greeting=Morning

得到响应:

代码语言:json
AI代码解释
复制
{"err_code":0, "err_msg":"", "response":"Morning to you, too", "timestamp":1705243778.669}

就这样,一个简单的基于 URL query 的 http 服务,搭建完成了。

难道只能支持 URL query 吗?我们换一个调用方式:

代码语言:bash
AI代码解释
复制
curl http://172.17.0.4:8000/demo/Hello --header 'Content-Type:application/json'\
-d '{"greeting":"Good afternoon"}'

依然得到响应:

代码语言:json
AI代码解释
复制
{"err_code":0, "err_msg":"", "response":"Good afternoon to you, too", "timestamp":1705243811.625}

下一步

由于笔者最近比较忙,文章先写到这,给读者一个敲门砖。下一篇文章笔者会介绍一下,咱们启动了的这到底是个什么样的服务,究竟支持哪些能力?配置项里面的那些代表了什么?实际业务中,腾讯人是怎么做的?不急不急,请容我歇一会儿,慢慢道来。

下一篇:《手把手 tRPC-Go 教学——(2)trpc HTTP 能力


推荐阅读


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

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

原文标题:《手把手 tRPC-Go 教学——(1)搭建服务》

发布日期:2024-01-14

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

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

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

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

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

评论
登录后参与评论
2 条评论
热度
最新
很棒,TRPC在腾讯内部已有很多实践经验,稳定性和性能都得到了验证。这一框架又为优秀的RPC选型提供了新的选择。
很棒,TRPC在腾讯内部已有很多实践经验,稳定性和性能都得到了验证。这一框架又为优秀的RPC选型提供了新的选择。
回复回复1举报
从上午开始摸鱼. 看了大部分文章,学到了很多.
从上午开始摸鱼. 看了大部分文章,学到了很多.
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
腾讯 tRPC-Go 教学——(2)trpc HTTP 能力
上一篇文章 中我们快速搭建了一个 http API 服务,并且我们可以看到,对外提供了 URL query 和 application/json 两种服务模式。那么实际上,我们到底实现了什么、并且能够做些什么?读者可能还是没有直观的感受,因此必要先来简单 review 一下。就让我们先放下敲代码的小手,一起看看刚刚写出来的都是些什么玩意儿吧。
amc
2024/01/16
2K0
腾讯 tRPC-Go 教学——(2)trpc HTTP 能力
腾讯 tRPC-Go 教学——(3)微服务间调用
前两篇文章(1、2),我构建了一个简单的 HTTP 服务。 HTTP 服务是前后端分离架构中,后端最靠近前端的业务服务。不过纯后台 RPC 之间,出于效率、性能、韵味等等考虑,HTTP 不是我们的首选。本文我们就来看看腾讯是怎么使用 tRPG-Go 构建后台微服务集群的。
amc
2024/01/29
1.5K0
腾讯 tRPC-Go 教学——(3)微服务间调用
腾讯 tRPC-Go 教学——(4)tRPC 组件生态和使用
之前我花了三篇文章来介绍 tRPC 怎么用。而 tRPC 给开发者带来的便利, 在整整三篇文章中,我也只是介绍了它可以方便服务在 HTTP、trpc、grpc 三种协议之间灵活切换。诚然, tRPC 作为能够统一腾讯内开发框架的一个生态级产品,它的能力显然不止这些。这一篇文章,咱们来一起初窥 tRPC 的周边生态有哪些, 以及其中的第三方组件使用方法。
amc
2024/02/06
1.9K6
腾讯 tRPC-Go 教学——(4)tRPC 组件生态和使用
腾讯 tRPC-Go 教学——(7)服务配置和指标上报
配置,是一个服务的重要组成部份。一般来说,业务的逻辑写在代码中,而与系统架构、运维等等偏运维的功能,通过配置来处理。tRPC 框架的配置,可以分为两类:冷配置和热配置。
amc
2024/05/19
1.3K8
腾讯 tRPC-Go 教学——(7)服务配置和指标上报
tRPC初探,开源RPC框架新成员
在最近的技术探索中,我触到了一个全新的开源RPC框架——tRPC。这个新框架给我留下了深刻的印象,我想借此机会分享一下我的初体验和一些观察。
闫同学
2023/12/03
4.9K2
逆微服务潮流?基于腾讯 tRPC-Go 单体化改造怎么节省上万核 CPU
微服务架构一直以来是服务治理的基本盘之一,落地到云原生上,往往是每个 K8s pods 部署一个服务,独立迭代、独立运维。
amc
2023/11/07
1.6K0
逆微服务潮流?基于腾讯 tRPC-Go 单体化改造怎么节省上万核 CPU
腾讯 tRPC-Go 教学——(6)服务发现
本文我们来讲一讲对于微服务架构来说,最重要的一个点了:服务发现及其对应的名字服务功能。
amc
2024/05/01
1.1K0
腾讯 tRPC-Go 教学——(6)服务发现
腾讯 tRPC-Go 教学——(5)filter、context 和日志组件
本文咱们来介绍一下在 tRPC 中的 filter 机制、context 用法,以及在相关机制上可以实现的 tracing log 能力。
amc
2024/03/04
1.3K0
腾讯 tRPC-Go 教学——(5)filter、context 和日志组件
go 使用 grpc 通讯
Go是一种强类型、静态编译的语言,grpc是一种高性能的、开源的远程过程调用框架。在Go语言中使用grpc可以轻松地实现跨网络的通信,提供了高效的序列化、压缩和流控制等功能。
运维开发王义杰
2023/08/21
3580
go 使用 grpc 通讯
鹅厂火热开发框架:trpc-go设计理念介绍
作者:ronaldoliu,腾讯 IEG 后台开发工程师 trpc-go 是目前公司运用广泛的一个开发框架,支持多协议扩展,能够一键集成各种公司现有平台的功能,非常方便。那么它到底是怎么做到的呢? trpc-go 是目前公司里非常火热的一个开发框架,集成了很多开箱即用的功能,非常方便。trpc-go 代码量不算太多,但是写得还是有点绕,直接阅读可能会比较晕。因此本文主要对 trpc-go 的模块设计进行一个分享,帮助大家构建一个整体视图,后续有需要再针对性的去阅读各模块源码即可。 做后端开发的同学肯定接触过
腾讯技术工程官方号
2023/01/11
4.9K6
鹅厂火热开发框架:trpc-go设计理念介绍
gRPC cpp 框架快速上手
在gRPC框架中,运行在不同机器上的客户端应用可以直接调用服务器端上「提供的方法」,使得我们可以更容易的创建一个分布式系统。
Mculover666
2021/11/02
1.2K0
一步步完成gRPC 示例
可以访问网址【https://github.com/google/protobuf/releases】查看不同版本代码生成器,本文使用的版本为protoc-3.1.0-win32.zip,可以访问如下地址下载,
孟君
2019/09/17
5K2
一步步完成gRPC 示例
实践gRPC之GoLang入门HelloWord
这篇文章里我们要实现一个基于GoLang编程语言的gRPC的客户端与服务端通信的HelloWorld案例 编写hello_world.proto文件,如下代码: syntax proto3 package proto //接口请求入参 message HelloRequest{ string request = 1; } //接口返回出参 message HelloResponse{ string response = 1; } //定义接口 service HelloService{
阿伟
2019/08/26
6790
实践gRPC之GoLang入门HelloWord
API 网关 gRPC-Gateway V2 初探
我们都知道 gRPC 并不是万能的工具。在某些情况下,我们仍然想提供传统的 HTTP/JSON API。原因可能从保持向后兼容性到支持编程语言或 gRPC 无法很好地支持的客户端。但是仅仅为了公开 HTTP/JSON API 而编写另一个服务是一项非常耗时且乏味的任务。
我是阳明
2021/04/09
2.6K0
API 网关 gRPC-Gateway V2 初探
gRPC 在 Go 中的应用:一个初步探索
gRPC 是 Google 开发的一个高性能、开源的通用 RPC (Remote Procedure Call, 远程过程调用) 框架,其面向移动和 HTTP/2 设计,并且可以运行在任何环境中。它可以从任何应用程序中调用其他应用程序的方法,无论这些应用程序是在同一个主机上,还是分布在不同的主机上。gRPC 还为开发人员提供了简洁的服务定义框架,使得能够自动化生成客户端和服务器端的代码。
运维开发王义杰
2023/08/10
4800
gRPC 在 Go 中的应用:一个初步探索
Golang笔记 6.3 RPC 编程之 gRPC
先了解几个基本概念,https://grpc.io/docs/guides/concepts/
twowinter
2020/04/17
1.5K0
gRPC学习之五:gRPC-Gateway实战
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos gRPC学习系列文章链接 在CentOS7部署和设置GO GO的gRPC开发环境准备 初试GO版gRPC开发 实战四类服务方法 gRPC-Gateway实战 gRPC-Gateway集成swagger 本篇概览 本文《gRPC学习》系列的第五篇,gRPC常用于服务端之间的相互调用,如果想把服务暴露给前端,虽然动手修改服务端也能实现,但似乎增加了不少工作量,此
程序员欣宸
2022/05/06
1.7K0
gRPC学习之五:gRPC-Gateway实战
gRPC简单示例
gRPC是一种跨语言的RPC框架,之所以它能跨语言,是因为它基于protobuf描述对象实体和方法,最后通过protobuf编译器生成指定语言的代码。 这样,就能通过一套protobuf声明生成多种语言的相同API,对于实现跨语言的RPC通信非常便利,同时也使用protobuf作为通信的序列化协议。
编程随笔
2024/03/21
3020
gRPC简单示例
Grpc介绍 — ProToBuf基本使用
RPC(Remote Procedure Call)远程过程调用,关注笔者的同学应该知道之前笔者出过关于Thrift对应的问题,这次主要来说的是Google开源的Grpc,和Thrift有很大的区别Grpc是基于HTTP2.0并且依赖protobuf,为什么又推出关于grpc的文章呢?请大家继续往下看。
喵了个咪233
2019/05/26
1.6K0
gRPC服务开发和接口测试初探【Go】
之前写过了Grpc服务开发和接口测试初探【Java】,中间耽搁了一些时间,Go版本的gRPC测试开发实践才有时间学习使用。其中也是由于自己Go语言不够熟悉导致的。之前有段时间想暂时放弃Go语言的学习,导致了Go的生疏,原因是从Groovy到Java性能。
FunTester
2022/05/17
6410
推荐阅读
相关推荐
腾讯 tRPC-Go 教学——(2)trpc HTTP 能力
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档