这一次我们用gRPC实现获取用户的信息
grpc的安装直接go get
即可
go get google.golang.org/grpc
下载proto,我是下载这个的。
然后解压出来把bin目录放在直接放在系统变量当中
我们在终端
go get github.com/golang/protobuf
如果你像我一样go get不下来的话,可以直接git clone 源码
protoc-gen-go
文件夹中,在此文件夹下打开cmd
执行
go build
proto
的文件夹下
打开cmd 输入 protoc
proto
文件夹和client.go
、server.go
文件在proto下创建一个user.proto
注意proto语法:
先定下版本号:
syntax = "proto3";
然后是输出路径
option go_package = "./";
定义客户端请求格式
message UserRequest{
// 定义请求参数
string name = 1;
}
指定生成的包名称
package proto;
定义服务端响应格式
message UserResponse{
// 定义响应参数
int32 id = 1;
string name = 2;
int32 age = 3;
// 字段修饰符
// repeated 表示可变数组,类似于切片类型
repeated string hobby = 4;
}
定义服务接口
service UserInfoService{
// 接口内的方法
// 定义请求参数为UserRequest,响应参数为UserResponse
rpc GetUserInfo (UserRequest) returns (UserResponse){
}
}
然后执行
protoc --go_out=plugins=grpc:. user.proto
pb.go
文件type UserInfoService struct {
}
var u = UserInfoService{}
func (service *UserInfoService)GetUserInfo(ctx context.Context,req *pb.UserRequest)(resp *pb.UserResponse,err error) {
name := req.Name
// 在数据库查询用户信息
if name == "zs" {
resp = &pb.UserResponse{
Id: 1,
Name: name,
Age: 19,
// 切片字段
Hobby :[]string{"FanOne","FanOneTwo"},
}
}
err = nil
return
}
// 1. 监听
address := "127.0.0.1:8080"
lis, err := net.Listen("tcp", address)
if err != nil {
fmt.Println("监听异常 ",err)
return
}
fmt.Println("监听成功")
s := grpc.NewServer()
// 第一个类型是服务,第二个类型是接口的变量
pb.RegisterUserInfoServiceServer(s,&u)
_ = s.Serve(lis)
conn, err := grpc.Dial("127.0.0.1:8080", grpc.WithInsecure())
if err != nil {
fmt.Println("连接异常",err)
}
defer conn.Close()
client := pb.NewUserInfoServiceClient(conn)
req := new(pb.UserRequest)
req.Name="zs"
resp ,err := client.GetUserInfo(context.Background(),req)
if err != nil {
fmt.Println("响应异常",err)
}
fmt.Println("响应结果",resp)
然后就可以获取到服务端信息了。
注意一点:
rpc的调用是一台机子的内存调用另一台自己的内存,所以我们要传指针的形式。
联系客服