Go微服务: 基于ProtoBuf实现序列化和反序列化

Golang gRPC+Protobuf:高效序列化的秘密 在当今的软件开发中,不同服务之间的通信至关重要。我们的目的就是要探索一种高效的服务间通信和数据序列化方案。本文的范围涵盖了Golang语言下gRPC和Protobuf的基本概念、工作原理、实际应用等方面,帮助读者全面了解如何利用它们实现高效的序列化。本文首先会介绍gRPC和Protobuf的核心概念,让大家对它们有一个初步的认识;接着详细讲解它们的工作原理和架构,包括算法原理、数学模型等;然后通过项目实战,展示如何在实际代码中运用;再探讨它们的实际应用场景; 阅读详情

概述

  • 关于 protoBuf 参考:
  • 电脑本机安装:https://github.com/protocolbuffers/protobuf
    • 选择合适的版本
    • 安装后注意检查环境变量
  • 安装后,查看版本
    • $ protoc --version
  • 本机安装 protobuf的件protoc-gen-go插件和protoc-gen-go-grpc插件
    • 这个插件把 protobuf 文件转化为 go 文件
    • $ go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
    • $ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
  • 目前这个 protoc-gen-go 插件包安装可能会有问题,跟随我的步骤来解决
    • 这个包按照上述命令安装后,不在 $GOPATH/bin, 则进行检查 go env 中的 GOBIN
    • 查看 $ go env,看下 GOBIN 是否为 “”, 如果如此,则进行设置,类似
    • $ go env -w GOBIN=/Users/xxx/gopath/bin
    • 再次执行上述安装 protoc-gen-go 的命令
    • 再次检查 gopath/bin 目录中,发现出现了这个二进制文件,执行 $ protoc-gen-go 正常运行
  • 同样,protoc-gen-go-grpc插件亦如此检查

测试运行

  • 在上述环境准备好之后,可以进行测试了

  • 我们在当前项目中写一个proto文件叫做 test.proto

    syntax = "proto3";
    option go_package = "./protoService";
    message UserInfo {
        string name = 1;
        int32 age = 2;
        repeated string hobby = 3;
        PhoneType phone = 4;
    }
    
    // enum为关键字,作用为定义一种枚举类型
    enum PhoneType {
        MOBILE = 0;
        HOME = 1;
        WORK = 2;
    }
    
  • 之后执行 $ protoc --go_out=. *.proto

  • 这时候可以看到在当前目录下生成 proto 目录,进入里面,生成一个 test.pb.go 文件

  • 类似的,再次创建一个 greeter.proto 文件,用于生成 grpc 文件

    syntax = "proto3";  
    
    package greeter;  
    
    option go_package = "./protoService";
    
    // The greeting service definition.  
    service Greeter {  
        // Sends a greeting  
        rpc SayHello (HelloRequest) returns (HelloReply) {}  
    }  
    
    // The request message containing the user's name.  
    message HelloRequest {  
        string name = 1;  
    }  
    
    // The response message containing the greetings.  
    message HelloReply {  
        string message = 1;  
    }
    
  • 接着执行 $ protoc --go-grpc_out=. *.proto,就会生成 proto/greeter_grpc.pb.go 文件

    • 注意,这个命令生成的不全,参考下一篇文章有全面的生成命令
  • 注意,gRPC 服务需要使用 service 关键字定义,并且至少包含一个 RPC 方法

  • 如果 .proto 文件没有定义服务或者定义不正确,protoc 将不会生成 gRPC 代码

序列化和反序列化

  • 创建一个项目,比如 demo 目录,执行 $ go mod init demo

  • 利用上述 test.proto 生成的包来测试,复制 protoService 包进入项目

  • 安装项目依赖 $ go get google.golang.org/protobuf/proto

  • 新建 main.go

    package main
    
    import (
        "fmt"
        "demo/protoService"
        "google.golang.org/protobuf/proto"
    )
    
    func main() {
        u := &protoService.UserInfo{
            Name: "zhangsan",
            Age: 20,
            Hobby: []string{"吃饭", "睡觉", "写代码"},
        }
        fmt.Println(u.GetHobby())
        // proto.Marshald对protoBufer进行序列化
        data, err1 := proto.Marshal(u)
            if err1 != nil {
            fmt.Println(err1)
        }
        fmt.Println(data)
        // proto.Unmarshal可以对protoBufer进行反序列化
        info := protoService.UserInfo{}
        err2 := proto.Unmarshal(data, &info)
        if err2 != nil {
            fmt.Println(err2)
        }
        fmt.Printf("%#v", info)
        fmt.Println(info.GetHobby())
    }
    
  • 验证 $ go run main.go, 查看输出

    [吃饭 睡觉 写代码]
    [10 8 122 104 97 110 103 115 97 110 16 20 26 6 229 144 131 233 165 173 26 6 231 157 161 232 167 137 26 9 229 134 153 228 187 163 231 160 129]
    protoService.UserInfo{state:impl.MessageState{NoUnkeyedLiterals:pragma.NoUnkeyedLiterals{}, DoNotCompare:pragma.DoNotCompare{}, DoNotCopy:pragma.DoNotCopy{}, atomicMessageInfo:(*impl.MessageInfo)(0xc00011e000)}, sizeCache:0, unknownFields:[]uint8(nil), Name:"zhangsan", Age:20, Hobby:[]string{"吃饭", "睡觉", "写代码"}, Phone:0}[吃饭 睡觉 写代码]
    
Go 语言微服务架构搭建:基于 gRPC 和 Protobuf 的高效通信实践 微服务架构是一种将应用拆分为一组小的、独立的服务的架构模式。每个微服务都围绕一个特定的业务功能构建,具有自己的数据库、业务逻辑和 API。松耦合:服务之间通过 API 进行交互,独立部署和扩展。可伸缩性:每个服务可以单独扩展,适应不同的负载。技术多样性:不同的微服务可以使用不同的技术栈。然而,随着微服务数量的增多,服务间的通信变得复杂,如何高效、安全、可靠地进行服务间通信成为微服务架构设计中的一个关键问题。gRPC。 阅读详情

相关推荐

golang学习笔记23——golang微服务中服务间通信问题探讨

在 Golang 微服务中,服务间通信面临着多种问题,但通过选择合适的技术和工具,如高效的序列化方式、优化网络协议、服务发现工具以及安全认证机制等,可以有效地解决这些问题,构建出高性能、可靠和安全的微服务架构。请注意,以上代码仅为示例,在实际应用中可能需要根据具体需求进行调整和优化。关注我看更多有意思的文章哦!👉👉。

GoppViper的博客 1708

Go 语言使用Protobuf 进行序列化详解

Protocol buffers 是定义语言(在 .proto 文件中创建)、proto 编译器生成的用于与数据交互的代码、特定于语言的运行时库、写入文件(或通过网络连接发送)的数据的序列化格式以及序列化数据的组合。您只需定义一次数据结构,然后可以使用特殊生成的源代码轻松地将结构化数据读写到各种数据流中,并使用各种语言。Protobuf(Protocol Buffers) 是一种语言中立、平台中立的可扩展机制,用于序列化结构化数据。相比较传统的传输协议, 其以紧凑的二进制格式进行传输.

chenhuyu7的博客 1184

Golang领域Map的序列化与反序列化操作

在分布式系统、微服务架构、数据持久化等场景中,Golang的map类型常被用于存储动态键值数据。但map本身无法直接在网络中传输或写入存储介质,必须通过序列化转换为字节流(如JSON、Protobuf),反序列化则是将字节流恢复为map的逆向过程。主流序列化格式(JSON/Protobuf/XML/YAML)与Map的交互实现类型映射规则与常见错误处理自定义序列化逻辑的高级技巧性能对比与场景化选型策略核心概念:解析序列化原理与Map数据模型的映射关系实现方法。

AI Agent Harness Engineering 753

protobuf(golang)序列化与反序列化

输出的是二进制数据。

jinchenga的博客 800

Golang CGO 与 Protocol Buffers 集成:高效数据序列化

在分布式系统、微服务架构中,数据序列化是核心环节——就像快递打包,既要“快”(序列化速度)又要“省”(数据体积小)。Protobuf凭借二进制编码、自描述格式,成为比JSON/XML更高效的选择。但当我们需要复用已有的C/C++ Protobuf处理库(比如 legacy 系统),或想通过C语言优化某些关键路径的性能时,就需要CGO来“牵线搭桥”。CGO的基本原理与使用场景Protobuf的序列化优势如何通过CGO让Go调用C实现的Protobuf序列化/反序列化函数。

AI Agent Harness Engineering 1007

【SpringBoot香樟转转】debugDay01

在学黑马程序员的苍穹外卖项目,刚开始学,想用maven编译一下代码,结果报错,找不到符号。本着先理解原则,看着能找到这个变量呀。

m0_72696598的博客 1741

数据序列化协议 Protobuf 3 介绍(Go 语言)

Protobuf(Protocol Buffers)是 Google 开发的一种高效、跨平台、可扩展的数据序列化协议。它可以将数据转换为紧凑的二进制格式,用于不同系统之间进行高效的数据传输和存储。 简单理解: 它类似于 JSON,但比 JSON 体积更小、速度更快。 它类似于 XML,但格式更紧凑、解析更高效。 它适用于微服务、RPC(远程调用)、数据存储等高性能场景。

rm -rf/坏习惯 1308

电磁场数值分析作业(西电)共5次【2021】

文章目录作业1作业2作业3作业4作业5 作业1 一个二维正方形(边长a=10mm)的静电场区域,电位边界条件如图所示(单位:V),求区域内的电位分布。要求用超松弛迭代法求解差分方程组进行计算。 clc clear close all hx=11; hy=11; v1=zeros(hy,hx); v1(hy,:)=ones(1,hx)*100; v1(1,:)=ones(1,hx)*50; for i=1:hy v1(i,1)=0; v1(i,hx)=100; end w=2/(1+

薛定谔的壳的博客 5074

Go语言 ProtoBuf 序列化和反序列化

前言 Protobuf 是Google开发的一个网络通信协议,提供了高效率的序列化和反序列化机制,序列化就是把对象转换成二进制数据发送给服务端,反序列化就是将收到的二进制数据转换成对应的对象。官方版本支持Go,C++,Java,Python等语言。 Go语言中Protocol Buffers是一个灵活、高效的、自动化的用于对结构数据进行序列化和反序列化协议,与XML、Json相比,Pro...

数据与工程工作,AI大模型应用 3505

ggml_cgraph 详解

是 GGML 库的(Computation Graph)结构,它是深度学习框架的核心,用于表示、优化和执行神经网络的计算过程。

zhouzwd87的专栏 1203

NR RRC协议(2)---RRC连接建立流程

RRC连接建立目的是建立SRB1 RRC连接建立还用于将初始NAS消息从UE传送到网络 RRC连接的初始阶段期间,不激活AS安全性 RRC连接建立由UE侧发起

crg2046的博客 1957

2024 年最新 Protobuf 结构化数据序列化和反序列化详细教程

Protobuf(Protocol Buffers)是由Google开发的一种语言中立、平台中立、可扩展的序列化结构数据的方法。它用于在不同系统之间高效地交换数据。Protobuf使用定义文件(.proto)来描述数据结构,并通过编译生成特定语言的代码。它的优点包括小巧的二进制格式、高效的序列化速度和向后兼容性,非常适合需要高性能和跨语言的应用场景。

唤醒手腕 1642

如何制作poster以及下载poster模板

目录 前言 一、poster 二、制作软件 1.常用软件 2.专用工具 3.模板下载网址 总结 前言 随着会议的发展,参与国际会议成为研究工作展示的重要途径。poster逐步成为一个方面专家交流的重要工具。本文主要简单介绍一些poster的制作工具。 一、poster Paper, presentation, poster是deadline期间作者的三座大山。poster的内容较小,但内容都是论文中的干货。 二、制作软件 一般来说,制作poster使用PowerPoint.

yiyang14的博客 2万+

gh_mirrors/prot/protobuf代码混淆:保护敏感数据结构定义

### 1.1 数据结构暴露的安全风险 在微服务架构中,Protocol Buffers(Protobuf)作为高效的序列化协议被广泛应用。然而,默认生成的Go代码会完整保留`.proto`文件中的**字段名**、**类型定义**和**消息结构**,这些敏感信息可能通过以下途径泄露: - 逆向工程:攻击者可通过二进制文件反推数据结构 - 日志泄露:错误日志中可能包含完整消息内容 - 调试接口:未授...

gitblog_00201的博客 510

图文带你理解什么是Few-shot Learning

Few-shot Learning(少样本学习)是Meta Learning(元学习)中的一个实例1,所以在了解什么是Few-shot Learning之前有必要对Meta Learning有一个简单的认识。不过在了解什么是Meta Learning之前还是要了解一下什么是Meta。因此,阅读本文后你将对如下知识有一个初步的了解。 What is Meta What is Meta Learning What is Few-shot Learning 1. What is Meta? meta就是描述

Pr4da的博客 1万+

伺服驱动器485通信

485通信使用方法,485通信在上位机和伺服驱动器之间的应用,根据需要驱动电机旋转。

haipi511715316的博客 1万+

[golang 微服务] 3. ProtoBuf认识,安装以及golang 中ProtoBuf使用

ProtoBuf认识与使用,protoBuf的安装,protoBuf语句以及高级用法,protoBuf基本编译,protoBuf的序列化和反序列化,message关键字,repeated关键字,enum关键字,以及protoBuf golang案例讲解,golang 中ProtoBuf使用

资深系统架构,深耕高并发研发与 AI 大模型工程化落地。技术栈以 Python (AI/NLP/RAG/Agent) 与 Golang (高并发架构) 为双核心,兼具 PHP 大型应用经验。专注算法落地、复杂系统设计及团队技术赋能 5955

VSCode 配置 Claude Code 插件的 4 步安装法与 3 类常见报错解决方案

介绍 VSCode 中 Claude Code 插件的 4 步可靠安装流程与 3 类高频报错(上下文丢失、认证失败、加载卡死)的根因分析和精准修复方案,聚焦文件上下文捕获机制、请求头注入要求及缓存失效逻辑,提供可验证的命令行操作与日志定位方法。

weixin_28728443的博客 498

Go:序列化和反序列化

目录  为什么要序列化和反序列化  Json简介和使用  Msgpack简介和使用  Protobuf简介和使用 为什么需要序列化和反序列化? 微服务特点 1.每个服务专注做好一件事 2.微服务之间需要进行交互 3.每个服务可以使用任何语言进行开发 为什么需要序列化和反序列化? 服务之间进行沟...

鄢秋实的博客 2004

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Go 高性能序列化方案:Protobuf、Msgpack 和 FlatBuffers 性能对比

Protobuf:首选,适合 90% 的 RPC 场景。Schema 是长期资产Msgpack:从 JSON 迁移的平滑方案,适合灵活性和性能的折中:高频只读场景的利器,但写入复杂,不通用迁移建议:先对性能最敏感的热路径做序列化切换,不要一次性全量迁移。用 benchmark 数据指导选型,而不是凭经验猜测。

好代码自己会说话,烂代码才需要注释来圆谎 4758

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Go语言微服务:gRPC 与 Protobuf 序列化

在Go微服务中,gRPC和Protobuf序列化提供了高性能、可扩展的解决方案。通过定义schema、自动生成代码,开发者能快速构建可靠服务。建议在实际项目中优先采用,尤其对延迟敏感的系统。部署时,结合服务网格(如Istio)可进一步提升可观测性和弹性。

qqqqisuxkshd的博客 823

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

GoGo Protobuf终极指南:高性能序列化与反序列化解决方案

GoGo Protobuf是一个功能强大的Protocol Buffers实现,专门为Go语言设计,提供极致的性能和灵活性。这个开源项目通过代码生成技术,为结构化数据的序列化和反序列化提供了前所未有的速度提升。 ## 🚀 项目概述与核心价值 **GoGo Protobuf** 是标准golang/protobuf的一个分支,但加入了更多代码生成功能。该项目专门针对需要高性能数据序列化的场景优

gitblog_00468的博客 1018

go微服务-Protobuf

Protobuf 文章目录ProtobufProtobufProtobuf应用场景Protobuf在go语言中的编程实现安装Protobuf 协议语法使用Protobuf的步骤Protobuf序列化原理 Protobuf Google Protocol Buffer( 简称 Protobuf)是Google公司内部的混合语言数据标准,他们主要用于RPC系统和持续数据存储系统。 Protobuf应用场景 Protocol Buffers可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或RPC数据

qq_49723651的博客 833

Go 微服务基础:Protobuf & gRPC

Go 微服务基础:Protobuf & gRPC 这篇文章写的稍微有点乱,因为写作过程中思路有大断流。 本文历时很多天,期间我的两大主要开发环境 —— Python 和 Golang 都炸了,顺便,包管理工具 Homebrew 也出了点小问题(一切都是因为一条没经过深思的错误的 brew upgrade 命令)。尝试手动修复,搞了一天,无果。没办法 Time Machine 恢复了一下,由于最近几天都没备份????,S/L 大法不太灵,它一下子给我回到了十天前。各种手动检查、清理、git pull,

clownote 1027

Golang微服务-protobuf

protobuf gRPC是一款语言中立、平台中立、开源的远程过程调用系统,gRPC客户端和服务端可以在多种环境中运行和交互,例如用java写一个服务端,可以用go语言写客户端调用 数据在进行网络传输的时候,需要进行序列化,序列化协议有很多种,比如xml, json,protobuf等 gRPC默认使用protocol buffers,google开源的一套成熟的结构数据序列化机制。 序...

木子七的博客 762

探索Go语言的Protobuf库:GitCode上的golang/protobuf项目

是一个用于处理Google Protocol Buffers(通常称为Protobuf)消息的Golang实现。Protobuf是一种数据序列化协议,允许你在各种编程语言之间交换结构化数据。这个项目为Go开发者提供了方便的工具和接口,使得在Go应用中使用Protobuf变得更加高效和简单。 ## 技术分析 该库的核心是`protoc-gen-go`插件,它是一个代码生成器,可以将`.proto...

gitblog_00092的博客 300
上一篇: Go微服务: 基于net/rpc/jsonrpc模块实现微服务跨语言调用
下一篇: Go微服务: 基于ProtoBuf实现GRPC的微服务调用
Wang's Blog
博客等级 码龄12年 7433粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值