grpc的粗浅理解与示例

接上一个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 进行请求就可以了

粗浅的理解,如果有什么不对的地方 请多多指教

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值