Skip to content

Ninokz/NBRpc

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

31 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

NBRpc

NBRpc 是使用 C++ 14 编写的基于 Boos.Asio 异步 RPC 框架,通信数据传输用了自己简单在Boos.Asio上封装的网络库,端间采用 json 进行 requestresponse 传输,消息传输协议采用 JSON-RPC 2.0 规范. 框架结构如下图

框架底层网络库采用 BoostAsio 库,其支持多平台,理论上Nano Frameworks 框架也能在 Linux 上编译,只不过目前建立的是一个 Visual Studio 的工程,此外这个框架还支持异步日志、多种类型线程池选用等常见的功能。

BaseServer设计的核心部分主要是一个连接监听器acceptor和一个IOServicePool,前者用于监听连接请求构建session,将连接的socket部署到sessionio_context后再将io_context注册到后者中,后者IOServicePool本质上是一个线程池,只不过每个线程管理不同sessionio_context,并发处理不同io_context读写事件,RPCServer设计的核心部分主要是一个线程池用于执行RPCClient发起的远程调用请求。

Dependency.

Use Example.

注册服务:构建一个 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

服务端注册服务

void helloworldReturnService(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());
}

void RpcServerStubHelloWorldTest() {
	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();
}

客户端请求服务:

void helloworldCallback(Json::Value response) {
	
};

void ClientStubHelloWorldTest() {
	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");
}

Ref.

About

RPC Frameworks based on NBlib

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages