gRPC应用实战:(二)gRPC环境搭建以及简单demo
2.1 gRPC环境安装
2.1.1 golang环境安装
接下来的所有的教程以及代码都是golang代码进行演示,所以我们需要安装golang环境: 下载地址:golang 官网
安装完在你的命令行工具输入
就可以看到对应的下载版本
然后就可以了。
2.1.2 protoc 安装
在 gRPC 开发中,我们常常需要与 Protobuf 进行打交道,而在编写了.proto 文件后,我们会需要到一个编译器,就是protoc。这个工具呢可以在GitHub上直接下载
https://github.com/protocolbuffers/protobuf/releases
大家可以在这个网站自行下载安装(因为之前这里安装完了,也不想重装了,可能记得不太清了,你们直接试一试就好了,等下次重装再丰富这里) 一般操作是把protoc编译文件所在的目录配到环境变量里就好了 安装完后:
运行
protoc –version
就可以看见版本信息了
2.1.2 安装相关依赖包
安装 golang 的proto工具包
go get -u github.com/golang/protobuf/proto
安装 goalng 的proto编译支持
go get -u github.com/golang/protobuf/protoc-gen-go
安装 gRPC 包
go get -u google.golang.org/grpc
这样子就基本上结束对于环境的安装了
2.2 gRPC简单demo
2.2.1 protocol buffer 语法
在gRPC中主要以protocol buffer来定义api以及服务,所以我们需要先了解一下protocol buffer的语法。protocol
buffer主要使用中有两个版本:proto2和proto3,这里呢,推荐大家使用proto3进行日常开发。
首先:一切的学习都要学会看文档:这里是谷歌对于protocol buffer
proto3版本的的文档Language Guide (proto3)
当然你要是觉得英文看不过去的话,这里还有鸟窝大大转发的千念飞羽大大翻译的Protobuf3语言指南可以让大家学习。
接下来是一个最最最简单protocol buffer demo,可搭配注释食用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| syntax = "proto3";
package helloworld;
service Hello { rpc SayHello (HelloRequest) returns (HelloResp) {} }
message HelloRequest { string name = 1; }
message HelloResp { string message = 1; }
|
2.2.2 编译proto文件
在编译文件前,我们先搭建一个最简单的项目目录,用来具体演示相关操作:
client:gRPC客户端代码 pb:存放公共pb文件以及编译文件 server:gRPC服务端代码
接下来可以编译编写好的代码
通过下面的命令就可以直接生成对应语言的代码,具体代码可见:这里
1
| protoc --go_out=plugins=grpc:. *.proto
|
2.2.3 编写服务端代码
接下来便可以编写服务端代码(结合注释食用即可)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| import ( "context" pb "github.com/CodeFish-xiao/blogs/gRPCAction/code/grpc-2/pb" "google.golang.org/grpc" "log" "net" )
type HelloService struct {
}
func (s *HelloService) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResp, error) { log.Println(req.Name) return &pb.HelloResp{Message: "hello ,I'm codefish "}, nil } const (
Address string = ":8000"
Network string = "tcp" ) func main() {
listener, err := net.Listen(Network, Address) if err != nil { log.Panic("net.Listen err: %v", err) } log.Println(Address + " net.Listing...")
grpcServer := grpc.NewServer()
pb.RegisterHelloServer(grpcServer, &HelloService{})
err = grpcServer.Serve(listener) if err != nil { log.Panic("grpcServer.Serve err: %v", err) } }
|
运行客户端可见:
这就是运行成功了
2.2.4 编写客户端代码
接下来编写客户端代码:结合注释食用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| import ( "context" pb "github.com/CodeFish-xiao/blogs/gRPCAction/code/grpc-2/pb" "google.golang.org/grpc" "log" )
const (
ServerAddress string = ":8000" )
func main() {
conn, err := grpc.Dial(ServerAddress, grpc.WithInsecure()) if err != nil { log.Fatalf("net.Connect err: %v", err) } defer conn.Close()
grpcClient := pb.NewHelloClient(conn)
req := pb.HelloRequest{ Name: "grpc", }
res, err := grpcClient.SayHello(context.Background(), &req) if err != nil { log.Fatalf("Call SayHello err: %v", err) }
log.Println(res) }
|
运行后可见:
并且在server的控制台可以看到打印的参数:
总结
这样子便可以搭建一个简单的gRPC服务了,可以让客户端和服务端进行简单的业务交互了,当然这才刚刚开始。。。
本章代码可见codefish的github