接上一个protobuf的下载安装 今天记录下grpc的自己写的一个小示例,网上找了很多,好像都比较老了,不过整理了一下 终于写出来一套
protofile目录下的product.proto文件
syntax = "proto3"; //指定proto版本
option go_package="../service";
package service ; //指定生成出来文件的package
//定义request model
message ProductRequest{
int32 prod_id = 1;
}
//定义response model
message ProductResponse{
int32 prod_socket = 1;
}
service ProdService{
rpc GetProdSocket(ProductRequest)returns(ProductResponse);
}
protofile目录下的 proto.bat
生成bp文件和grpc文件的命令
protoc --go_out=./ --go-grpc_out=./ .\product.proto
service目录下的文件
该目录下是生成的相对应的go代码文件
server目录下的main文件
服务端的文件,因为上面的命令为我们生成了go的rpc服务的接口,我们要在这个文件里实现该接口和将其实现注册到grpc的服务中
package main
import (
"context"
"google.golang.org/grpc"
"grpc/service"
"log"
"net"
)
//在grpc文件中 该结构体已经实现了接口,但其的实现不是我们想要的,
//所以我们新建了结构体 将他作为子类的感觉,然后重构其实现的方法
type productService struct {
*service.UnimplementedProdServiceServer
}
//新建的结构体
var ProductService = productService{}
//实现接口服务
func (p productService)GetProdSocket(context context.Context, request *service.ProductRequest) (*service.ProductResponse, error) {
i := new(service.ProductResponse)
i.ProdSocket =request.ProdId
return i,nil
}
func main() {
server:=grpc.NewServer() //创建grpc服务
service.RegisterProdServiceServer(server, ProductService) //将其实现注册到grpc服务中
listener, err := net.Listen("tcp", ":8002")
if err != nil {
log.Fatal("服务监听端口失败", err)
}
_ = server.Serve(listener)
}
client目录下的main文件
链接grpc服务,像本地一样调用方法,返回信息
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"grpc/service"
"log"
)
func main() {
// 1. 新建连接,端口是服务端开放的8002端口
//证书
dial, err := grpc.Dial(":8002", grpc.WithTransportCredentials(insecure.NewCredentials()))
if err!=nil{
log.Fatal("链接服务端失败")
}
defer dial.Close()
//调用Product.grpc.go中的NewProdServiceClient方法
client := service.NewProdServiceClient(dial)
//直接像调用本地方法一样调用GetProductStock方法
socket, err := client.GetProdSocket(context.Background(), &service.ProductRequest{ProdId: 123})
if err!=nil{
log.Fatal("调用服务端方法失败")
}
fmt.Println("数据返回",socket)
}
先打开服务端的mian服务,再打开个命令行窗口打开客户端的main 进行请求就可以了
粗浅的理解,如果有什么不对的地方 请多多指教