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

11 篇文章 0 订阅

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/

因为我是win64系统,所以直接选择win64.zip这个包即可:
在这里插入图片描述

下载之后配置环境变量。

  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:定义消息结构,字段规则、消息号、嵌套消息、服务定义

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)
}

参考文章:
https://trpc.group/zh/docs/what-is-trpc/introduction/
https://blog.csdn.net/weixin_52534218/article/details/134820179

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值