protobuf rpc java_RPC框架实现(一) Protobuf的rpc实现

本文介绍了基于protobuf的RPC框架实现,包括Controller、Service、Channel和Stub等核心概念。使用C++语言,借助protobuf编解码和boost.socket进行同步通信。服务端通过accept进行阻塞式请求处理,客户端通过stub调用服务。文章讨论了整体框架设计,并指出后续将探讨如何提升收发效率。
摘要由CSDN通过智能技术生成

概述

RPC框架是云端服务基础框架之一,负责云端服务模块之间的项目调用,类似于本地的函数调用一样方便。常见的RPC框架配带的功能有:

编解码协议。比如protobuf、thrift等等。

服务发现。指服务提供者更新接口后,服务使用者如何知道该接口更新。Protobuf协议使用的是预编译方式,dubbo中使用的是zk作为媒介。

负载均衡。

流量控制、熔断。

运维工具。

常见RPC框架有

谷歌的GRPC。

百度的BRPC。

阿里的dubbo。

脸书的thrift。

腾讯的tars。

本系列主要教大家如何实现RPC框架,使用的语音是C++,协议使用的是protobuf。

基于protobuf的RPC框架

这里不介绍具体protoc的使用方法,网上很多。在完成protoc编译后,会输出protobuf提供的服务框架中,主要有如下几个类

Controller,主要是rpc通信过程的辅助接口,记录错误状态和简单的控制。

Service,指特定的一个服务。在protobuf中,一个服务(service)可以包含多个方法(method),通过service+method可以唯一确定一个过程。

Channel,指使用者和提供者直接的连接通道,是protobuf的核心,但是rpc框架开发者一般不直接调用该类,而是调用下面的stub(桩/存根)。

Stub,客户端使用的存根,通过该类去发起远程过程调用。至于为什么需要stub,笔者也还没有弄清楚。

在整体框架实现上基本上集成protobuf提供的类即可,采用boost的socket进行通信,暂时考虑同步通信的情况。

对于服务端和客户端的通信协议上,采用的meta对象,用于记录过程调用的参数、具体service和method。

服务端设计

采用boost的socket,直接bind和监听,启动后则通过accept进行阻塞,对于每个请求进行解包,并在ProcRpcMsg函数中对具体业务操作函数的调用,并在业务操作函数完成后通过done->Run()回调OnCallbackDone实现数据回写。

d5327b00f51145492f55fd90587b8243.png

在service的callmethod方法中,对具体method进行调用。

9c8b9b98b86d76f9f77dafc16bdad0db.png

此外,在服务和过程的管理上,服务端建立了key-val的map来进行管理。

客户端设计

客户端相对简单,也是基于boost的socket进行connect、send、receive等同步的操作。

在echo例子中,我们通常调用stub的函数,stub调用channel的Callmethod函数,因此我的操作需要在Channel::CallMethod中进行实现。

65aa9c22b546744097cc8b31cf4e984e.png

总结

本文简单介绍了基于protobuf的rpc框架实现,都是使用同步模型且单线程形式。这个程序在状态控制、并发高等上还不够,下篇文章讲如何提升收发效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值