GO 实现GPRC案例演示
GPRC的概述:
gRPC是Google的RPC框架,开源、高性能、跨语言,基于HTTP/2通讯协议和Protocol Buffer 3数据序列化协议
GPRC的地址:
gRPC官方主页:http://www.grpc.io/
gRPC github主页:https://github.com/grpc
GPRC的准备工作:
先安装Protobuf 编译器 protoc
下载地址:https://github.com/google/protobuf/releases
配置环境变量:
D:\tools\protoc-4.0.0-rc-2-win64\bin
获取插件支持
// gRPC运行时接口编解码支持库
go get -u github.com/golang/protobuf/proto
/ 从 Proto文件(gRPC接口描述文件) 生成 go文件 的编译器插件
go get -u github.com/golang/protobuf/protoc-gen-go
获取GO的GPRC包
go get google.golang.org/grpc
开始搭建demo
创建一个文件夹pdfiles,在创建文件Prod.proto
syntax = "proto3"; // 指定版本信息
package services;// 定义包名然后同目录下创建一个service包
//请求体参数
message ProdRequest{
int32 prod_id=1; //传id
}
//请求返回参数
message ProdResponse{
int32 prod_stock=1; //库存
}
命令行执行操作 (如果不能执行, 检查上面 protoc环境变量配置,或者重启一下 goland)
protoc --go_out=…/services Prod.proto
执行完成后会生成一个Prod.pb.go文件.
修改Prod.proto文件
syntax = "proto3"; // 指定版本信息
//package services;// 定义包名
option go_package =".;services";//要把package换option
//请求体参数
message ProdRequest{
int32 prod_id=1; //传id
}
//请求返回参数
message ProdResponse{
int32 prod_stock=1; //库存
}
//追加service服务
service ProdService{
rpc GetProdStock(ProdRequest)returns(ProdResponse);
}
继续生成文件 覆盖开始的service 生成文件
protoc --go_out=plugins=grpc:…/services Prod.proto
注意: 两次参数不一样
服务端构建
services 包下面创建ProdService.go实现接口GetProdStock
package services
import (
"context"
"google.golang.org/grpc"
)
//建立空结构体
type ProdService struct {
}
//实现接口GetProdStock
func (this *ProdService) GetProdStock(ctx context.Context, request *ProdRequest, opts ...grpc.CallOption) (*ProdResponse, error) {
return &ProdResponse{ProdStock: 20}, nil
}
创建启动服务 service.go 再根目录下
package main
import (
"fmt"
"google.golang.org/grpc"
"net"
"org.beijing.com/grpc/services"
)
func main() {
rpcServer := grpc.NewServer() //启动grpcServer 服务
services.RegisterProdServiceServer(rpcServer, new(services.ProdService)) //把服务注册进去
//内置net TCP监听 8080 端口
lis, _ := net.Listen("tcp", ":8081")
err := rpcServer.Serve(lis)//连接服务
if err != nil {
fmt.Print(err)
}
}
客户端构建
创建client.go
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"log"
"org.beijing.com/grpc/services"
)
func main() {
conn, err := grpc.Dial(":8081",grpc.WithInsecure())
//grpc.WithInsecure() http 验证问题
if err != nil {
log.Fatal(err)
}
defer conn.Close()
prodClient := services.NewProdServiceClient(conn)
prodRes, err := prodClient.GetProdStock(context.Background(),&services.ProdRequest{ProdId: 12})
if err != nil {
log.Fatal(err)
}
fmt.Print(prodRes.ProdStock)
}