Go语言微服务框架实战:3.RPC与Protobuf结合使用编程绍_protobuffer在go语言的哪些方面使用到-程序员宅基地

技术标签: 1092278024:交流群-GO语言  

RPC与Protobuf结合使用

@author:Davie版权所有:北京千锋互联科技有限公司

上节课我们使用Golang提供的核心net/rpc库实现了RPC调用编程。本节课继续来看一下RPC和之前所学的Protobuf在编程中的结合实现。

需求:假设在一个系统中,有订单模块(Order),其他模块想要实现RPC的远程工程调用,根据订单ID和时间戳可以获取订单信息。如果获取成功就返回相应的订单信息;如果查询不到返回失败信息。现在,我们来进行需求的编程实现。

传输数据格式定义

在《Go语言微服务理论实践课程》中,学习过关于Protobuf的相关知识。可以利用Protobuf相关规则定义相应的数据格式,文件扩展名是.proto。

  • 数据定义根据需求,定义message.proto文件,详细定义如下:
  syntax = "proto3";
  package message;
 
  //订单请求参数
  message OrderRequest {
      string orderId = 1;
      int64 timeStamp = 2;
  }
 
  //订单信息
  message OrderInfo {
      string OrderId = 1;
      string OrderName = 2;
      string OrderStatus = 3;
  }

在上述文件中,定义了客户端发起RPC调用时的请求数据结构OrderRequest和服务端查询后返回的数据结构OrderInfo。数据定义采用proto3语法实现,整个数据定义被定义在message包下。

  • 编译proto文件通过proto编译命令对.proto文件进行编译,自动生成对应结构体的Go语言文件。编译命令如下:

    protoc ./message.proto --go_out=./
    执行上述命令是在message包下。编译命令结束后,会在message包下生成message.pb.go文件,其中自动生成了OrderRequest和OrderInfo在Go语言中结构体的定义和相关的方法。

Protobufg格式数据与RPC结合

  • 服务的定义进行RPC远程过程调用,实现调用远程服务器的方法,首先要有服务。在本案例中,定义提供订单查询功能的服务,取名为OrderService,同时提供订单信息查询方法供远程调用。详细的服务和方法定义如下:
 //订单服务
 type OrderService struct {
  }
 func (os *OrderService) GetOrderInfo(request message.OrderRequest, response *message.OrderInfo) error {
  //201907310003
  orderMap := map[string]message.OrderInfo{
   "201907300001": message.OrderInfo{OrderId: "201907300001", OrderName: "衣服", OrderStatus: "已付款"},
   "201907310001": message.OrderInfo{OrderId: "201907310001", OrderName: "零食", OrderStatus: "已付款"},
   "201907310002": message.OrderInfo{OrderId: "201907310002", OrderName: "食品", OrderStatus: "未付款"},
  }
​
 current := time.Now().Unix()
 if (request.TimeStamp > current) {
  *response = message.OrderInfo{OrderId: "0", OrderName: "", OrderStatus: "订单信息异常"}
   } else {
  result := orderMap[request.OrderId]//201907310003
  if result.OrderId != "" {
   *response = orderMap[request.OrderId]
   } else {
   return errors.New("server error")
   }
   }
 return nil
  }


在服务的方法定义中,使用orderMap模拟初始订单数据库,方便案例查询展示。GetOrderInfo方法有两个参数,第一个是message.OrderRequest,作为调用者传递的参数,第二个是message.OrderInfo,作为调用返回的参数,通过此处的两个参数,将上文通过.proto定义并自动生成的Go语言结构体数据结合起来。

  • 服务的注册和处理服务定义好以后,需要将服务注册到RPC框架,并开启http请求监听处理。这部分代码与之前的RPC服务端实现逻辑一致,具体实现如下:

 func main() {
 
  orderService := new(OrderService)
 
  rpc.Register(orderService)
 
  rpc.HandleHTTP()
 
  listen, err := net.Listen("tcp", ":8081")
  if err != nil {
   panic(err.Error())
  }
  http.Serve(listen, nil)
  }

 

  • RPC客户端调用实现在客户端,除了客户端正常访问远程服务器的逻辑外,还需要准备客户端需要传递的请求数据message.OrderInfo。具体实现如下:

 client, err := rpc.DialHTTP("tcp", "localhost:8081")
  if err != nil {
   panic(err.Error())
  }
 
  timeStamp := time.Now().Unix()
  request := message.OrderRequest{OrderId: "201907310001", TimeStamp: timeStamp}
 
  var response *message.OrderInfo
  err = client.Call("OrderService.GetOrderInfo", request, &response)
  if err != nil {
   panic(err.Error())
  }
 
  fmt.Println(*response)

运行结果

分别依次运行server.go和client.go程序。运行结果如下:

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qfguankefeng/article/details/107462925

智能推荐

Idea使用-程序员宅基地

文章浏览阅读107次。配置MavenIdea设置导包更改Idea背景颜色

GNU C 、ANSI C、标准C、标准c++区别和联系_ansi c和c++的区别-程序员宅基地

文章浏览阅读2.5k次。GNU计划,又称革奴计划,是由Richard Stallman在1983年9月27日公开发起的。它的目标是创建一套完全自由的操作系统。它在编写linux的时候自己制作了一个标准成为 GNU C标准。ANSI 美国国家标准协会,它对C做的标准ANSI C标准后来被国际标准协会接收成为标准C 所以 ANSI C 和标准C是一个概念总体来说现在linux也支持标准C,以后标准C可以跨平台,而GUN c 一般只在linux c下应用18.1 ANSI C和标准C++的_ansi c和c++的区别

【云周刊】第139期:阿里年会黑科技全揭秘:IoT手环、人脸识别验票、大屏弹幕互动等“十八般武艺”轮番上阵...-程序员宅基地

文章浏览阅读143次。摘要: 阿里年会黑科技全揭秘:IoT手环、人脸识别验票、大屏弹幕互动等“十八般武艺”轮番上阵,2017上半年无监督特征学习研究成果汇总,CDN最全学习教程,量子计算会带来什么样的革命?更多精彩技术资讯,尽在云周刊!本期头条阿里年会黑科技全揭秘:IoT手环、人脸识别验票、大屏弹幕互动等“十八般武艺”轮番上阵 在刚刚结束的2017阿里巴巴年会上,各种科技元素的运用让年会增加了不少吸睛之..._ai手环年会

linux共享磁盘挂载ntfs,解决linux(ubuntu18)下无法挂载ntfs磁盘,并读写挂载硬盘-程序员宅基地

文章浏览阅读447次。首先需要有ntfs-3g,没有的话sudo apt-get install ntfs-3g挂载硬盘:chen@ilaptop:/$ sudo mount -o rw,remount /dev/sdb1报错:Remounting is not supported at present. You have to umount volume and then mount it once again.再挂..._remounting is not supported at present. you have to umount volume and then m

Delphi下spcomm的安装,win7系统,delphi7和delphi2010._delphi spcomm安装-程序员宅基地

文章浏览阅读3.3k次。一、先说delphi7下,spcomm的安装。 安装完了,出现在system下,最后一个空间,蓝红黄; 二、delphi 2010下,控件的安装:先点击file->new->package-delphi 在右侧找到CONTAINS选项 右击出现菜单,选择AD_delphi spcomm安装

Qt系列文章之一(Qt 下载、安装,组件管理软件​储存库设置,离线/在线安装方式)_qt离线安装-程序员宅基地

文章浏览阅读1.7k次,点赞5次,收藏12次。前言上面说的方式,其实在我的其他博客多多少少都提及过,或者单独写成篇,这里充其量是总结归纳,所以可能有些地方我会直接内部跳转文章链接,只因为篇幅太大,重新聚集到一篇文章上面,让你们看着也会很累,当然不会全部都是链接跳转的,一个一个来,先从下载开始Qt下载这边只介绍具体的下载地址,本文也直接让Qt5.x系列,其他版本不涉及,因为Qt目前的大版本是5.x系列,最新版本最近刚更新到5.15。Qt6 于2020年年底发布,预览版已经出了,我尝试用过,体验还是不太好,因为要更改的东西太多了,删除了很多库,尤其_qt离线安装

随便推点

Mac OS X 10.5 Leopard: Direcory Utility, The end of Netinfo-程序员宅基地

文章浏览阅读79次。其实,在OS X Tiger 10.4中,原来有两个应用程序一个叫NetInfo,一个是Directory Access一个主要用于管理本地用户的,另一个用来设置绑定网络Directory服务的,这次的Directory Utility是把这两个的功能合并了。 ...

pycharm如何配置python环境_pycharm配置python运行环境-程序员宅基地

文章浏览阅读7.1w次,点赞28次,收藏156次。pycharm如何配置python环境_pycharm配置python运行环境

什么是webp-程序员宅基地

文章浏览阅读1.7k次。WebP 是谷歌开发的一种新图片格式,它是支持有损和无损两种压缩方式的使用直接色的点阵图。使用 webp 格式的最大优点是是,在相同质量的文件下,它拥有更小的文件体积。因此它非常适合于网络图片的传输,因为图片体积的减少,意味着请求时间的减少,这样会提高用户的体验。这是谷歌开发的一种新的图片格式。浏览器如何判断是否支持 webp 格式图片?通过创建 Image 对象,将其 src 属性设置为 webp 格式的图片,然后在 onload 事件中获取图片的宽高,如果能够获取,则说明浏览器支持 webp_webp

SpringBoot2.X基础教程:配置文件详解_spring boot 2.x:配置文件详解-程序员宅基地

文章浏览阅读2.2k次,点赞21次,收藏9次。SpringBoot2.X基础教程:配置文件详解_spring boot 2.x:配置文件详解

IIS配置教程_iis配置。-程序员宅基地

文章浏览阅读468次。阿里云服务器,安装web服务器(IIS)教程 间接目的:云服务器搭建ftp网站,进而实现文件的传输功能。 所以,需要了解IIS,并能够配置安装IIS —— “Web服务器”。IIS简介:IIS全称:Internet Information Services(IIS,互联网信息服务)。是指World Wide Web server服务,IIS是一种Web(网页)服..._iis配置。

XJTU_ 西安交通大学2020大学计算机作业-第十周_一个函数来判断一个正整数是否为回文数,若是则返回1,否则返回0。所谓回文数是-程序员宅基地

文章浏览阅读1.3w次,点赞58次,收藏51次。XJTU_ 西安交通大学2020大学计算机作业-第十周XJTU_ 西安交通大学2020大学计算机作业-第十周注:所有题所有用例均已通过。俺又更新了,还是求点星星????文章没上传到github,反正没人点星星:https://github.com/nobodyXX/XJTU_C_homework/blob/main/week7,如果这篇文章带给你了帮助或者灵感,欢迎给我点个星星,谢谢!!!第一题编写程序,将用户输入的最多5位八进制数转换为十进制。输入:一个整数。输出:一个整数。样例输入:_一个函数来判断一个正整数是否为回文数,若是则返回1,否则返回0。所谓回文数是