(4)go-micro微服务proto开发

本文涉及的产品
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,182元/月
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: (4)go-micro微服务proto开发

Protobuf介绍

Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 个 .proto 文件。他们用于 RPC 系统和持续数据存储系统。Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化、或者说序列化。它很适合做数据存储或RPC数据交换格式。可以用于即时通讯、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式


protobuf的核心内容包括:


定义消息:消息的结构体,以message标识。


定义接口:接口路径和参数,以service标识。


通过protobuf提供的机制,服务端与服务端之间只需要关注接口方法名(service)和参数(message)即可通信,而不需关注繁琐的链路协议和字段解析,极大降低了服务端的设计开发成本。


二 安装Protobuf

1、下载

下载所需的安装包,地址为:https://github.com/protocolbuffers/protobuf/releases

53.png


  下载完成之后解压

54.png


 2、将bin目录将入环境变量

55.png


3、查看安装是否成功
protoc  --version

57.png


三 Protobuf语法

1.1 基本规范

  • 文件以.proto做为文件后缀,除结构定义外的语句以分号结尾
  • 结构定义可以包含:message、service、enum
  • rpc方法定义结尾的分号可有可无
  • Message命名采用驼峰命名方式,字段命名采用小写字母加下划线分隔方式


  message SongServerRequest {
      required string song_name = 1;
  }

Enums类型名采用驼峰命名方式,字段命名采用大写字母加下划线分隔方式

  enum Foo {
      FIRST_VALUE = 1;
      SECOND_VALUE = 2;
  }
  • Service与rpc方法名统一采用驼峰式命名

1.2 字段规则

  • 字段格式:限定修饰符 | 数据类型 | 字段名称 | = | 字段编码值 | [字段默认值]
  • 限定修饰符包含 required\optional\repeated

Required: 表示是一个必须字段,必须相对于发送方,在发送消息之前必须设置该字段的值,对于接收方,必须能够识别该字段的意思。发送之前没有设置required字段或者无法识别required字段都会引发编解码异常,导致消息被丢弃

Optional:表示是一个可选字段,可选对于发送方,在发送消息时,可以有选择性的设置或者不设置该字段的值。对于接收方,如果能够识别可选字段就进行相应的处理,如果无法识别,则忽略该字段,消息中的其它字段正常处理。—因为optional字段的特性,很多接口在升级版本中都把后来添加的字段都统一的设置为optional字段,这样老的版本无需升级程序也可以正常的与新的软件进行通信,只不过新的字段无法识别而已,因为并不是每个节点都需要新的功能,因此可以做到按需升级和平滑过渡

Repeated:表示该字段可以包含0~N个元素。其特性和optional一样,但是每一次可以包含多个值。可以看作是在传递一个数组的值

数据类型


Protobuf定义了一套基本数据类型。几乎都可以映射到C++\Java等语言的基础数据类型

1684222827822.png

字段名称


字段名称的命名与C、C++、Java等语言的变量命名方式几乎是相同的

protobuf建议字段的命名采用以下划线分割的驼峰式。例如 first_name 而不是firstName

字段编码值


有了该值,通信双方才能互相识别对方的字段,相同的编码值,其限定修饰符和数据类型必须相同,编码值的取值范围为 1~2^32(4294967296)

其中 1~15的编码时间和空间效率都是最高的,编码值越大,其编码的时间和空间效率就越低,所以建议把经常要传递的值把其字段编码设置为1-15之间的值

1900~2000编码值为Google protobuf 系统内部保留值,建议不要在自己的项目中使用

字段默认值


当在传递数据时,对于required数据类型,如果用户没有设置值,则使用默认值传递到对端


1.3 service如何定义

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

例如,想要定义一个RPC服务并具有一个方法,该方法接收SearchRequest并返回一个SearchResponse,此时可以在.proto文件中进行如下定义:

    service SearchService {
        rpc Search (SearchRequest) returns (SearchResponse) {}
    }
  • 生成的接口代码作为客户端与服务端的约定,服务端必须实现定义的所有接口方法,客户端直接调用同名方法向服务端发起请求,比较麻烦的是,即便业务上不需要参数也必须指定一个请求消息,一般会定义一个空message


1.4 Message如何定义

  • 一个message类型定义描述了一个请求或响应的消息格式,可以包含多种类型字段
  • 例如定义一个搜索请求的消息格式,每个请求包含查询字符串、页码、每页数目
  • 字段名用小写,转为go文件后自动变为大写,message就相当于结构体
    syntax = "proto3";
    message SearchRequest {
        string query = 1;            // 查询字符串
        int32  page_number = 2;     // 页码
        int32  result_per_page = 3;   // 每页条数
    }
  • 首行声明使用的protobuf版本为proto3
  • SearchRequest 定义了三个字段,每个字段声明以分号结尾,.proto文件支持双斜线 // 添加单行注释


四 proto代码编写

  • 在account.proto文件中写入以下代码


syntax = "proto3";
import "google/protobuf/timestamp.proto";
package go.micro.service.account;
option go_package="/proto/account";
service Account {
  //登录
  rpc Login(LoginRequest) returns (LoginResponse) {}
  //注册
  rpc Register(RegisterRequest) returns (RegisterResponse) {}
  //查询用户信息
  rpc GetUserInfo(UserIdRequest) returns (UserInfoResponse) {}
  //修改信息
  rpc UpdateUserInfo(UserInfoRequest) returns (Response) {}
  //发送注册邮件
  rpc SendRegisterMail(SendMailRequest) returns (SendMailResponse) {}
  //发送重置密码邮件
  rpc SendResetPwdMail(SendMailRequest) returns (SendMailResponse) {}
  //重置密码
  rpc ResetPwd(ResetPwdRequest) returns (Response) {}
  //获取权限
  rpc GetUserPermission(UserIdRequest) returns (GetPermissionResponse) {}
  //修改权限
  rpc UpdateUserPermission(UpdatePermissionRequest) returns (Response) {}
  //退出账号
  rpc Logout(UserIdRequest) returns (Response) {}
  //删除账号
  rpc DelUser(UserIdRequest) returns (Response) {}
  //禁用账号
  rpc DisableUser(UserIdRequest) returns (Response) {}
  //启用账号
  rpc EnableUser(UserIdRequest) returns (Response) {}
}
message UserInfoResponse{
  int64 user_id = 1;
  string username = 2;
  string first_name = 3;
  string password = 4;
  int64 permission = 5;
  google.protobuf.Timestamp create_date = 6;
  google.protobuf.Timestamp update_date = 7;
  int64 is_active = 8;
  string email = 9;
  string last_name = 10;
}
message UserInfoRequest{
  UserInfoResponse user_info =1;
}
message UserIdRequest{
  int64 user_id = 1;
}
message Response{
  string message = 1;
}
message RegisterRequest{
  UserInfoResponse register_request = 1;
  string code = 2;
}
message LoginRequest{
  string username = 1;
  string password = 2;
}
message LoginResponse{
  bool is_success = 1;
  int64 user_id = 2;
  string token = 3;
}
message RegisterResponse{
  bool is_success = 1;
  int64 user_id = 2;
}
message SendMailRequest{
  string email = 1;
}
message SendMailResponse{
  string code = 1;
  string msg = 2;
}
message GetPermissionResponse{
  int64 permission = 1;
}
message UpdatePermissionRequest{
  int64 user_id = 1;
  int64 permission = 2;
}
message ResetPwdRequest{
  int64 user_id = 1;
  string code = 2;
  string password = 3;
}

五 生成.go文件

  • 打开终端,输入以下命令:
protoc --go_out=./ --micro_out=./ ./proto/account/account.proto
  • 命令执行后,会发现同级目录多了两个go文件,这就是自动生成好的编译之后的文件。
  • 命令讲解:
  1. –go_out 指定当前的目录./
  2. –micro_out 指定当前micro目录./
  3. ./proto/account/account.proto 指定要编译的.proto文件地址

效果图:


58.png

六 最后

  • 至此,go-micro微服务项目proto开发工作就正式完成。
  • 接下来就开始domain层开发了,希望大家关注博主和关注专栏,第一时间获取最新内容,每篇博客都干货满满。
相关文章
|
17天前
|
监控 算法 NoSQL
Go 微服务限流与熔断最佳实践:滑动窗口、令牌桶与自适应阈值
🌟蒋星熠Jaxonic:Go微服务限流熔断实践者。分享基于滑动窗口、令牌桶与自适应阈值的智能防护体系,助力高并发系统稳定运行。
Go 微服务限流与熔断最佳实践:滑动窗口、令牌桶与自适应阈值
|
9天前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
92 4
|
2月前
|
数据采集 数据挖掘 测试技术
Go与Python爬虫实战对比:从开发效率到性能瓶颈的深度解析
本文对比了Python与Go在爬虫开发中的特点。Python凭借Scrapy等框架在开发效率和易用性上占优,适合快速开发与中小型项目;而Go凭借高并发和高性能优势,适用于大规模、长期运行的爬虫服务。文章通过代码示例和性能测试,分析了两者在并发能力、错误处理、部署维护等方面的差异,并探讨了未来融合发展的趋势。
191 0
|
9天前
|
JavaScript 前端开发 Java
【GoWails】Go做桌面应用开发?本篇文章带你上手Wails框架!一步步带你玩明白前后端双端的数据绑定!
wails是一个可以让你使用Go和Web技术编写桌面应用的项目 可以将它看作Go的快并且轻量级的Electron替代品。可以使用Go的功能,并结合现代化UI完成桌面应用程序的开发
64 5
|
6月前
|
人工智能 安全 Java
智慧工地源码,Java语言开发,微服务架构,支持分布式和集群部署,多端覆盖
智慧工地是“互联网+建筑工地”的创新模式,基于物联网、移动互联网、BIM、大数据、人工智能等技术,实现对施工现场人员、设备、材料、安全等环节的智能化管理。其解决方案涵盖数据大屏、移动APP和PC管理端,采用高性能Java微服务架构,支持分布式与集群部署,结合Redis、消息队列等技术确保系统稳定高效。通过大数据驱动决策、物联网实时监测预警及AI智能视频监控,消除数据孤岛,提升项目可控性与安全性。智慧工地提供专家级远程管理服务,助力施工质量和安全管理升级,同时依托可扩展平台、多端应用和丰富设备接口,满足多样化需求,推动建筑行业数字化转型。
227 5
|
4月前
|
JSON 中间件 Go
Go 网络编程:HTTP服务与客户端开发
Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。
269 61
|
3月前
|
IDE Java API
Java 17 新特性与微服务开发的实操指南
本内容涵盖Java 11至Java 17最新特性实战,包括var关键字、字符串增强、模块化系统、Stream API、异步编程、密封类等,并提供图书管理系统实战项目,帮助开发者掌握现代Java开发技巧与工具。
194 1
|
4月前
|
开发框架 安全 前端开发
Go Web开发框架实践:模板渲染与静态资源服务
Gin 是一个功能强大的 Go Web 框架,不仅适用于构建 API 服务,还支持 HTML 模板渲染和静态资源托管。它可以帮助开发者快速搭建中小型网站,并提供灵活的模板语法、自定义函数、静态文件映射等功能,同时兼容 Go 的 html/template 引擎,具备高效且安全的页面渲染能力。
|
5月前
|
人工智能 数据可视化 JavaScript
颠覆开发效率!国内首个微服务编排框架Juggle开源啦!
Juggle是国内首个开源的微服务编排框架,专注于解决企业微服务进程中接口重复开发、系统对接复杂等问题。它提供零代码、低代码和AI增强功能,通过可视化拖拽快速组装简单API为复杂接口,支持多协议、多语言脚本和流程多版本管理。相比国外框架如Conductor,Juggle更贴合国内需求,具备高效开发、企业级可靠性及信创适配等优势,助力企业实现敏捷创新与数字化转型。
颠覆开发效率!国内首个微服务编排框架Juggle开源啦!
|
5月前
|
人工智能 缓存 安全
Go开发遇见的一次Data Race
本文通过一段 Go 语言代码示例,分析了并发编程中的数据竞争(Data Race)问题。代码实现了一个带缓存的内存存储系统,包含 `LRUCache` 和 `MemoryCache` 两个核心组件。尽管在 `MemoryCache` 的 `Set` 方法中加了锁保护,但由于直接调用 `LRUCache` 的 `GetLength` 方法时未加锁,导致底层数据结构在多 goroutine 环境下被同时读写,从而触发 Data Race。文章详细解析了问题根源,并提出了解决方案:为 `LRUCache` 的 `Add` 方法添加锁保护,确保并发安全。

热门文章

最新文章