RPC流程三 - Client端编写

本文详细介绍了RPC流程中的Client端编写,包括google的实现、三种Coder实现(RpcChannel、RpcChannelImpl、RpcController)以及Client端通信流程。重点讲述了如何使用protobuf和C++11编写EchoRequest,并通过RpcChannel与服务端进行通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

流程二:https://blog.youkuaiyun.com/wd3cwg38/article/details/104417616

int main()
{
	echo::EchoRequest   request;
	echo::EchoResponse  response;
	request.set_message("hello tonull, from client");
	
	char* ip          = argv[1];
	char* port        = argv[2];
	std::string addr  = std::string(ip) + ":" + std::string(port);
	RpcChannel    rpc_channel(addr);
	echo::EchoServer_Stub stub(&rpc_channel);
	
	RpcController controller;
	stub.Echo(&controller, &request, &response, nullptr);
	
	if (controller.Failed())
		std::cout << "request failed: %s" << controller.ErrorText().c_str();
	else
		std::cout << "resp: " << response.message() << std::endl;
	
	return 0;
}

- google实现

// google::protobuf::RpcChannel
class RpcChannel {}

// google::protobuf::RpcController
class RpcController {}

- Client端实现

Coder实现一:RpcChannel

class RpcChannel : public google::protobuf::RpcChannel {
public:
 	RpcChannel(std::string& server_addr);
  	virtual ~RpcChannel();
 
  	virtual void CallMethod(
  		const ::google::protobuf::MethodDescriptor* method,
 		::google::protobuf::RpcController* controller,
    	const ::google::protobuf::Message* request,
       	::google::protobuf::Message* response,
       	::google::protobuf::Closure* done
   	);
private:
  	RpcChannelImpl* impl_; // RpcChannel具体实现
};

Coder实现二:RpcChannelImpl

// 主要实现CallMethod()用于调用服务
class RpcChannelImpl : public google::protobuf::RpcChannel {
public:
	RpcChannelImpl(std::string& server_addr) {}
	virtual ~RpcChannelImpl() {}

	virtual void Init(std::string& server_addr);
  	virtual void CallMethod(
  		const ::google::protobuf::MethodDescriptor* method,
 		::google::protobuf::RpcController* controller,
    	const ::google::protobuf::Message* request,
       	::google::protobuf::Message* response,
       	::google::protobuf::Closure* done
   	);
private:
	std::string server_addr_;
	boost::shared_ptr<boost::asio::io_service> io_;
	boost::shared_ptr<boost::asio::ip::tcp::socket> socket_;
};
// client
RpcChannel    rpc_channel(addr);
echo::EchoServer_Stub stub(&rpc_channel);

// client CallMethod
stub.Echo(&controller, &request, &response, nullptr);

Coder实现三:RpcController

// 用于对RPC过程中的信息进行反馈
class RpcController : public google::protobuf::RpcController {
public:
	RpcController() { Reset(); }
	virtual ~RpcController() {}
	
	virtual void Reset() { is_failed_ = false; error_code_ = ""; }
	virtual bool Failed() const { return is_failed_; }
	virtual void SetFailed(const std::string& reason) { is_failed_ = true; error_code_ = reason;}
	virtual std::string ErrorText() const { return error_code_; }
	virtual void StartCancel() { };
	virtual bool IsCanceled() const { return false; };
	virtual void NotifyOnCancel(::google::protobuf::Closure* /* callback */) { };

private:
	 bool is_failed_;
	 std::string error_code_;
};

- Client端实现流程

  1. 编写EchoRequest
  2. 通过RpcChannelstub与服务端进行通信

- 参考文献

1、RPC流程介绍 - https://izualzhy.cn/demo-protobuf-rpc

介绍RCP的实现原理 目录 1. 前言 2 2. 基本概念 3 2.1. IDL 3 2.2. 代理(Proxy) 3 2.3. 存根(Stub) 4 3. 要素 4 3.1. 网络通讯 4 3.2. 消息编解码 5 3.3. IDL编译器 5 4. flex和bison 5 4.1. 准备概念 5 4.1.1. 正则表达式(regex/regexp) 6 4.1.2. 符号∈ 6 4.1.3. 终结符/非终结符/产生式 6 4.1.4. 记号(Token) 6 4.1.5. 形式文法 7 4.1.6. 上下文无关文法(CFG) 7 4.1.7. BNF 8 4.1.8. 推导 8 4.1.9. 语法树 8 4.1.10. LL(k) 9 4.1.11. LR(k) 9 4.1.12. LALR(k) 9 4.1.13. GLR 9 4.1.14. 移进/归约 9 4.2. flex和bison文件格式 9 4.2.1. 定义部分 10 4.2.2. 规则部分 10 4.2.3. 用户子例程部分 10 4.3. flex基础 10 4.3.1. flex文件格式 11 4.3.2. 选项 11 4.3.3. 名字定义 11 4.3.4. 词法规则 12 4.3.5. 匹配规则 12 4.3.6. %option 13 4.3.7. 全局变量yytext 13 4.3.8. 全局变量yyval 13 4.3.9. 全局变量yyleng 13 4.3.10. 全局函数yylex 13 4.3.11. 全局函数yywrap 13 4.4. bison基础 14 4.4.1. bison文件格式 14 4.4.2. %union 14 4.4.3. %token 15 4.4.4. 全局函数yyerror() 15 4.4.5. 全局函数yyparse() 15 4.5. 例1:单词计数 15 4.5.1. 目的 15 4.5.2. flex词法文件wc.l 16 4.5.3. Makefile 16 4.6. 例2:表达式 17 4.6.1. 目的 17 4.6.2. flex词法exp.l 17 4.6.3. bison语法exp.y 17 4.6.4. Makefile 19 4.6.5. 代码集成 19 4.7. 例3:函数 20 4.7.1. 目的 20 4.7.2. func.h 20 4.7.3. func.c 21 4.7.4. IDL代码func.idl 22 4.7.5. flex词法func.l 22 4.7.6. bison语法func.y 24 4.7.7. Makefile 27 5. 进阶 27 5.1. 客户函数实现 27 5.2. 服务函数实现 28 5.2.1. Stub部分实现 28 5.2.2. 用户部分实现 29 6. 参考资料 29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值