系列文章目录
第一章 grpc基本概念与安装
第二章 grpc入门示例
第三章 proto文件数据类型
第四章 多服务示例
第五章 多proto文件示例
第六章 服务器流式传输
第七章 客户端流式传输
第八章 双向流示例
一、前言
多服务,即一个rpc提供多个服务给外界调用。好比唤醒
服务,可以有语音唤醒
、人脸唤醒
、触摸唤醒
、人体唤醒
。以此为基础,做一个示例。
二、定义proto文件
这里定义2个服务,一个语音唤醒
服务,人脸唤醒
服务。语音唤醒
服务又包含各种各样的方法,比如狗叫
、坤叫
,狗会汪汪汪叫,猫会喵喵喵叫,坤会???,这里以狗叫
为例。人脸唤醒又包含各种各样的方法,比如一耳光
,一巴掌
,毕竟没几个人挨一巴掌还没醒的,这里以一巴掌
为例。
新建wake.proto
文件示例如下:
// 指定proto版本
syntax = "proto3";
package wake_grpc; // 指定默认包名
// 指定golang包名
option go_package = "/wake_proto";
//语音唤醒服务
service VoiceWakeService {
//狗叫
rpc DogBark(Request)returns(Response){}
}
//人脸唤醒服务
service FaceWakeService {
//一巴掌
rpc ASlap(Request)returns(Response){}
}
//请求参数
message Request{
string name = 1;
}
//响应参数
message Response{
string sound = 1;
}
在go_grpc_study/example_2/grpc_proto
目录下新建Terminal,执行生成文件,命令如下
protoc --go_out=. --go-grpc_out=. ./wake.proto
目录结构变更后为
三、编写server服务端
新建server
目录,新建main.go
文件
目录结构如下
编写server/main.go
文件
package main
import (
"context"
"fmt"
wake_grpc2 "go_grpc_study/example_2/grpc_proto/wake_proto"
"google.golang.org/grpc"
"google.golang.org/grpc/grpclog"
"net"
)
// 新版本 gRPC 要求必须嵌入 UnimplementedGreeterServer 结构体
type VoiceWakeServer struct {
wake_grpc2.UnimplementedVoiceWakeServiceServer
}
type FaceWakeServer struct {
wake_grpc2.UnimplementedFaceWakeServiceServer
}
func (VoiceWakeServer) DogBark(ctx context.Context, request *wake_grpc2.Request) (pd *wake_grpc2.Response, err error) {
fmt.Println("语音唤醒入参:", request.Name)
pd = new(wake_grpc2.Response)
pd.Sound = "汪汪汪~"
return
}
func (FaceWakeServer) ASlap(ctx context.Context, request *wake_grpc2.Request) (pd *wake_grpc2.Response, err error) {
fmt.Println("人脸唤醒入参:", request.Name)
pd = new(wake_grpc2.Response)
pd.Sound = "塞班~"
return
}
func main() {
// 监听端口
listen, err := net.Listen("tcp", ":8080")
if err != nil {
grpclog.Fatalf("Failed to listen: %v", err)
}
// 创建一个gRPC服务器实例。
s := grpc.NewServer()
// 将server结构体注册为gRPC服务。
wake_grpc2.RegisterVoiceWakeServiceServer(s, &VoiceWakeServer{})
wake_grpc2.RegisterFaceWakeServiceServer(s, &FaceWakeServer{})
fmt.Println("grpc server running :8080")
// 开始处理客户端请求。
err = s.Serve(listen)
}
具体步骤如下:
- 1)定义2个结构体,结构体名称无所谓,必须包含pb.UnimplementedGreeterServer 对象
- 2)实现 .proto文件中定义的API,
即DogBark狗叫方法
,ASlap一巴掌方法
- 3)将服务描述及其具体实现注册到
gRPC
中
四、编写Client客户端
新建client
目录,新建main.go
文件
目录结构如下
编写clinet/main.go
文件
package main
import (
"context"
"fmt"
wake_grpc2 "go_grpc_study/example_2/grpc_proto/wake_proto"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"log"
)
func main() {
addr := ":8080"
// 使用 grpc.Dial 创建一个到指定地址的 gRPC 连接。
// 此处使用不安全的证书来实现 SSL/TLS 连接
conn, err := grpc.Dial(addr, grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
log.Fatalf(fmt.Sprintf("grpc connect addr [%s] 连接失败 %s", addr, err))
}
defer conn.Close()
voiceClient := wake_grpc2.NewVoiceWakeServiceClient(conn)
res, err := voiceClient.DogBark(context.Background(), &wake_grpc2.Request{
Name: "张三",
})
fmt.Println(res, err)
faceClient := wake_grpc2.NewFaceWakeServiceClient(conn)
res, err = faceClient.ASlap(context.Background(), &wake_grpc2.Request{
Name: "李四",
})
fmt.Println(res, err)
}
具体步骤如下:
- 1)首先使用 grpc.Dial() 与 gRPC 服务器建立连接
- 2)使用
wake_grpc2.NewVoiceWakeServiceClient(conn)
、wake_grpc2.NewFaceWakeServiceClient(conn)
初始化客户端 - 3)通过客户端调用
ServiceAPI
方法voiceClient.DogBark
、faceClient.ASlap
五、测试
在server
目录下,启动服务端
go run main.go
在clinet
目录下,启动客户端
go run main.go
服务端运行结果
客户端运行结果
六、示例代码
完成ヾ(◍°∇°◍)ノ゙