初用 gRPC
前期准备
-
安装
protoc编译器
-
安装 protoc-gen-go
go get github.com/golang/protobuf/protoc-gen-go
-
安装 grpc
go get google.golang.org/grpc
protoc 解析 protobuffer文件; protoc-gen-go 是protobuffer go插件,作用是把 protobuffer文件生成对应的 go 代码
编写数据描述文件 protobuf
// path/filename : hello/hello.proto
syntax = "proto3";
option go_package = "../netrpc/hello;hello";// ;前半部是go代码生成的路径,后半部分是 包名
package hello;
message String {
string value = 1;
}
// 代码会根据 HelloService 生成 2个接口
// type HelloServiceServer interface {
// Hello(context.Context, *String) (*String, error)
// }
// type HelloServiceClient interface {
// Hello(context.Context, *String, ...grpc.CallOption) (*String, error)
// }
service HelloService {
rpc Hello (String) returns (String);
}
把 proto 文件生成代码
protoc --go_out=plugins=grpc:. hello.proto
会在当前文件夹生成 hello.pb.go 文件
-
protoc
命令必须 安装
protoc
解析器 -
--go_out
执行这个选项 必须安装
protoc-gen-go
编写服务端代码
package main
import (
"context"
"fmt"
"netrpc/hello" // netrpc 是我的模块名 上面生成的 hello.pb.go 文件存放在 hello 文件夹中
"google.golang.org/grpc"
"net"
)
// 实现 HelloServiceServer 接口;实现上面 proto文件里声明的 server
type HelloServiceImpl struct {}
func (p *HelloServiceImpl) Hello(
ctx context.Context, args *String,
) (*String, error) {
reply := &String{Value:"Hello : " + args.GetValue()}
return reply, nil
}
func main() {
// 构造一个 grpc 服务对象
grpcServer := grpc.NewServer()
// 服务注册
hellO.RegisterHelloServiceServer(grpcServer, new(HelloServiceImpl))
fmt.Println("start listen port 12345")
// 监听端口
lis , err := net.Listen("tcp", ":12345")
if err != nil {
fmt.Println("tcp : 12345 failed : ", err)
}
// 在监听的端口上 提供 gRPC 服务
grpcServer.Serve(lis)
}
客户端代码实现
package main
import (
"fmt"
"netrpc/hello" // netrpc 是我的模块名 上面生成的 hello.pb.go 文件存放在 hello 文件夹中
"golang.org/x/net/context"
"google.golang.org/grpc"
)
func main(){
fmt.Println("start dial localhost:12345")
conn, err := grpc.Dial("localhost:12345", grpc.WithInsecure())
if err != nil {
fmt.Println("grpc dial failed : ", err)
}
defer conn.Close()
client := hello.NewHelloServiceClient(conn)
// 往微服务上发送数据
reply, err := client.Hello(context.Background(), &String{Value:"hello"})
if err != nil {
fmt.Println("client failed : ", err)
}
// 打印接收到的信息
fmt.Println(reply.GetValue())
}
版权声明:本文为wanmei002原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。