首页 > 其他分享 >Golang微服务-protobuf

Golang微服务-protobuf

时间:2024-12-25 14:53:07浏览次数:4  
标签:服务 protobuf proto Golang go message 序列化 string

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 main
    
    import (
    	"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,并不是具体的value
      int32 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服务,该方法接收SearchRequest返回SearchResponse
service SearchService {
	//rpc 服务的函数名 (传入参数)返回(返回参数)
	rpc Search (SearchRequest) returns (SearchResponse);
}

标签:服务,protobuf,proto,Golang,go,message,序列化,string
From: https://www.cnblogs.com/Mickey-7/p/18630383

相关文章

  • NSSM工具 : 将 .exe 程序安装成 Windows 服务
    1、下载NSSMNSSM:theNon-SuckingServiceManagerhttps://nssm.cc/usage2、方式一:cmd方式安装服务将下载的压缩包解压,找到nssm.exe,以管理员身份打开cmd,在cmd中定位到nssm.exe所在路径,执行nssminstall服务名:按下enter键会自动弹出nssm的窗体:在Application-Application......
  • 分布式通信,微服务协调组件,zookeeper
    目录分布式通信PRC框架Http和rpc的区别微服务协调组件分布式和微服务的区别负载均衡zookeeperzookeeper是什么?watch机制原理leader选举分布式通信PRC框架远程调用,跨进程的调用方法。跨进程,跨同一台计算机的多个进程,多个jvm,多台计算机之间的进程。rpc,remotepro......
  • SpringCloud微服务项目实战 - 限流、熔断、降级处理
    SpringCloud微服务项目实战-限流、熔断、降级处理|Id|Title|DateAdded|SourceUrl|PostType|Body|BlogId|Description|DateUpdated|IsMarkdown|EntryName|CreatedTime|IsActive|AutoDesc|AccessPermission||-------------|-------------|-----......
  • vscode怎么连接远程服务器使用jupyter和pycharm?安装了jupyter插件为什么还是打不开jup
    本文主要从下面三个方面进行1.vscode的优势2.怎么安装并配置vscode3.怎么使用jupyter和pycharm4.我遇到的问题(已解决)(1)显示你即将连接到不受visualstudiocode版本(2)解决安装了jupyter插件但是还是打不开.ipynb文件无法打开笔记本编辑器类型为"jupyter-notebook"的资源......
  • 车企售后服务中的项目管理创新:提升跨部门协作
    一、引言随着数字化技术的飞速发展,越来越多的车企开始向电商平台转型,不仅在销售端实现线上化,也将目光投向了售后服务的优化。传统的汽车售后服务模式主要依赖线下4S店,通过面对面的沟通和维修,服务流程相对固定,且服务质量参差不齐。随着消费者购车行为的逐渐转向线上,车企电商平台逐......
  • 勤哲Excel服务器自动生成进出口企业个性化ERP管理系统
    近年来,随着产业信息化、数字化发展加速,尤其政策要求和疫情影响,生产贸易产业作为数字技术和机械行业的集大成者,正在发生深刻变革。同时,5G、物联网、大数据、人工智能等协同融合,成为贸易企业宝贵资产,有助于内外部、供应链之间资源整合和提效降本。在此背景下,无论贸易头部企业还是......
  • 如何合并扩容云服务器磁盘?
    当您手动升级了云服务器的磁盘空间后,需要进行合并扩容操作,以确保新添加的空间能够被系统识别和使用。以下是详细的合并扩容步骤和注意事项,帮助您顺利完成操作。合并扩容步骤1.登录服务器首先,使用SSH客户端(如PuTTY)登录到您的云服务器。确保您有足够的权限执行管理员级别的命令......
  • 如何获得云服务器中 MySQL 数据库的密码?
    您需要获取云服务器中MySQL数据库的密码。获取数据库密码的方式取决于您使用的具体环境和服务。以下是几种常见的获取方法,帮助您快速找到数据库密码。1. 通过建站助手查看如果您使用的是带有建站助手的云服务器,通常可以在建站助手中直接查看MySQL数据库的密码。具体步骤如......
  • golang并发测试http demo
    packagemainimport( "bytes" "fmt" "math/rand" "net/http" "sync" "time")const( url="http://127.0.0.1:8080"//请求的URL ratePerSecond=10......
  • 如何解决控制面板连接不上云服务器的问题?
    当您遇到控制面板无法连接到云服务器的问题时,可以按照以下步骤进行排查和解决:检查网络连接:首先,请确保您的本地网络连接正常。您可以尝试访问其他网站或服务,确认网络是否畅通。如果网络不稳定,可能会导致连接超时或失败。确认服务器状态:登录到云服务器提供商的管理后台,检查服......