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语言map与string的相互转换的实现
Apr 07 Golang
golang 实现对Map进行键值自定义排序
Apr 28 Golang
解决golang在import自己的包报错的问题
Apr 29 Golang
解决Golang中goroutine执行速度的问题
May 02 Golang
浅谈golang 中time.After释放的问题
May 05 Golang
Golang全局变量加锁的问题解决
May 08 Golang
Golang二维数组的使用方式
May 28 Golang
golang内置函数len的小技巧
Jul 25 Golang
深入理解go slice结构
Sep 15 Golang
Go语言实现一个简单的并发聊天室的项目实战
Mar 18 Golang
如何解决goland,idea全局搜索快捷键失效问题
Apr 03 Golang
Golang 实现WebSockets
Apr 24 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 zlib扩展实现页面GZIP压缩输出
2010/06/17 PHP
php读取文件内容的几种方法详解
2013/06/26 PHP
浅析PKI加密解密 OpenSSL
2013/07/01 PHP
以实例全面讲解PHP中多进程编程的相关函数的使用
2015/08/18 PHP
图片自动更新(说明)
2006/10/02 Javascript
js控制框架刷新
2008/08/01 Javascript
Javascript中的var_dump函数实现代码
2009/09/07 Javascript
getComputedStyle与currentStyle获取样式(style/class)
2013/03/19 Javascript
单击复制文字兼容各浏览器的完美解决方案
2013/07/04 Javascript
深入理解JS中的Function.prototype.bind()方法
2016/10/11 Javascript
JavaScript实现简单精致的图片左右无缝滚动效果
2017/03/16 Javascript
jQuery实现分页功能(含ajax请求、后台数据、附完整demo)
2017/04/03 jQuery
NodeJS实现图片上传代码(Express)
2017/06/30 NodeJs
关于jQuery里prev()的简单操作代码
2017/10/27 jQuery
JavaScript实现区块链
2018/03/14 Javascript
实例详解Vue项目使用eslint + prettier规范代码风格
2018/08/20 Javascript
使用React-Router实现前端路由鉴权的示例代码
2020/07/26 Javascript
Vue实现摇一摇功能(兼容ios13.3以上)
2021/01/26 Vue.js
深入理解python多进程编程
2016/06/12 Python
Python3.6正式版新特性预览
2016/12/15 Python
Python实现Linux中的du命令
2017/06/12 Python
20个常用Python运维库和模块
2018/02/12 Python
详解Python发送email的三种方式
2018/10/18 Python
ubuntu 18.04搭建python环境(pycharm+anaconda)
2019/06/14 Python
详解CSS3选择器的使用方法汇总
2015/11/24 HTML / CSS
平面设计的岗位职责
2013/11/08 职场文书
写自荐信三大法宝
2014/01/24 职场文书
学雷锋演讲稿
2014/03/04 职场文书
小学感恩教育活动总结
2014/07/07 职场文书
汉字听写大会观后感
2015/06/12 职场文书
超市店长竞聘书
2015/09/15 职场文书
提档介绍信范文
2015/10/22 职场文书
《金色的草地》教学反思
2016/02/17 职场文书
Python Pandas解析读写 CSV 文件
2022/04/11 Python
苹果可能正在打击不进行更新的 App
2022/04/24 数码科技
Nginx如何获取自定义请求header头和URL参数详解
2022/07/23 Servers