gRPC是一款语言中立、平台中立、开源的远程过程调用系统

即:gRPC客户端和服务端可以在多种环境中运行和交互,例如用java写一个服务端,可以用go语言写客户端调用

微服务架构中,由于每个服务对应的代码库是独立运行的,无法直接调用,彼此间的通信就是个大问题.

gRPC可以实现将大的项目拆分为多个小且独立的业务模块,也就是服务。各服务间使用高效的protobuf协议进行RPC调用,gRPC默认使用protocol buffers,这是google开源的一套成熟的结构数据序列化机制

当然也可以使用其他数据格式如JSON

可以用proto files创建gRPC服务,用message类型来定义方法参数和返回类型

  1. 安装#
    第一步:下载grpc通用编译器
    如下图,解压出来因平台而异会是一个protoc或者protoc.exe

第二步:把下载的二进制文件路径添加到环境变量中(为了能全局访问protoc)
这里以为mac为例子
Copy

打开存放环境变量的文件

vim ~/.bash_profile

添加如下,后面是路径

alias protoc="/Users/emm/others/protoc-3.12.4-osx-x86_64/bin/protoc"

刷新环境变量

source ./.bash_profile
第三步: 安装go专用的protoc的生成器
go get github.com/golang/protobuf/protoc-gen-go

安装后会在GOPATH目录下生成可执行文件,protobuf的编译器插件protoc-gen-go,等下执行protoc命令会自动调用这个插件

  1. 中间文件演示#
    4.1 编写中间文件#
    这里新建一个pbfiles文件夹用于存放protoc文件

Copy
// 这个就是protobuf的中间文件

// 指定的当前proto语法的版本,有2和3
syntax = "proto3";

// 指定等会文件生成出来的package
package service;

// 定义request
message ProductRequest{
int32 prod_id = 1; // 1代表顺序
}

// 定义response
message ProductResponse{
int32 prod_stock = 1; // 1代表顺序
}

4.2 运行protoc命令编译成go中间文件#
然后运行以下的命令来生成.go结尾的文件

下面的命令就是我们刚刚下的protoc包以及protoc-gen-go插件的作用
Copy

编译Product.proto之后输出到service文件夹

protoc --go_out=../service Product.proto
如下就在service文件夹自动生成了一个go文件,并且它提示我们不要去修改它

  1. 创建gRPC服务端#
    5.1 新建Product.protoc#
    这个protoc文件比上面的多出了一个service的定义和里面的一个方法的定义

Copy
// 这个就是protobuf的中间文件

// 指定的当前proto语法的版本,有2和3
syntax = "proto3";

// 指定等会文件生成出来的package
package service;

// 定义request model
message ProductRequest{
int32 prod_id = 1; // 1代表顺序
}

// 定义response model
message ProductResponse{
int32 prod_stock = 1; // 1代表顺序
}

// 定义服务主体
service ProdService{
// 定义方法
rpc GetProductStock(ProductRequest) returns(ProductResponse);
}
5.2 运行protoc命令#
注意

这里的protoc命令和之前的命令相比有点不一样
Copy
protoc --go_out=plugins=grpc:../service Product.proto
然后还是会在service文件夹下生成一个.go的文件

有两个比较需要注意的

RegisterProdServiceServer
后面需要在server中调用这个来注册

ProdServiceServer的接口定义
我们需要继承这个接口,即实现它所有的方法

5.3 实现RegisterProdServiceServer接口#