大家好,欢迎来到IT知识分享网。
tRPC入门
全部代码(欢迎star😊):
https://github.com/ziyifast/ziyifast-code_instruction/tree/main/go-demo/go-trpc/01-simple
概念
官网地址:https://trpc.group/zh/docs/languages/go/basics_tutorial/
- 定义:
tRPC是基于插件化理念设计的一款支持多语言、高性能的RPC开发框架,整体设计遵循以下原则:
- 简单:用户基于框架进行服务开发简单方便;
- 高性能:框架具备高性能,能适用互联网海量访问场景;
- 插件化:框架在架构设计和具体实现上进行分层和模块化,各个核心模块可拔插,并能够独立演进;
- 应用场景:
- 搭建多个端口支持多个协议(一个端口只能对应一个协议)的服务(tRPC/HTTP(s)/gRPC等),并能同步/异步处理客户端请求;
- 以同步、异步、单向的方式访问各种协议后端服务(tRPC/HTTP(s)/gRPC等),调用各种存储系统(redis等);
- 流式RPC编程,目前支持tRPC流式、gRPC流式、HTTP流式等,实现类似Push、文件上传/下载、AI类等流式应用服务;
- 插件化支持各种协议和对接服务治理系统,比如:开发自定义的协议、对接业务使用的各种名字服务/监控系统/调用链系统/配置系统/日志系统等,方便服务互通和服务运营
- 特点:
- 跨语言:基于Protocol Buffers来实现跨语言之间的服务通信;
- 多通信协议:支持多种通信协议,能够与不同框架进行互通(比如gRPC);
- 流式rpc:支持流式RPC,更好地适用于大文件上传/下载、消息Push、AI类语音识别/视频理解等多种应用场景;
- 丰富插件生态:提供大量对接业界微服务组件的插件(比如Consul/Promethues/OpenTelemetry等),方便用户构建适合自己的服务治理体系;
- 可扩展性:基于框架插件化的设计,用户可以进行二次开发来扩展框架能力,比如:RPC请求参数校验、鉴权、请求录制等;
- 流控和过载保护:提供多种应用场景下的流量控制和过载保护插件,防止服务因为访问突增造成过载而不可用;
安装tRPC
# 安装trpc 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.9
安装protoc
官网地址:https://github.com/protocolbuffers/protobuf/releases/
下载之后配置环境变量。
- 解压后,拷贝protoc的bin目录路径,配置到windows环境变量:
- 设置-关于-高级系统设置
- 高级-环境变量
- 系统变量-编辑-将拷贝的protoc bin路径添加到Path下:
配置成功后,在终端输入下面命令,观察是否配置成功:
protoc --version
实战
全部代码(欢迎star😊):
https://github.com/ziyifast/ziyifast-code_instruction/tree/main/go-demo/go-trpc/01-simple
编写.proto文件
初始化go.mod文件:
go mod init github.com/go-demo/go-trpc
helloworld.proto:
syntax = "proto3"; package trpc.helloworld; option go_package="github.com/go-demo/go-trpc/pb"; service Greeter {
rpc Hello (HelloRequest) returns (HelloReply) {
} } message HelloRequest {
string msg = 1; } message HelloReply {
string msg = 1; }
执行trpc create命令生成pb、trpc等文件
进入helloworld.proto文件所在位置,执行如下命令:
trpc create -p helloworld.proto --rpconly --nogomod --mock=false
执行成功:
// 安装依赖 go mod tidy
编写服务端:server/main.go&server/trpc_go.yaml
server/main.go:
服务端具体处理逻辑
package main import ( "context" "github.com/go-demo/go-trpc/pb" "trpc.group/trpc-go/trpc-go" "trpc.group/trpc-go/trpc-go/log" ) func main() {
//设置server配置文件路径,默认在./trpc_go.yaml trpc.ServerConfigPath = "E:\\Go\\GoPro\\src\\go_code\\ziyifast-code_instruction\\go-demo\\go-trpc\\server\\trpc_go.yaml" s := trpc.NewServer() pb.RegisterGreeterService(s, &Greeter{
}) if err := s.Serve(); err != nil {
log.Error(err) } } type Greeter struct{
} // Hello API // 1. 接受client请求并打印 // 2. 拼接Hello后作为响应返回给client func (g Greeter) Hello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloReply, error) {
log.Infof("got hello request: %s", req.Msg) return &pb.HelloReply{
Msg: "Hello " + req.Msg + "!"}, nil }
trpc_go.yaml:
服务端配置文件
server: service: - name: trpc.helloworld # 监听地址 ip: 127.0.0.1 # 服务监听端口 port: 8000
编写客户端:client/main.go
client/main.go
package main import ( "context" "github.com/go-demo/go-trpc/pb" "trpc.group/trpc-go/trpc-go/client" "trpc.group/trpc-go/trpc-go/log" ) func main() {
//创建客户端,并请求8080端口的服务 c := pb.NewGreeterClientProxy(client.WithTarget("ip://127.0.0.1:8000")) //向服务端发送请求: world rsp, err := c.Hello(context.Background(), &pb.HelloRequest{
Msg: "world"}) if err != nil {
log.Error(err) } //打印服务端返回结果 log.Info(rsp.Msg) }
运行
拓展: proto文件详细介绍
syntax:指定版本
syntax用于制定protoc的版本,proto2或proto3,新版本proto3中必填。
message:定义消息结构,字段规则、消息号、嵌套消息、服务定义
①字段规则:
- 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) }
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/120595.html










