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 相关文章推荐
Golang二维切片初始化的实现
Apr 08 Golang
浅谈Golang 嵌套 interface 的赋值问题
Apr 29 Golang
golang goroutine顺序输出方式
Apr 29 Golang
解决Golang中goroutine执行速度的问题
May 02 Golang
Golang实现AES对称加密的过程详解
May 20 Golang
Go遍历struct,map,slice的实现
Jun 13 Golang
Golang表示枚举类型的详细讲解
Sep 04 Golang
详解Golang如何优雅的终止一个服务
Mar 21 Golang
Go语言grpc和protobuf
Apr 13 Golang
golang操作redis的客户端包有多个比如redigo、go-redis
Apr 14 Golang
Golang 遍历二叉树
Apr 19 Golang
Go gRPC进阶教程gRPC转换HTTP
Jun 16 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
Javascript继承机制的设计思想分享
2011/08/28 Javascript
extjs3 combobox取value和text案例详解
2013/02/06 Javascript
jquery获取复选框被选中的值
2014/03/22 Javascript
使用ajaxfileupload.js实现ajax上传文件php版
2014/06/26 Javascript
javascript简单实现图片预加载
2014/12/03 Javascript
js实现表单多按钮提交action的处理方法
2015/10/24 Javascript
在AngularJS框架中处理数据建模的方式解析
2016/03/05 Javascript
深入理解JavaScript单体内置对象
2016/06/06 Javascript
判断数组的最佳方法(推荐)
2016/10/11 Javascript
JS一个简单的注册页面实例
2017/09/05 Javascript
JavaScript中正则表达式使数字、中文或指定字符高亮显示
2017/10/31 Javascript
javascript关于“时间”的一次探索
2019/07/24 Javascript
nodejs dgram模块广播+组播的实现示例
2019/11/04 NodeJs
在vue中实现禁止屏幕滚动,禁止屏幕滑动
2020/07/22 Javascript
详解JavaScript类型判断的四种方法
2020/10/21 Javascript
[00:59]DOTA2背景故事第二期之四大基本法则
2020/07/07 DOTA
替换python字典中的key值方法
2018/07/06 Python
TensorFlow Session使用的两种方法小结
2018/07/30 Python
python实现ID3决策树算法
2018/08/29 Python
基于python指定包的安装路径方法
2018/10/27 Python
对Python3之进程池与回调函数的实例详解
2019/01/22 Python
Python实现点阵字体读取与转换的方法
2019/01/29 Python
python3转换code128条形码的方法
2019/04/17 Python
Python with用法:自动关闭文件进程
2019/07/10 Python
django admin 自定义替换change页面模板的方法
2019/08/23 Python
PyTorch实现AlexNet示例
2020/01/14 Python
用python-webdriver实现自动填表的示例代码
2021/01/13 Python
贝玲妃美国官方网站:Benefit美国
2016/08/28 全球购物
俄罗斯在线服装店:STOLNIK
2021/03/07 全球购物
super()与this()的区别
2016/01/17 面试题
简历的自荐信
2013/12/19 职场文书
新闻专业毕业生英文求职信
2014/03/19 职场文书
建筑工地大门标语
2014/06/18 职场文书
起诉离婚协议书样本
2014/11/25 职场文书
pytorch 如何使用float64训练
2021/05/24 Python
选购到合适的激光打印机
2022/04/21 数码科技