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语言使用select{}阻塞main函数介绍
Apr 25 Golang
go语言中切片与内存复制 memcpy 的实现操作
Apr 27 Golang
golang slice元素去重操作
Apr 30 Golang
Golang全局变量加锁的问题解决
May 08 Golang
再次探讨go实现无限 buffer 的 channel方法
Jun 13 Golang
Go Plugins插件的实现方式
Aug 07 Golang
深入理解go缓存库freecache的使用
Feb 15 Golang
详解Golang如何优雅的终止一个服务
Mar 21 Golang
Golang流模式之grpc的四种数据流
Apr 13 Golang
GO语言字符串处理函数之处理Strings包
Apr 14 Golang
Go语言编译原理之变量捕获
Aug 05 Golang
Go中使用gjson来操作JSON数据的实现
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获取linux服务器状态的代码
2014/05/27 PHP
PHP使用CURL_MULTI实现多线程采集的例子
2014/07/29 PHP
php数组查找函数总结
2014/11/18 PHP
thinkPHP学习笔记之安装配置篇
2015/03/05 PHP
PHP实现自动识别原编码并对字符串进行编码转换的方法
2016/07/13 PHP
遍历指定目录,并存储目录内所有文件属性信息的php代码
2016/10/28 PHP
PHP实用小技巧之调用录像的方法
2019/12/05 PHP
Javascript基础教程之if条件语句
2015/01/18 Javascript
js使用DOM设置单选按钮、复选框及下拉菜单的方法
2015/01/20 Javascript
javascript 动态样式添加的简单实现
2016/10/11 Javascript
PHP获取当前页面完整URL的方法
2016/12/02 Javascript
jQuery给表格添加分页效果
2017/03/02 Javascript
微信小程序使用toast消息对话框提示用户忘记输入用户名或密码功能【附源码下载】
2017/12/09 Javascript
学习Vue组件实例
2018/04/28 Javascript
layer弹出层父子页面事件相互调用方法
2018/08/17 Javascript
node实现生成带参数的小程序二维码并保存到本地功能示例
2018/12/05 Javascript
你不可不知的Vue.js列表渲染详解
2019/10/01 Javascript
一起来了解一下JavaScript的预编译(小结)
2021/03/01 Javascript
python2.6.6如何升级到python2.7.14
2018/04/08 Python
基于python3实现socket文件传输和校验
2018/07/28 Python
python 实现将list转成字符串,中间用空格隔开
2019/12/25 Python
深入理解css属性的选择对动画性能的影响
2016/04/20 HTML / CSS
英国工作场所设备购买网站:Slingsby
2019/05/03 全球购物
英国电信商店:BT Shop
2019/12/17 全球购物
大学生毕业自我鉴定范文
2013/09/19 职场文书
写自荐信有哪些不宜?
2013/10/17 职场文书
通信工程毕业生自荐信
2013/11/01 职场文书
员工工作表扬信范文
2014/01/13 职场文书
施工安全协议书范本
2014/09/26 职场文书
2015年世界急救日宣传活动方案
2015/05/06 职场文书
2015年医院后勤工作总结
2015/05/20 职场文书
解约证明模板
2015/06/19 职场文书
学习雷锋主题班会
2015/08/14 职场文书
基于nginx实现上游服务器动态自动上下线无需reload的实现方法
2021/03/31 Servers
解决Swagger2返回map复杂结构不能解析的问题
2021/07/02 Java/Android
JS前端轻量fabric.js系列之画布初始化
2022/08/05 Javascript