参考文献:gRPC中文文档 http://doc.oschina.net/grpc?t=60133
一、环境安装
- protobuf 下载
https://github.com/protocolbuffers/protobuf/releases
下完之后配置环境变量即可 - 安装go需要的依赖
// grpc 包
go get -u google.golang.org/grpc
// 安装protoc转go的插件
go get google.golang.org/grpc/cmd/protoc-gen-go-grpc
// 安装 protoc-gen-go
go get github.com/golang/protobuf/protoc-gen-go
// Ps: 超时可以配置国内镜像
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn
二、编写proto文件
// 使用版本
syntax = 'proto3';
// 生成的包名
option go_package = './pdfile/service';
// 包名
package aaaaaaaaaa;
// 实体对象
message user {
string name = 1;
int32 age = 2;
// 生成的是指针
optional string password = 3;
// 生成的是切片
repeated string addr = 4;
}
message req {
message date{
string a = 1;
}
string status = 2;
}
service UserService{
rpc getUserInfo ( user ) returns ( req );
}
三、go 生成grpc
文件
// 生成在一个文件下
protoc --go_out=plugins=grpc:./ .\pdfile\user.proto
// 生成两个, 会有例子
protoc --go_out=./service --go-grpc_out=./service .\pdfile\user.proto
四、实现接口
package serviceImpl
import (
"context"
)
// 实例化对象
var UserService = &userService{}
type userService struct {
}
/**
接口定义
UserServiceServer is the server API for UserService service.
type UserServiceServer interface {
GetUserInfo(context.Context, *User) (*Req, error)
}
*/
/* 实现接口 */
func (p *userService) GetUserInfo(context context.Context, request *User) (*Req, error) {
return &Req{
Status: "调用成功。",
}, nil
}
五、服务端
package main
import (
"google.golang.org/grpc"
"log"
"net"
"test/pdfile/serviceImpl"
)
func main() {
rpcService := grpc.NewServer()
// 注册方法
serviceImpl.RegisterUserServiceServer(rpcService, serviceImpl.UserService)
// 启动服务
lesten, err := net.Listen("tcp", ":8005")
if err != nil {
log.Fatal("启动监听出错", err)
}
err = rpcService.Serve(lesten)
if err != nil {
log.Fatal("启动服务出错", err)
}
log.Fatalln("启动服务成功。")
}
六、客户端
package main
import (
"context"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"log"
"test/pdfile/serviceImpl"
)
/**
客户端
*/
func main() {
// 连接gRpc
conn, err := grpc.Dial(":8005", grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
log.Fatal("连接服务失败!")
}
// 退出时关闭
defer conn.Close()
// 得到客户端
userServiceClient := serviceImpl.NewUserServiceClient(conn)
// 调用方法
password := "123"
request := &serviceImpl.User{
Name: "chang",
Age: 10,
Password: &password,
Addr: nil,
}
req, err := userServiceClient.GetUserInfo(context.Background(), request)
if err != nil {
log.Fatal("调用接口失败》》》userServiceClient")
}
println(req.String())
}