下载通用编译器
地址:https://github.com/protocolbuffers/protobuf/releases
选择对应的版本,解压后将文件夹下bin目录配置到环境变量
安装go编译器
$ go install google.golang.org/protobuf/cmd/protoc-gen-go
$ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc
创建文件夹,创建两个项目
记得 go mod init 项目名
然后 go mod tidy
Demo.proto内容
// 这个就是protobuf的中间文件
// 指定的当前proto语法的版本,有2和3
syntax = \"proto3\";
// 输出路径
option go_package=\"../pdfile\";
// 定义request model
message GrpcDemoRequest{
int32 number1 = 1; // 1代表顺序
int32 number2 = 2;
}
// 定义response model
message GrpcDemoResponse{
int32 sum = 1; // 1代表顺序
}
// 定义服务主体
service ProdService{
// 定义方法
rpc GetSum(GrpcDemoRequest) returns(GrpcDemoResponse);
}
这里我们实现GetSum的功能是,传过来的GrpcDemoRequest结构体内 n1+n2 然后通过GrpcDemoResponse返回。
proto文件定义了方法和方法的参数,方法的内容要通过编译后的文件以接口的方式来实现
编译文件,终端进入到pdfile文件夹下,运行命令
protoc --go_out=. --go-grpc_out=. Demo.proto
会在pdfile下生成两个文件
生成后的go文件不要改动
如果导入包报红
鼠标悬浮点击Sync
Demo_grpc.pd.go
我们要实现的就是51 52 行的方法,下面红框是示例,到时候我们复制一下拿来用
在pdfile文件夹下创建Demo_imp.go
代码
package pdfile
import (
\"context\"
)
type DemoServiceServer struct {
}
func (d *DemoServiceServer) GetSum(ctx context.Context,req *GrpcDemoRequest) (*GrpcDemoResponse, error) {
resp := GrpcDemoResponse{
Sum: req.Number1+req.Number2,
}
return &resp,nil
}
func (d *DemoServiceServer) mustEmbedUnimplementedProdServiceServer() {}
服务注册
回到我们srv下的main文件
package main
import (
\"google.golang.org/grpc\"
\"net\"
\"srv/pdfile\"
)
func main() {
server := grpc.NewServer()
demoServer := &pdfile.DemoServiceServer{}
pdfile.RegisterProdServiceServer(
server,
demoServer,
)
listenin ,err := net.Listen(\"tcp\",\"0.0.0.0:8858\")
if err != nil {
panic(err)
}
_ = server.Serve(listenin)
}
客户端调用
将pdfile文件夹拷贝到cli文件夹下
修改cli main文件
package main
import (
\"cli/pdfile\"
\"context\"
\"fmt\"
\"google.golang.org/grpc\"
\"google.golang.org/grpc/credentials/insecure\"
\"log\"
)
func main() {
conn, err := grpc.Dial(\"127.0.0.1:8858\",grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
log.Fatal(err)
}
demoServiceClient := pdfile.NewProdServiceClient(conn)
// 直接像调用本地方法一样调用GetSum方法
resp, err := demoServiceClient.GetSum(context.Background(), &pdfile.GrpcDemoRequest{
Number1: 10,
Number2: 5,
})
if err != nil {
log.Fatal(\"调用gRPC方法错误: \", err)
}
fmt.Println(resp)
}
运行srv 然后运行 cli
完成
封装方便调用
新建文件
package grpc_conn
import (
\"cli/pdfile\"
\"google.golang.org/grpc\"
\"google.golang.org/grpc/credentials/insecure\"
\"log\"
)
var Grpc_conn pdfile.ProdServiceClient
func init() {
conn, err := grpc.Dial(\"127.0.0.1:8858\",grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
log.Fatal(err)
}
Grpc_conn = pdfile.NewProdServiceClient(conn)
}
新建测试模块
package test
import (
\"cli/grpc_conn\"
\"cli/pdfile\"
\"context\"
\"fmt\"
\"log\"
\"testing\"
)
func TestDemo1(t *testing.T) {
resp, err := grpc_conn.Grpc_conn.GetSum(context.Background(), &pdfile.GrpcDemoRequest{
Number1: 10,
Number2: 5,
})
if err != nil {
log.Fatal(\"调用gRPC方法错误: \", err)
}
fmt.Println(resp)
}
运行test
本文来自博客园,作者:树杉,转载请注明原文链接:https://www.cnblogs.com/xushushan/p/16520069.html
选择了程序员这条路,那就要学习一辈子
来源:https://www.cnblogs.com/xushushan/p/16520069.html
本站部分图文来源于网络,如有侵权请联系删除。