tRPC安装使用【1 基础入门】

tRPC安装使用【1 基础入门】tRPC 安装使用 1 基础入门 trpc

大家好,欢迎来到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/

  1. 定义:
    tRPC是基于插件化理念设计的一款支持多语言、高性能的RPC开发框架,整体设计遵循以下原则:
  • 简单:用户基于框架进行服务开发简单方便;
  • 高性能:框架具备高性能,能适用互联网海量访问场景;
  • 插件化:框架在架构设计和具体实现上进行分层和模块化,各个核心模块可拔插,并能够独立演进;
  1. 应用场景:
  • 搭建多个端口支持多个协议(一个端口只能对应一个协议)的服务(tRPC/HTTP(s)/gRPC等),并能同步/异步处理客户端请求;
  • 以同步、异步、单向的方式访问各种协议后端服务(tRPC/HTTP(s)/gRPC等),调用各种存储系统(redis等);
  • 流式RPC编程,目前支持tRPC流式、gRPC流式、HTTP流式等,实现类似Push、文件上传/下载、AI类等流式应用服务;
  • 插件化支持各种协议和对接服务治理系统,比如:开发自定义的协议、对接业务使用的各种名字服务/监控系统/调用链系统/配置系统/日志系统等,方便服务互通和服务运营
  1. 特点:
  • 跨语言:基于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/

下载之后配置环境变量。

  1. 解压后,拷贝protoc的bin目录路径,配置到windows环境变量:
    在这里插入图片描述
  2. 设置-关于-高级系统设置
    在这里插入图片描述
  3. 高级-环境变量
    在这里插入图片描述
  4. 系统变量-编辑-将拷贝的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

(0)
上一篇 2025-10-28 18:26
下一篇 2025-10-28 18:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信