安装grpc 参考 https://www.cnblogs.com/leisurelylicht/p/Go-an-zhuanggRPC.html
安装protobuf 参考 https://blog.csdn.net/u013457167/article/details/83864436
1. hello.proto文件
syntax = "proto3"; // 指定proto版本
package hello; // 指定默认包名
// 定义Hello服务
service Hello {
// 定义SayHello方法
rpc SayHello(HelloRequest) returns (HelloResponse) {}
}
// HelloRequest 请求结构
message HelloRequest {
string name = 1;
}
// HelloResponse 响应结构
message HelloResponse {
string message = 1;
}在当前文件下执行命令,生成hello.pd.go文件:
protoc --go_out=plugins=grpc:./ ./hello.protoshello.pd.go 文件的部分内容
// HelloServer is the server API for Hello service.
type HelloServer interface {
// 定义SayHello方法
SayHello(context.Context, *HelloRequest) (*HelloResponse, error)
}
// HelloClient is the client API for Hello service.
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type HelloClient interface {
// 定义SayHello方法
SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloResponse, error)
}
2. 编写服务端代码
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"google.golang.org/grpc/grpclog"
pd "hello/myproto"
"net"
)
const(
Address = "127.0.0.1:9999"
)
//定义结构体
type helloService struct{}
//结构体实现HelloServer接口中SayHello方法
func (h *helloService)SayHello(ctx context.Context, in *pd.HelloRequest)(*pd.HelloResponse, error) {
fmt.Println(in.Name, "请求服务")
res := new(pd.HelloResponse)
res.Message = "hello" + " " + in.Name
return res, nil
}
func main() {
var (
HelloService = helloService{}
listen net.Listener
err error
)
//建立tcp连接
if listen, err = net.Listen("tcp", Address); err != nil{
grpclog.Fatalln(err)
}
//实例化grpc server
s := grpc.NewServer()
//注册HelloService
pd.RegisterHelloServer(s, &HelloService)
//开启服务监听
s.Serve(listen)
}
3. 编写客户端代码
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"google.golang.org/grpc/grpclog"
pd "hello/myproto"
)
const (
Address = "127.0.0.1:9999"
)
func main() {
var(
conn *grpc.ClientConn
err error
res *pd.HelloResponse
)
//建立连接
//grpc.WithInsecure()忽略证书认证
if conn, err = grpc.Dial(Address, grpc.WithInsecure()); err != nil{
grpclog.Fatalln(err)
}
//初始化客户端
c := pd.NewHelloClient(conn)
//实例化HelloRequest
req := pd.HelloRequest{Name:"zhe"}
//调用HelloClient接口中SayHello方法
if res, err = c.SayHello(context.Background(), &req); err !=nil{
grpclog.Error(err)
}
fmt.Print(res.Message)
}