网络通畅
直接输出命令go get -u google.golang.org/grpc
即可。如果网路超时或者下载失败,可以尝试使用命令go env -w GO111MODULE=on
和go env -w GOPROXY=https://goproxy.cn,direct
打开模块和启用代理来进行下载。
网路不通畅
通过git clone
下载源码或者在gitee下载安装包到$GOPATH的src目录下,用go install 安装。具体如下
// 直接使用git clone将源代码下载到GOPATH的src目录下,使用go install安装
git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc
gRPC中文官方文档
http://doc.oschina.net/grpc?t=56831
gRPC例子
- 在文件夹
demo
目录下,分别创建myproto
和grpc
目录。 - 在
myproto
目录下创建myproto.proto
文件,文件内容。
syntax = "proto3";
option go_package = "./;myproto";
// 定义服务(需要使用grpc插件才可以定义service)
service Hello {
// 一个打招呼的服务
rpc SayHello(HelloReq) returns(HelloRsp) {}
// 一个说名字的服务
rpc SayName(NameReq) returns(NameRsp) {}
}
// 客户端发送给服务端
message HelloReq {
string name = 1;
}
// 服务端返回给客户端
message HelloRsp {
string msg = 1;
}
message NameReq {
string name = 1;
}
message NameRsp {
string msg = 1;
}
- 使用命令
protoc --go_out=plugins=grpc:./ *.proto
编译创建的myproto.proto
文件。 - 在
grpc
目录下创建server.go
,内容如下。
package main
import (
pd "demo/myproto"
"google.golang.org/grpc"
"net"
"fmt"
"context"
)
// 实现myproto.proto定义的服务接口(service)
type server struct {}
// 下面两个都是proto中定义的,可以从proto.pb.go中找到
func (s *server) SayHello(ctx context.Context, in *pd.HelloReq) (out *pd.HelloRsp, err error) {
return &pd.HelloRsp{Msg: "hello" + in.Name}, nil
}
func (s *server) SayName(ctx context.Context, in *pd.NameReq) (out *pd.NameRsp, err error) {
return &pd.NameRsp{Msg: in.Name + "早上好"}, nil
}
func main() {
conn, err := net.Listen("tcp", ":10086")
if err != nil {
fmt.Println("net error: ", err)
}
// 创建grpc服务
srv := grpc.NewServer()
// 注册服务
pd.RegisterHelloServer(srv, &server{})
fmt.Println("============>tcp server :10086 is ready...")
err = srv.Serve(conn)
if err != nil {
fmt.Println("server err: ", err)
}
}
- 在
grpc
目录下创建client.go
,内容如下。
package main
import (
"google.golang.org/grpc"
"fmt"
pd "day2/myproto"
"context"
)
func main() {
// 客户端链接服务器
conn, err := grpc.Dial("127.0.0.1:10086", grpc.WithInsecure())
if err != nil {
fmt.Println("conn err: ", err)
}
// 关闭链接
defer conn.Close()
// 获取grpc句柄
c := pd.NewHelloClient(conn)
// 通过句柄去调用函数, 使用默认的上下文
re, err := c.SayHello(context.Background(), &pd.HelloReq{Name: "大也"})
if err != nil {
fmt.Println("sayhello fail: ", err)
}
fmt.Println("sayhello success! get: ", re.Msg)
re2, err2 := c.SayName(context.Background(), &pd.NameReq{Name: "小也"})
if err2 != nil {
fmt.Println("sayname fail: ", err2)
}
fmt.Println("sayname success! get: ", re2.Msg)
}
- 回到
demo
目录下,依次执行go mod init demo
和go mod tidy
安装依赖包。再进入grpc
目录下分别执行server.go
和client.go