Golang微服务-protobuf

server/2024/12/28 6:57:18/

image-20241225105554450

protobuf

gRPC是一款语言中立、平台中立、开源的远程过程调用系统,gRPC客户端和服务端可以在多种环境中运行和交互,例如用java写一个服务端,可以用go语言写客户端调用

数据在进行网络传输的时候,需要进行序列化,序列化协议有很多种,比如xml, json,protobuf等

gRPC默认使用protocol buffers,google开源的一套成熟的结构数据序列化机制。

  • 序列化:将数据结构或对象转换成二进制串的过程。

  • 反序列化:将在序列化过程中所产生的二进制串转换成数据结构或对象的过程

protobuf是谷歌开源的一种数据格式,适合高性能,对响应速度有要求的数据传输场景。因为profobuf是二进制数据格式,需要编码和解码。数据本身不具有可读性。因此只能反序列化之后得到真正可读的数据。

  1. 序列化后体积相比Json和XML很小,适合网络传输
  2. 支持跨平台多语言
  3. 消息格式升级和兼容性还不错
  4. 序列化反序列化速度很快
安装
  1. 安装protobuf编译器

    brew install protobuf
  2. 安装go专用的proto生成器

    # 安装后会在gopath目录下生成可执行文件,编译器插件proptoc-gen-go,执行protoc命令会自动调用这个插件
    go install  github.com/golang/protobuf/protoc-gen-go@latest
基本使用
  • protobuf定义了一种源文件,扩展名是.proto,使用这种源文件可以定义存贮类的内容(消息类型)
  • protobuf有自己的编译protoc,可以将.proto编译成对应的语言文件,然后进行使用
  1. .proto文件

    // 指定proto的语法版本,有2和3版本
    // 结尾必须要;
    syntax = "proto3";// 表示生成的go文件的存放地址,会自动生成目录
    // 语法一:option go_package = "path;name"; path是目录,name表示生成的go文件所属的包名
    // 语法二: 只写path
    // 生成的go文件的存放地址,会自动生成目录
    option go_package = "./service";// 文件生成出来的package
    package service;// 消息:传输的对象
    message User{// 每个字段后面的数字是其唯一的标识符,不是value,是一个正整数,并且在同一个消息类型中不能重复string user = 1;int32 age = 2;
    }
  2. 命令行执行

    # --go_out=./表示文件要生成的目录,但是文件里配置了go_package,优先级比命令行高
    protoc --go_out=./  test.proto
  3. 生成 test.pb.go源文件,该文件不要进行修改,但是依赖的包需要下载

  4. 序列化和反序列号-在main.go中

    package mainimport ("fmt""goRpc/service""google.golang.org/protobuf/proto"
    )func main() {user := &service.User{User: "lll",Age:  20,}// 序列化:将go代码序列化为二进制串marshal, err := proto.Marshal(user)if err != nil {panic(err)}// 反序列化:将二进制串反序列号为go代码newUser := &service.User{}err = proto.Unmarshal(marshal, newUser)if err != nil {panic(err)}fmt.Println(newUser.String())}
proto文件介绍
  1. message

    message:protobuf中定义的消息关键字,消息就是徐涛传输的数据格式的定义,类似于go中的struct

    数据分别对应于每一个字段,每个字段都有一个名字和类型,字段规则如下:

    • required:消息体中必填字段,不设置会导致编解码异常
    • optional: 消息体中可选字段
    • repeated: 消息体中可重复字段,重复的值的顺序会被保留,在go中重复的会被定义为切片
    • 标识号:在消息体的定义中,每个字段都必须要有一个唯一的标识号,标识号是[0,2^29-1]范围内的一个整数
    message User{// 不声明默认是required规则string user = 1;  // 标识号1,并不是具体的valueint32 age = 2; // 标识号2 // 可选字段optional string  tips = 3;// 可重复字段repeated string ext = 4;
    }
  2. 类型映射

    image-20241225141931449

  3. 默认值

    protobuf2 中使用default来设置字段默认值,protobuf3为各类型定义的默认值

    image-20241225142030467

消息嵌套
  1. 一个proto文件中可以定义多个消息类型,并不只是一个

    message User{string user = 1;int32 age = 2;
    }message Category{string id = 1;string info = 2;
    }
  2. 可以在其他消息类型中定义、使用消息类型

    // 消息:传输的对象
    message User{string user = 1;int32 age = 2;// 嵌套message Category{string id = 1;repeated string info = 2;}
    }message Test{// 在消息的父消息类型的外部重用这个消息类型User.Category id = 1;
    }
定义服务

如果想要将消息类型用在RPC系统中,可以在.proto文件中定义一个RPC服务接口,protocol buffer 编译器将会根据所选择的不同语言生成服务接口代码及存根

// 定义了一个RPC服务,Search方法,该方法接收SearchRequest返回SearchResponse
service SearchService {//rpc 自定义的方法名字 (要传入的参数结构)返回(要返回的参数结构),参数使用message定义rpc Search (SearchRequest) returns (SearchResponse);
}

http://www.ppmy.cn/server/153837.html

相关文章

数据可视化软件配置

文章目录 数据可视化软件配置一、虚拟环境配置1.进入官网2.点击download注意:选择安装位置的时候要记一下,后面会用到 3.安装包一键下一步就可以了,没有必要在这里添加环境变量,如果想安装得细致一些可以翻译每个步骤的英文提示4.…

MFC扩展库BCGControlBar Pro v36.0 - 可视化管理器等全新升级

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中,并为您节省数百个开发和调试时间。 BCGControlBar专业版 v36.0已全新发布了,这个版本改进网格控件的性能、增强工具栏编辑器功能等&am…

从 GitLab.com 到 JihuLab.com 的迁移指南

本文分享从 GitLab.com 到 JihuLab.com 的迁移指南。 近期,GitLab Inc. 针对其 SaaS 产品做了限制,如果被判定为国内用户,则会建议使用其在国内的发布版本极狐GitLab。从 GitLab SaaS 产品(GitLab.com)迁移到极狐GitL…

中犇科技数字化智能中台系统login存在sql注入漏洞

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…

Ubuntu 系统下安装 Nginx

目录 一、Nginx是什么 ?二、Ubuntu 系统下安装 Nginx 1、安装包下载 2、上传服务器并解压缩 3、依赖配置安装 4、生成编译脚本 ?5、编译 6、开始安装 7、设置为随机自启动 7.1、创建 nginx.service 文件,将以下内容粘贴到文件中 7.2、将 nginx.service…

Debian 12.0安装nginx

在 Debian 12.0 上安装 Nginx 是一个相对简单的过程,可以通过包管理工具 apt 完成。以下是安装和配置 Nginx 的详细步骤: 更新包列表 首先,确保你的系统包列表是最新的。打开终端并运行以下命令: sudo apt update安装 Nginx 安…

vue和uniapp中,点击按钮 传递当前item对象,并从selectData数组中删除该条item数据

在 Vue 中,可以通过点击按钮传递 item 对象,并从 selectData 数组中删除该条数据。可以使用 Array.prototype.filter() 方法来实现这一点。以下是一个示例: 说明 数据结构:selectData 是一个包含多个对象的数组,每个对象都有 id 和 name 属性。渲染列表:使用 v-for 指令…

LeetCode 时间复杂度和空间复杂度粗略计算

#创作灵感# 刷LeetCode时需要关注的两点:时间复杂度和空间复杂度。 时间复杂度:程序的运行时消耗的时间 时间复杂度是一个函数,他定性描述了算法的运行时间。 《算法导论》给出的解释是: O用来表示上界,当用他作为…