goland 实现grpc案例演示

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)

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值