完整项目路径:cd /Users/squall/go/src/myproject/goGrpc_course
go语言实现 gRPC远程调用
HelloServer需求:
- 服务端:
创建一个服务,一个接口接收客户端传输过来的用户姓名
并且返回“Nice to meet you ” + 用户姓名 给客户端 - 客户端:
只需要调用接口传输姓名参数给服务端即可
protobuf定义
创建一个protobuf package,如:hello;
在工程目录下创建hello文件夹
里面创建 protobuf协议文件 hello.proto
syntax = "proto3";
package hello;
// The HelloServer service definition.
service Hello {
//远程调用接口
rpc SayHello (Request) returns (Reply) {}
}
// The request message containing the user's name.
message Request {
string name = 1;
}
// The response message containing the greetings
message Reply {
string msg = 1;
}
在当前文件下,编译 helloServer.proto文件
protoc --go_out=plugins=grpc:./ *.proto
得到 hello.pb.go文件
gRPC-Server
package main
import (
"fmt"
"net"
context "golang.org/x/net/context"
grpc "google.golang.org/grpc"
pb "./hello"
)
//1 实现接口
type HelloService struct {}
func (this *HelloService) SayHello(ctx context.Context ,request *pb.Request) (*pb.Reply , error) {
//接受客户端的调用,输出客户端的姓名并且返回一个结构体
fmt.Println("Get call , name is :",request.GetName())
var replyStr string = "Nice to meet you " + request.GetName()
return &pb.Reply{Msg:replyStr},nil
}
const (
Address = ":10080"
)
func main(){
//2 开启服务等待客户端连接和调用
service := HelloService{}
ln,err := net.Listen("tcp",Address)
if err !=nil{
fmt.Println("Error in listen :",err)
return
}
//函数返回的时候自动关闭服务
defer ln.Close()
//创建grpc的服务器
server := grpc.NewServer()
pb.RegisterHelloServer(server,&service)
if err!=nil{
fmt.Println("Error in register server :",err)
return
}
if err:=server.Serve(ln);err!=nil{
fmt.Println("Error in Serve:",err)
return
}
}
gRPC-Client
package main
import(
fmt "fmt"
context "golang.org/x/net/context"
grpc "google.golang.org/grpc"
pb "./hello"
)
func main(){
//1 建立连接
conn ,err := grpc.Dial("127.0.0.1:10080",grpc.WithInsecure())
if err!=nil{
fmt.Println("Error in dial:",err)
return
}
//2 调用rpc接口
client := pb.NewHelloClient(conn)
reply,err := client.SayHello(context.Background(),&pb.Request{ Name:"squall"})
fmt.Println("Get reply :",reply.GetMsg())
}
运行结果
先运行 server,在运行 client
得到以下输出结果
#服务端输出:
squall:04_grpc$ ./server
SayHello to squall
#客户端输出:
lsquall:04_grpc$ ./client
Nice to meet you squall