- Notifications
You must be signed in to change notification settings - Fork0
RPC Frameworks based on NBlib
License
Ninokz/NBRpc
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
NBRpc 是使用C++ 14
编写的基于Boos.Asio
异步 RPC 框架,通信数据传输用了自己简单在Boos.Asio
上封装的网络库,端间采用json
进行request
与response
传输,消息传输协议采用JSON-RPC 2.0 规范. 框架结构如下图
框架底层网络库采用Boost 的Asio
库,其支持多平台,理论上Nano Frameworks
框架也能在 Linux 上编译,只不过目前建立的是一个 Visual Studio 的工程,此外这个框架还支持异步日志、多种类型线程池选用等常见的功能。
BaseServer
设计的核心部分主要是一个连接监听器acceptor
和一个IOServicePool
,前者用于监听连接请求构建session
,将连接的socket
部署到session
的io_context
后再将io_context
注册到后者中,后者IOServicePool
本质上是一个线程池,只不过每个线程管理不同session
的io_context
,并发处理不同io_context
读写事件,RPCServer
设计的核心部分主要是一个线程池用于执行RPCClient
发起的远程调用请求。
注册服务:构建一个RpcServerStub::Pre
对象,只需要调用RpcServerStub::Pre
对象的registReturn
方法进行注册 RPC 服务,通过registReturn
方法的std::unordered_map
参数设定 RPC 所需的参数类型和名称;然后再定义 RPC 方法本身,通过定义符合std::function<void(Json::Value&, const RpcDoneCallback&)>
类型的可调用对象即可
运行服务:使用上述构建的RpcServerStub::Pre
对象,运行即可;在运行之前若需要输出控制台信息,调用InitLoggers()
请求服务:构建一个RpcClientStub::Ptr
对象,只需要调用RpcClientStub::Ptr
对象的rpcReturnCall
或者asyncRpcReturnCall
方法或者rpcNotifyCall
方法即可,只不过需要传入远端 IP 和 端口以及对应 RPC 参数;
示例 - HelloWorld Service
服务端注册服务
voidhelloworldReturnService(Json::Value& request,const Nano::Rpc::ProcedureDoneCallback& done) {Json::Value result ="Hello," + request["params"]["name"].asString() +"!";bool flag =false;Nano::JrpcProto::JsonRpcResponse::Ptr response =Nano::JrpcProto::JsonRpcResponseFactory::createResponseFromRequest(request, result, &flag);done(response->toJson());}voidRpcServerStubHelloWorldTest() {Nano::Rpc::RpcServerStub::Ptr rpcServerStub = std::make_shared<Nano::Rpc::RpcServerStub>(9800);std::unordered_map<std::string, Json::ValueType> paramsNameTypesMap = { {"name", Json::ValueType::stringValue}};rpcServerStub->registReturn("helloworldMethod", paramsNameTypesMap, helloworldReturnService);rpcServerStub->run();system("pause");rpcServerStub->stop();}
客户端请求服务:
voidhelloworldCallback(Json::Value response) {};voidClientStubHelloWorldTest() {Nano::Rpc::RpcClientStub::Ptr rpcClientStub = std::make_shared<Nano::Rpc::RpcClientStub>();std::unordered_map<std::string, Json::Value> params = { {"name","World"}};rpcClientStub->rpcReturnCall("127.0.0.1",9800,"1","helloworldMethod", params, helloworldCallback,3000);system("pause");}
- NBLib: Net lib based on boost.asio
- libjson-rpc-cpp: C++ framework for json-rpc
- jrpc: JSON-RPC implementation in C++17
- llfc blog