2025年腾讯trpc-go教程——一文搞懂trpc框架

腾讯trpc-go教程——一文搞懂trpc框架腾讯 trpc go 教程 一文搞懂 trpc 框架 前言 最近腾讯开源了 trpc 框架 小编心血来潮就去研究了以下 现在将研究结果分享给大家 安装 trpc 首先将以下内容添加到你的 gitconfig 中 url ssh insteadOf

大家好,我是讯享网,很高兴认识大家。

腾讯trpc-go教程——一文搞懂trpc框架


前言

最近腾讯开源了trpc框架,小编心血来潮就去研究了以下,现在将研究结果分享给大家。

安装trpc

首先将以下内容添加到你的 ~/.gitconfig 中:

[url "ssh:///"] insteadOf = https://github.com/ 

讯享网

然后执行

讯享网go install trpc.group/trpc-go/trpc-cmdline/trpc@latest 

如果报错了可以尝试一下的代理地址:

go env -w GOPROXY=https://goproxy.cn,direct go env -w GOPROXY=https://goproxy.io,direct go env -w GOPROXY=https://goproxy.baidu.com/ go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/ 

执行一下命令查看是否安装成功

讯享网trpc version #打印版本号就是成功了 trpc-group/trpc-cmdline version: v1.0.5 

然后执行一下代码,安装下依赖

trpc setup 

安装protoc

我们可以点击protoc工具下载链接,目前的最新版本是v25.0

在这里插入图片描述
讯享网

大家可以根据自己需求安装。安装之后配置下环境变量。在这里插入图片描述

然后执行:

讯享网protoc --version 

查看下版本号,如果没有输出版本号就是没安装成功或者环境变量没配好。

第一个trpc程序

创建项目目录

创建一下的目录结构,模拟项目操作

在这里插入图片描述

编写helloworld.proto文件

syntax = "proto3"; package helloworld; option go_package = "github.com/some-repo/examples/helloworld"; // HelloRequest is hello request. message HelloRequest { string msg = 1; } // HelloResponse is hello response. message HelloResponse { string msg = 1; } // HelloWorldService handles hello request and echo message. service HelloWorldService { // Hello says hello. rpc Hello(HelloRequest) returns(HelloResponse); } 

执行命令

讯享网trpc create -p helloworld.proto -o out cd out go run . 

执行命令后会生成以下文件目录
在这里插入图片描述

trpc_go.yaml是trpc的配置文件

global: # Global configuration. namespace: Development # Environment type, either Production or Development. env_name: test # Environment name for non-production environments. server: # Server configuration. app: yourAppName # Application name for the business. server: HelloWorldService # Process server name. bin_path: /usr/local/trpc/bin/ # Path to binary executable files and framework configuration files. conf_path: /usr/local/trpc/conf/ # Path to business configuration files. data_path: /usr/local/trpc/data/ # Path to business data files. filter: # List of interceptors for all service handler functions. - simpledebuglog - recovery # Intercept panics from business processing goroutines created by the framework. service: # Services provided by the business, can have multiple. - name: helloworld.HelloWorldService # Route name for the service. ip: 127.0.0.1 # Service listening IP address, can use placeholder ${ip}. Use either ip or nic, ip takes priority. # nic: eth0 port: 9000 # Service listening port, can use placeholder ${port}. network: tcp # Network listening type: tcp or udp. protocol: trpc # Application layer protocol: trpc or http. timeout: 1000 # Maximum processing time for requests in milliseconds. client: # Backend configuration for client calls. timeout: 1000 # Maximum processing time for all backends. namespace: Development # Environment for all backends. filter: # List of interceptors for all backend function calls. - simpledebuglog service: # Configuration for individual backends. - name: helloworld.HelloWorldService # Service name for the backend. namespace: Development # Environment for the backend. network: tcp # Network type for the backend: tcp or udp (configuration takes priority). protocol: trpc # Application layer protocol: trpc or http. target: ip://127.0.0.1:8000 # Service address for requests. timeout: 1000 # Maximum processing time for requests. plugins: # Plugin configuration. log: # Log configuration. default: # Default log configuration, supports multiple outputs. - writer: console # Console standard output (default). level: debug # Log level for standard output. - writer: file # Local file log. level: info # Log level for local file rolling logs. writer_config: filename: ./trpc.log # Path to store local file rolling logs. max_size: 10 # Maximum size of local file rolling logs in MB. max_backups: 10 # Maximum number of log files. max_age: 7 # Maximum number of days to keep logs. compress: false # Whether to compress log files. 

proto文件介绍

syntax

​ syntax用于制定protoc的版本,proto2或proto3,新版本proto3中必填。

message

​ message:protobuf中定义一个消息类型式是通过关键字 message字段指定的。消息就是需要传输的数据格式的定义message关键字 类似于C++中的class,JAVA中的class,go中的struct。

​ 在消息中承载的数据分别对应于每一个字段,其中每个字段都有一个名字和一种类型个proto文件中可以定义多个消息类型。

字段规则

  • required:消息体中必填字段,不设置会导致编码异常。在protobuf2中使用,在protobuf3中被删去
  • optional:消息体中可选字段。protobuf3没有了required,optional等说明关键字,都默认为optional
  • repeate:消息体中可重复字段,重复的值的顺序会被保留在go中重复的会被定义为切片。

消息号

​ 在消息体的定义中,每个字段都必须要有一个唯一的标识号,标识号是[1,2^29-1]范国内的一个整数

嵌套消息

​ 可以在其他消息类型中定义、使用消息类型,在下面的例子中,person消息就定义在Personlnfo消息内如

讯享网message PersonInfo{ message Person{ string name = 1; int32 height =2; repeated int32 weight = 3; } repeated Person info = 1; } 

​ 如果要在它的父消息类型的外部重用这个消息类型,需要Personlnfo.Person的形式使用它,如:

message PersonMessage{ PersonInfo.Person info = 1; } 

服务定义

​ 如果想要将消息类型用在RPC系统中,可以在.proto文件中定义一个RPC服务接口,protocol buffer编译器将会根据所选择的不同语言生成服务接口代码及存根。

讯享网service $earchService{ # rpc 服务函数名 (参》返回(返回参) rpc Search(SearchRequest) returns (SearchResponse) } 

服务端编写

out/main.go

package main import ( "context" "fmt" pb "github.com/some-repo/examples/helloworld" _ "trpc.group/trpc-go/trpc-filter/debuglog" _ "trpc.group/trpc-go/trpc-filter/recovery" trpc "trpc.group/trpc-go/trpc-go" "trpc.group/trpc-go/trpc-go/log" ) type service struct { 
    pb.UnimplementedHelloWorldService } func (s *service) Hello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error) { 
    fmt.Println("hello " + req.Msg) return &pb.HelloResponse{ 
   Msg: "hello " + req.Msg}, nil } func main() { 
    s := trpc.NewServer() pb.RegisterHelloWorldServiceService(s.Service("helloworld.HelloWorldService"), &service{ 
   }) if err := s.Serve(); err != nil { 
    log.Fatal(err) } } 

客户端编写

out/cmd/client/main.go

讯享网// Package main is originally generated by trpc-cmdline v1.0.5. // It is located at `project/cmd/client`. // Run this file by executing `go run cmd/client/main.go` in the project directory. package main import ( "fmt" pb "github.com/some-repo/examples/helloworld" _ "trpc.group/trpc-go/trpc-filter/debuglog" trpc "trpc.group/trpc-go/trpc-go" "trpc.group/trpc-go/trpc-go/client" "trpc.group/trpc-go/trpc-go/log" ) func callHelloWorldServiceHello() { 
    proxy := pb.NewHelloWorldServiceClientProxy( client.WithTarget("ip://127.0.0.1:9000"), client.WithProtocol("trpc"), ) ctx := trpc.BackgroundContext() // Example usage of unary client. reply, err := proxy.Hello(ctx, &pb.HelloRequest{ 
   Msg: "itcyy"}) fmt.Println(reply) if err != nil { 
    log.Fatalf("err: %v", err) } log.Debugf("simple rpc receive: %+v", reply) } func main() { 
    // Load configuration following the logic in trpc.NewServer. cfg, err := trpc.LoadConfig(trpc.ServerConfigPath) if err != nil { 
    panic("load config fail: " + err.Error()) } trpc.SetGlobalConfig(cfg) if err := trpc.Setup(cfg); err != nil { 
    panic("setup plugin fail: " + err.Error()) } callHelloWorldServiceHello() } 

运行结果

在这里插入图片描述

先运行out下的main.go,再运行out/cmd/client/main.go。

两边都打印出hello itcyy的结构即运行成功,如图所示

在这里插入图片描述

总结

关于trpc-go的快速入门就到此结束了,感兴趣的可以关注下博主,查看后续文章哦!

小讯
上一篇 2025-01-05 17:35
下一篇 2025-03-11 18:05

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/67035.html