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语言中切片与内存复制 memcpy 的实现操作
Apr 27 Golang
golang 实现对Map进行键值自定义排序
Apr 28 Golang
基于Go Int转string几种方式性能测试
Apr 28 Golang
解决Golang time.Parse和time.Format的时区问题
Apr 29 Golang
对Golang中的FORM相关字段理解
May 02 Golang
Go timer如何调度
Jun 09 Golang
再次探讨go实现无限 buffer 的 channel方法
Jun 13 Golang
手把手教你导入Go语言第三方库
Aug 04 Golang
GO语言异常处理分析 err接口及defer延迟
Apr 14 Golang
Golang 并发编程 SingleFlight模式
Apr 26 Golang
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
Jun 14 Golang
Go结合Gin导出Mysql数据到Excel表格
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
php自定义加密与解密程序实例
2014/12/31 PHP
php结合安卓客户端实现查询交互实例
2015/05/05 PHP
PHPStrom中实用的功能和快捷键大全
2015/09/23 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
2020/01/23 PHP
经典海量jQuery插件 大家可以收藏一下
2010/02/07 Javascript
jquery下将选择的checkbox的id组成字符串的方法
2010/11/28 Javascript
兼容ie、firefox的图片自动缩放的css跟js代码分享
2013/08/12 Javascript
JS小功能(onmouseover实现选择月份)实例代码
2013/11/28 Javascript
js监听鼠标点击和键盘点击事件并自动跳转页面
2014/09/24 Javascript
JQuery入门基础小实例(1)
2015/09/17 Javascript
浅析JavaScript 调试方法和技巧
2015/10/22 Javascript
js仿微博动态栏功能
2017/02/22 Javascript
javascript 开发之百度地图使用到的js函数整理
2017/05/19 Javascript
JavaScript 自定义事件之我见
2017/09/25 Javascript
Vue框架之goods组件开发详解
2018/01/25 Javascript
Vue递归实现树形菜单方法实例
2018/11/06 Javascript
微信小程序实现搜索指定景点周边美食、酒店
2019/05/18 Javascript
vue之组件内监控$store中定义变量的变化详解
2019/11/08 Javascript
Vue组件化开发之通用型弹出框的实现
2020/02/28 Javascript
深入了解JavaScript词法作用域
2020/07/29 Javascript
js+cavans实现图片滑块验证
2020/09/29 Javascript
[55:16]Mski vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
python版简单工厂模式
2017/10/16 Python
Python实现的读写json文件功能示例
2018/06/05 Python
Pycharm更换python解释器的方法
2018/10/29 Python
python实现简单日期工具类
2019/04/24 Python
Python数据持久化存储实现方法分析
2019/12/21 Python
Python之Django自动实现html代码(下拉框,数据选择)
2020/03/13 Python
您的时尚,您的生活方式:DTLR Villa
2019/12/25 全球购物
个人现实表现材料
2014/02/04 职场文书
同学聚会主持词
2014/03/18 职场文书
关于保护环境的建议书
2014/08/26 职场文书
2014年入党积极分子学习三中全会思想汇报
2014/09/13 职场文书
公司证明怎么写
2014/09/22 职场文书
js前端图片加载异常兜底方案
2022/06/21 Javascript