Go语言grpc和protobuf


Posted in Golang onApril 13, 2022

1. 什么是grpc和protobuf

1.1 grpc

gRPC是一个高性能、开源和通用的RPC框架,面向移动和HTTP/2设计。

目前提供C、Java和Go语言版本,分别是:

grpc,grpc-java,grpc-go.其中C版本支持C,

C++,Node.js,Python,Ruby,Objective-C,PHP和C#支持.

grpc遵循HTTP/2协议,是一个二进制协议

grpc与http一样,底层都是tcp连接,遵循socket套接字

RPC是指远程过程调用,两台服务器A,B。A(客户端)调用B(服务端)上的方法,由于不在同一个内存空间,不能直接调用,需要通过网络调用。

Go语言grpc和protobuf

1.2 protobuf

Protocol Buffer是一种协议。
Protocol Buffer 其实 是 Google出品的一种轻量 & 高效的结构化数据存储格式,性能比Json、XML真的强2-100倍!

protobuf经历了protobuf2和protobuf3,pb3比pb2简化了很多,目前主流的版本是pb3

protobuf优点:

1.性能好:
压缩性能;
序列化和发序列化快,比Json、XML强2-100倍;
传输速度快。

2.便捷性好:
使用简单,自动生成序列化和反序列化代码;
维护成本低,只维护proto文件
向后兼容,不必破坏旧格式
加密性好

3.跨语言,跨平台,支持各种语言

protobuf缺点:

1.通用性差,json可以任何语言都支持,但是protobuf需要专门的解析库

2.自解释性差,只有通过proto文件才能了解数据结构

2.go下grpc

2.1官网下载protobuf工具

官网:https://github.com/protocolbuffers/protobuf/releases

Go语言grpc和protobuf

2.2 下载go的依赖包

go get github.com/golang/protobuf/protoc-gen-go

2.3 编写proto文件

option go_package = "./;proto";

解释:

./;:生成文件的路径

proto:生成文件的包名

hello.proto

syntax = "proto3";
package services;
option go_package = "./;proto";
service Greeter {
    rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest {
    string name = 1;
}
message HelloReply {
    string message = 1;
}

2.4 生成hello.pb.proto文件

cd到proto目录下
命令:protoc -I . hello.proto   --go_out=plugins=grpc:.
命令解释:
protoc -I .:在当前路径下寻找hello.proto文件
--go_out=plugins=grpc:.  :生成go语言的proto文件放在当前路径下

Go语言grpc和protobuf

2.5 编写server端代码

Go语言grpc和protobuf

package main
import (
	"context"
	"file_test/grpc_go/proto"
	"net"

	"google.golang.org/grpc"
)
type Server struct {}
// 业务逻辑
func (s *Server) SayHello(ctx context.Context, request *proto.HelloRequest) (*proto.HelloReply, error) {
	res := &proto.HelloReply{
		Message: "hello " + request.Name,
	}
	return res, nil
}
// 启动rpc的server服务
func start() {
	// 1.实例化server
	g := grpc.NewServer()
	// 2.注册逻辑到server中
	proto.RegisterGreeterServer(g,&Server{})
	// 3.启动server
	lis,err:=net.Listen("tcp","127.0.0.1:8081")
	if err !=nil{
		panic("监听错误:"+err.Error())
	}

	err = g.Serve(lis)
	if err !=nil{
		panic("启动错误:"+err.Error())
	}
}
func main() {
	start()
}

2.6 编写client端代码

package main
import (
	"context"
	"file_test/grpc_go/proto"
	"fmt"

	"google.golang.org/grpc"
)
// rpc调用
func clientRpc(body map[string]string) (res *proto.HelloReply, err error) {
	name := body["name"]
	conn, err := grpc.Dial("127.0.0.1:8081", grpc.WithInsecure())
	if err != nil {
		return nil,err
	}
	defer conn.Close()
	rpc := proto.NewGreeterClient(conn)
	response, err := rpc.SayHello(context.Background(), &proto.HelloRequest{Name: name})
	if err != nil {
		return nil,err
	}
	return response,nil
}
// 业务代码
func start() {
	body := make(map[string]string)
	body["name"] = "jeff"
	response,err := clientRpc(body)
	if err!=nil{
		fmt.Println("rpc调用失败:",err)
		return
	}
	fmt.Println(response.Message)
}
func main() {
	start()
}
//结果:
hello jeff

2.7 python和go相互调用实践(跨语言调用)

proto文件共用。

1.开启python的server端,go的client端测试。

2.开启go的server端,python的clinet端测试。

以上就是golang下grpc框架的使用编写示例的详细内容!

Golang 相关文章推荐
一文读懂go中semaphore(信号量)源码
Apr 03 Golang
go语言map与string的相互转换的实现
Apr 07 Golang
golang中实现给gif、png、jpeg图片添加文字水印
Apr 26 Golang
golang import自定义包方式
Apr 29 Golang
解决Golang中goroutine执行速度的问题
May 02 Golang
使用GO语言实现Mysql数据库CURD的简单示例
Aug 07 Golang
Go并发4种方法简明讲解
Apr 06 Golang
golang三种设计模式之简单工厂、方法工厂和抽象工厂
Apr 10 Golang
Go语言的协程上下文的几个方法和用法
Apr 11 Golang
golang生成并解析JSON
Apr 14 Golang
go goth封装第三方认证库示例详解
Aug 14 Golang
Golang流模式之grpc的四种数据流
Apr 13 #Golang
Golang数据类型和相互转换
Apr 12 #Golang
Go语言的协程上下文的几个方法和用法
Apr 11 #Golang
Golang 1.18 多模块Multi-Module工作区模式的新特性
Apr 11 #Golang
golang三种设计模式之简单工厂、方法工厂和抽象工厂
Golang原生rpc(rpc服务端源码解读)
Apr 07 #Golang
Go并发4种方法简明讲解
You might like
PHP 采集程序原理分析篇
2010/03/05 PHP
PHP curl实现抓取302跳转后页面的示例
2014/07/04 PHP
PHP中list()函数用法实例简析
2016/01/08 PHP
php cookie工作原理与实例详解
2016/07/18 PHP
thinkPHP多域名情况下使用memcache方式共享session数据的实现方法
2016/07/21 PHP
获取offsetTop和offsetLeft值的js代码(兼容)
2013/04/16 Javascript
JavaScript之数组(Array)详解
2015/04/01 Javascript
jquery实现用户信息修改验证输入方法汇总
2015/07/18 Javascript
js查看一个函数的执行时间实例代码
2015/09/12 Javascript
JQuery 设置checkbox值二次无效的解决方法
2016/07/22 Javascript
Nodejs高扩展性的模板引擎 functmpl简介
2017/02/13 NodeJs
Javascript实现倒计时时差效果
2017/05/18 Javascript
详解angularJS自定义指令间的相互交互
2017/07/05 Javascript
JS实现的简单表单验证功能示例
2017/10/13 Javascript
vue devtools的安装与使用教程
2018/08/08 Javascript
jQuery实现动态操作table行
2020/11/23 jQuery
11个Javascript小技巧帮你提升代码质量(小结)
2020/12/28 Javascript
Python实现3行代码解简单的一元一次方程
2014/08/18 Python
python实现颜色rgb和hex相互转换的函数
2015/03/19 Python
Python字符串转换成浮点数函数分享
2015/07/24 Python
Python虚拟环境virtualenv的安装与使用详解
2017/05/28 Python
Python机器学习之SVM支持向量机
2017/12/27 Python
python3中获取文件当前绝对路径的两种方法
2018/04/26 Python
python2与python3共存问题的解决方法
2018/09/18 Python
Python设计模式之迭代器模式原理与用法实例分析
2019/01/10 Python
详解Python循环作用域与闭包
2019/03/21 Python
python实现简单遗传算法
2020/09/18 Python
在HTML5 canvas里用卷积核进行图像处理的方法
2018/05/02 HTML / CSS
巴西最大的运动品牌:Olympikus
2020/07/14 全球购物
学校三节实施方案
2014/06/09 职场文书
优秀班主任先进事迹材料
2014/12/16 职场文书
导游词之黄帝陵景区
2019/09/16 职场文书
Python批量将csv文件转化成xml文件的实例
2021/05/10 Python
【DOTA2】半决赛强强对话~ PSG LGD vs EHOME - DPC 2022 CN REGIONAL FINALS WINTER
2022/04/02 DOTA
vue 把二维或多维数组转一维数组
2022/04/24 Vue.js
python 学习GCN图卷积神经网络
2022/05/11 Python