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语言-在mac下brew升级golang
Apr 25 Golang
Go语言中break label与goto label的区别
Apr 28 Golang
解决Go gorm踩过的坑
Apr 30 Golang
goland设置颜色和字体的操作
May 05 Golang
浅谈golang package中init方法的多处定义及运行顺序问题
May 06 Golang
golang 实现时间戳和时间的转化
May 07 Golang
go xorm框架的使用
May 22 Golang
浅谈Go语言多态的实现与interface使用
Jun 16 Golang
如何解决goland,idea全局搜索快捷键失效问题
Apr 03 Golang
Golang 字符串的常见操作
Apr 19 Golang
Golang获取List列表元素的四种方式
Apr 20 Golang
Go语言编译原理之变量捕获
Aug 05 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
根据key删除数组中指定的元素实现方法
2017/03/02 PHP
jQuery获取选中内容及设置元素属性的方法
2014/07/09 Javascript
[将免费进行到底]在Amazon的一年免费服务器上安装Node.JS, NPM和OurJS博客
2014/08/18 Javascript
基于jquery实现一个滚动的分步注册向导-附源码
2015/08/26 Javascript
Zero Clipboard实现浏览器复制到剪贴板的方法(多个复制按钮)
2016/03/24 Javascript
JS自定义混合Mixin函数示例
2016/11/26 Javascript
canvas实现粒子时钟效果
2017/02/06 Javascript
Vue form 表单提交+ajax异步请求+分页效果
2017/04/22 Javascript
vue.js开发环境搭建教程
2017/05/04 Javascript
vue.js响应式原理解析与实现
2020/06/22 Javascript
Javascript中parseInt的正确使用方式
2018/10/17 Javascript
vue移动端实现手机左右滑动入场动画
2020/06/17 Javascript
vue实现图片上传到后台
2020/06/29 Javascript
Python入门学习之字符串与比较运算符
2015/10/12 Python
Python随机生成手机号、数字的方法详解
2017/07/21 Python
Python 列表理解及使用方法
2017/10/27 Python
Python3实现将本地JSON大数据文件写入MySQL数据库的方法
2018/06/13 Python
python实现简单tftp(基于udp协议)
2018/07/30 Python
python 执行终端/控制台命令的例子
2019/07/12 Python
python+mysql实现个人论文管理系统
2019/10/25 Python
通过python连接Linux命令行代码实例
2020/02/18 Python
Python drop方法删除列之inplace参数实例
2020/06/27 Python
瑞典在互联网上最大的宠物商店:Animail
2020/10/31 全球购物
Burt’s Bees英国官网:世界领先的天然个人护理品牌
2020/08/17 全球购物
DBA数据库管理员JAVA程序员架构师必看
2016/02/07 面试题
Python如何定义一个函数
2015/09/01 面试题
编程用JAVA解析XML的方式
2013/07/07 面试题
大学生职业生涯规划书模板
2014/01/03 职场文书
致跳远、跳高运动员广播稿
2014/01/09 职场文书
竞选班干部演讲稿600字
2014/08/20 职场文书
项目技术负责人岗位职责
2015/04/13 职场文书
2015年质检工作总结
2015/05/04 职场文书
详解CSS开发过程中的20个快速提升技巧
2021/05/21 HTML / CSS
pytorch 实现变分自动编码器的操作
2021/05/24 Python
浅谈JavaScript作用域
2021/12/06 Javascript
WCG2010 星际争霸决赛 Flash vs Goojila 1 星际经典比赛回顾
2022/04/01 星际争霸