go-grpc-1-用proto文件生成go文件

protoc --go_out=./ --go-grpc_out=./  pm.proto
下载protobuf编译器 https://github.com/protocolbuffers/protobuf/releases在这里插入图片描述

下载后解压到喜欢的目录,然后将此目录的bin加入到环境变量,如这里是D:\xx\go\go1\bin\protoc\bin,则将D:\xx\go\go1\bin\protoc\bin添加到环境变量
在这里插入图片描述
protobuf编译器的作用是将 .proto 文件,转译成protobuf的原生数据结构


安装插件
go get github.com/golang/protobuf/protoc-gen-go

此时会在GOPATH的bin目录下生成可执行文件.protobuf的编译器插件protoc-gen-go
执行protoc命令时就会自动调用这个插件


test/product/product.proto

syntax="proto3"; // 指定proto版本

package services;
option go_package = "../services;services"; // 前一个services指生成的go文件的存放目录,不存在会创建;后一个services是go文件的包名

// 定义一个消息类型ProductRequest
message ProductRequest{
    int32 product_id = 1; // 定义字段product_id 是int32类型,标识号是1
}

message ProductRespones{
    int32 product_stock = 1;
}

创建文件夹test/services

protoc --go_out=../services product.proto # 根据product.proto文件生成go文件,放到../services目录

在这里插入图片描述
protobuf语法 https://blog.csdn.net/weixin_42366378/article/details/105722792


grpc服务

test/product/product.proto

syntax="proto3";

package services;
option go_package = "../services;services"; // 前一个services指生成的go文件的存放目录,不存在会创建;后一个services是go文件的包名

message ProductRequest{
    int32 product_id = 1;
}

message ProductRespones{
    int32 product_stock = 1;
}

// 定义服务ProductService
service ProductService{
    rpc GetProductStock(ProductRequest) returns (ProductRespones);
}

创建文件夹test/services

protoc --go_out=plugins=grpc:../services product.proto  # 生成go文件
go get -u google.golang.org/grpc

test/services/productService.go

/*
 * @description:
 */
package services

import (
	context "context"
)

type ProductService struct {
}

// 实现 product.pb.go中的接口ProductServiceServer
func (this *ProductService) GetProductStock(ctx context.Context, in *ProductRequest) (*ProductRespones, error) {
	return &ProductRespones{ProductStock: 20}, nil
}

test/server.go

/*
 * @description:
 */
package main

import (
	"net"
	"test/services"

	"google.golang.org/grpc"
)

func main() {
	rpcServer := grpc.NewServer()
	services.RegisterProductServiceServer(rpcServer, new(services.ProductService))
	lis, _ := net.Listen("tcp", ":8081")
	rpcServer.Serve(lis)
}

go run server.go
grpc客户端

把服务端生成的go文件复制到客户端来,把test/services/product.pb.go 复制到 grpccli/services/product.pb.go
grpccli/main.go

/*
 * @description:grpc客户端
 */
package main

import (
	"context"
	"fmt"
	"grpccli/services"
	"log"

	"google.golang.org/grpc"
)

func main() {
	conn, err := grpc.Dial(":8081", grpc.WithInsecure()) // 连接
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()

	productClient := services.NewProductServiceClient(conn)
	productRes, err := productClient.GetProductStock(context.Background(),
		&services.ProductRequest{ProductId: 1})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(productRes.ProductStock)
}

在这里插入图片描述


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值