什么是GRPC
官网:gRPC
gRPC 是一个现代开源高性能远程过程调用(RPC)框架,可以在任何环境中运行。 它可以有效地连接数据中心内和跨数据中心的服务,并提供对负载平衡、跟踪、健康检查和身份验证的可插入支持。 它还适用于分布式计算的最后一英里,将设备、移动应用程序和浏览器连接到后端服务。
简单来说:它是一种协议用来屏蔽分不分布式计算中的各种调用细节,使你可以像可以本地调用一样调用远程的函数
为什么要用GRPC
微服务架构带来服务与服务间存在的调用关系,而在服务与服务之间存在进程和进程,服务器和服务器之间的调用,使用GRPC协议能够不同的服务快速的连接,在性能上优于http协议
gRPC支持各种常见的开发语言,在大型项目的开发中,可以让各种语言像调用本地方法一样调用远程的函数,
gRPC传输协议(Protocol Buffers)
默认情况下,gRPC 使用 Protocol Buffers,这是 Google 成熟的开源机制,用于序列化结构化数据(尽管它可以与 JSON 等其他数据格式一起使用)。
即用Protocol Buffers将数据在不同的代码写的不同应用间共享
Protocol Buffers安装
官方github:
Releases · protocolbuffers/protobuf · GitHub
选择最新版本对应自己系统的压缩包解压:
我的电脑是win64所以下载win64压缩包
解压后将bin目录加入系统环境变量
命令行中输出version成功则安装成功
go安装gRPC
go get google.golang.org/grpc
上面这行代码安装的是protocol编译器,除了这个编译器我们还需要对应的代码生成工具
对于go来说是protoc-gen-go
注意 github上的protoc-gen-go为旧版本
安装google托管的新版本
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命令
实践
创建项目
安装
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
创建项目文件
相当于两个项目,客户端和服务端
假如没高亮取插件市场搜索proto插件下载
在hello.proto中添加
//声明使用proto3 语法
syntax = "proto3";
// 定义最后生成的go文件位于那个目录哪个包中,.代表在当前目录中生成,service代表了生成的go文件的包名为service.这个包名可以随意
option go_package = ".;service";
/*
需要定义一服务,在这个服务中需要有一个方法,这个方法可以接受客户端的参数,再返回服务端的响应.
其实可以很容易看出,我们定义了一个service,称为SayHello,这个服务有一个rpc方法,称为SayHello
这个方法会发送一个HelloRequest,然后返回一个HelloResponse.
*/
service SayHello {
rpc SayHello(HelloRequest) returns (HelloResponse){}
}
/*
message关键字,可以理解为go中的结构体
后面的"赋值",并不是赋值,而是定义这个变量在message中的位置
*/
message HelloRequest{
string requestName = 1;
int64 age = 2;
repeated string name =3;
}
message HelloResponse{
string responseMsg = 1;
}
在编写玩上述内容后
cd进server/proto下执行命令
protoc --go_out=. hello.proto
protoc --go-grpc_out=. hello.proto
可以获取
在服务端中
grpc是抽象对象将其注册到grpc server的内部中心
客户端中
发送rpc请求到服务端并输出响应结果
服务端方法编写
方法实现
因为文件中只有
这一个方法.让我们实现它
看下生成的文件,重写这个结构体
我们要在main函数中定义一结构体(这里为server)包含这个结构体,导入并取个pb的别名
接下来重写函数
把这个
复制到main中
然后开启服务
客户端编写
连接服务端并获取数据,在客户端的main.go中编写
测试结果
安全认证
此处的安全认证不是传统意义上的安全,而是客户端和服务端之间的通信要安全
也就是多个服务端和客户端都能知道自己的消息能够发给谁
推荐采用证书认证的方式来实现传输的安全性
生产环境可以购买证书或使用一些平台发行的免费证书
TLS协议解决的痛点
1.保密,用encyption实现加密,第三方无法窃取
2.完整性,mac地址通信,一旦窜改能发现
3.认证,双方都可以配备证书放置身份冒充
结语
grpc是为了在不同的服务器上像调用本地方法一样调用远程方法