RPC与Protobuf结合使用_go rpc pb(1)

学习路线:

这个方向初期比较容易入门一些,掌握一些基本技术,拿起各种现成的工具就可以开黑了。不过,要想从脚本小子变成黑客大神,这个方向越往后,需要学习和掌握的东西就会越来越多以下是网络渗透需要学习的内容:
在这里插入图片描述

需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

需求:假设在一个系统中,有订单模块(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)
  }


### 给大家的福利


**零基础入门**


对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。


![](https://img-blog.csdnimg.cn/img_convert/95608e9062782d28f4f04f821405d99a.png)


同时每个成长路线对应的板块都有配套的视频提供:


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a91b9e8100834e9291cfcf1695d8cd42.png#pic_center)

因篇幅有限,仅展示部分资料

**需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)**

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用protobuf-c,你可以按照以下步骤进行操作: 1. 首先,使用protoc-c工具编译你的.proto文件,生成对应的C代码文件(头文件和源文件)。使用命令:protoc-c --c_out=. yourfile.proto。 2. 然后,编写你的C程序来使用生成的C代码。在你的C程序中,包含生成的头文件,并使用相应的函数来序列化和反序列化数据。 3. 如果你想使用protobuf-c-rpc,可以参考以下步骤: 1. 首先,从GitHub上下载protobuf-c-rpc项目,并编译。使用命令:./autogen.sh && ./configure && make && make install(注意,最后一条命令可能需要使用sudo)。 2. 根据你的需求,在你的C程序中引入相关的头文件。 3. 根据你的.proto文件,使用protoc-c工具生成相应的C代码。 4. 编译你的C程序,链接protobuf-c-rpc库文件和protobuf-c库文件。使用命令:gcc yourfile.c generated.pb-c.c -o yourprogram -lprotobuf-c -lprotobuf-c-rpc。 4. 最后,运行你的C程序,测试你的protobuf-c代码。 请注意,上述步骤是一个基本的使用例子,具体的步骤可能会因为你的需求和环境而有所不同。但是,通过这些步骤,你应该能够使用protobuf-c来序列化和反序列化数据,并使用protobuf-c-rpc来实现RPC功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [protobuf-c之嵌入式平台使用](https://blog.csdn.net/weixin_38293850/article/details/121361877)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [protobuf-c-rpc跑起来正确步骤](https://blog.csdn.net/u013863751/article/details/113531482)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值