ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[grpc快速入门] 一 grpc生成与调用

2022-07-26 12:32:46  阅读:203  来源: 互联网

标签:调用 入门 err grpc pdfile google go conn


下载通用编译器

image
地址:https://github.com/protocolbuffers/protobuf/releases
选择对应的版本,解压后将文件夹下bin目录配置到环境变量

安装go编译器

$ go install google.golang.org/protobuf/cmd/protoc-gen-go
$ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc

创建文件夹,创建两个项目
image
记得 go mod init 项目名
然后 go mod tidy

Demo.proto内容

// 这个就是protobuf的中间文件

// 指定的当前proto语法的版本,有2和3
syntax = "proto3";
//  输出路径
option go_package="../pdfile";


// 定义request model
message GrpcDemoRequest{
  int32 number1 = 1; // 1代表顺序
  int32 number2 = 2;
}

// 定义response model
message GrpcDemoResponse{
  int32 sum = 1; // 1代表顺序
}

// 定义服务主体
service ProdService{
  // 定义方法
  rpc GetSum(GrpcDemoRequest) returns(GrpcDemoResponse);

}

这里我们实现GetSum的功能是,传过来的GrpcDemoRequest结构体内 n1+n2 然后通过GrpcDemoResponse返回。
proto文件定义了方法和方法的参数,方法的内容要通过编译后的文件以接口的方式来实现

编译文件,终端进入到pdfile文件夹下,运行命令

protoc --go_out=. --go-grpc_out=. Demo.proto

会在pdfile下生成两个文件
image
生成后的go文件不要改动

如果导入包报红
image
鼠标悬浮点击Sync

Demo_grpc.pd.go
我们要实现的就是51 52 行的方法,下面红框是示例,到时候我们复制一下拿来用
image

在pdfile文件夹下创建Demo_imp.go

image

代码

package pdfile

import (
	"context"
)

type DemoServiceServer struct {
}

func (d *DemoServiceServer) GetSum(ctx context.Context,req *GrpcDemoRequest) (*GrpcDemoResponse, error) {
	resp := GrpcDemoResponse{
		Sum:                  req.Number1+req.Number2,
	}

	return &resp,nil
}

func (d *DemoServiceServer) mustEmbedUnimplementedProdServiceServer() {}

服务注册
回到我们srv下的main文件

package main

import (
	"google.golang.org/grpc"
	"net"
	"srv/pdfile"
)

func main() {


	server := grpc.NewServer()
	demoServer := &pdfile.DemoServiceServer{}
	pdfile.RegisterProdServiceServer(
		server,
		demoServer,
	)

	listenin ,err := net.Listen("tcp","0.0.0.0:8858")
	if err != nil {
		panic(err)
	}
	_ = server.Serve(listenin)
}

客户端调用

将pdfile文件夹拷贝到cli文件夹下

image

修改cli main文件

package main

import (
	"cli/pdfile"
	"context"
	"fmt"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
	"log"
)

func main() {
	conn, err := grpc.Dial("127.0.0.1:8858",grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		log.Fatal(err)
	}

	demoServiceClient := pdfile.NewProdServiceClient(conn)

	// 直接像调用本地方法一样调用GetSum方法
	resp, err := demoServiceClient.GetSum(context.Background(), &pdfile.GrpcDemoRequest{
		Number1:              10,
		Number2:              5,
	})
	if err != nil {
		log.Fatal("调用gRPC方法错误: ", err)
	}
	fmt.Println(resp)
}

运行srv 然后运行 cli
image
完成

封装方便调用
新建文件
image

package grpc_conn

import (
	"cli/pdfile"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
	"log"
)

var Grpc_conn pdfile.ProdServiceClient

func init() {
	conn, err := grpc.Dial("127.0.0.1:8858",grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		log.Fatal(err)
	}
	Grpc_conn = pdfile.NewProdServiceClient(conn)
}

新建测试模块
image

package test

import (
	"cli/grpc_conn"
	"cli/pdfile"
	"context"
	"fmt"
	"log"
	"testing"
)

func TestDemo1(t *testing.T) {
	resp, err := grpc_conn.Grpc_conn.GetSum(context.Background(), &pdfile.GrpcDemoRequest{
		Number1:              10,
		Number2:              5,
	})
	if err != nil {
		log.Fatal("调用gRPC方法错误: ", err)
	}
	fmt.Println(resp)
}

运行test
image

标签:调用,入门,err,grpc,pdfile,google,go,conn
来源: https://www.cnblogs.com/xushushan/p/16520069.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有