gRPC概述
RPC(Remote Procedure Call)——远程过程调用
RPC是一种协议,用来屏蔽分布式计算中的各种调用细节。
官网地址:grpc.io
开源中国整理的版本地址:doc.oschina.net/grpc
单体架构
微服务架构
gRPC
gRPC是一个高性能的开源的通用RPC框架。调用方(client),被调用方(server)。gRPC会屏蔽底层的细节,server端要实现我们定义的方法,client直接调用定义好的方法即可得到预期的返回结果。
gRPC与语言无关,客户端和服务端可以使用任何一种语言的框架,只要做好“定义服务”和在编码和解码的过程中做到语言无关即可。常用ProtocolBuf
protobuf是谷歌开源的一种数据格式,适合高性能,对响应速度有要求的数据传输场景。因为protobuf是二进制数据格式,需要编码和解码。
- 序列化:将数据结构或对象转换成二进制串的过程
- 反序列化:将在序列化过程中所产生的二进制串转换成数据结构或者对象的过程
优势
- 序列化后体积相比json和XML很小,适合网络传输
- 支持跨平台多语言
- 消息格式升级和兼容性好
- 序列化和反序列化速度快
Protobuf
配置Protobuf
找到相应的版本进行下载
解压后将bin目录配置至系统环境变量
终端测试是否配置成功
安装gRPC的核心库
go get google.golang.org/grpc
安装生成工具
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
因为这些文件在安装grpc得到时候已经下载下来了,因此使用install命令就可以了,而不用使用get命令
G:\GoProjects\bin路径下会多出这两个文件
proto文件编写
// 声明使用的是proto3语法
syntax = "proto3";
// 这部分的内容是关于最后生成的go文件处在哪个目录哪个包中,.代表当前目录生成,service代表生成的go文件的包名是service
// 两个参数,用;隔开
option go_package = ".;service";
service SayHello {
rpc SayHello(HelloRequest) returns(HelloResponse){}
}
// message关键字,可以理解位Golang中的结构体
// 后面的“赋值”,表示的是这个变量在message中的位置
message HelloRequest{
string requestName = 1;
int64 age = 2;
}
message HelloResponse{
string responseMsg = 1;
}
cd进入proto的目录中
执行生成命令
protoc --go_out=. hello.proto
protoc --go-grpc_out=. hello.proto
执行后,生成了相应的代码文件
服务端代码编写
创建gRPC Server对象
注册server
创建listen,监听TCP端口 main函数中
import pb "socialnetwork_back_go/proto"
type server struct {
pb.UnimplementedSayHelloServer
}
func (s *server) SayHello(ctx context.Context, req *pb.HelloRequest)(*pb.HelloResponse, error){
return &pb.HelloResponse{ResponseMsg: "Hello World !!!" + req.RequestName},nil
}