sogou/srpc

支持UNIX Domain socket吗?

yongxiangzheng opened this issue · 8 comments

请问 支持UNIX Domain socket方式的进程间通讯吗?

支持。自定义协议的例子,tutorial-10里,就有uds的示例代码。

噢噢,这是srpc项目啊。你想到workflow的项目里看一下。srpc的server端肯定是支持的,client我看看能不能配uds地址。

我看了一下,RPCClientParams好像不支持传入sockaddr:

struct RPCClientParams
{
	RPCTaskParams task_params;
//host + port + is_ssl
	std::string host;
	unsigned short port;
	bool is_ssl;
//or URL
	std::string url;
	std::string caller;
};

这个我们可以考虑加一下。不过,一般来讲,uds的话自定义协议是不是就可以了,没必要用带IDL的rpc?

嗯嗯,建议可以加下,我是认为使用自定义协议,那就得需要自己再封装socket,计划是找一个能有支持uds的rpc,这样可以减少一些代码维护和增加程序稳健性能

自定义协议不用封装socket的。你看看一下这个文档和实例:
https://github.com/sogou/workflow/blob/master/docs/tutorial-10-user_defined_protocol.md
https://github.com/sogou/workflow/tree/master/tutorial/tutorial-10-user_defined_protocol
因为srpc其实就是基于workflow的一组自定义协议。自己写自定义协议,只需要写一下序列化和反序列化函数,你可以看看。
不过,srpc的client我们也加上sockaddr的支持吧。

好的,我看看,谢谢~

@yongxiangzheng
突然想起来,我们本来就支持Unix domain socket的srpc client。只需要利用一下workflow的upstream功能就可以了。添加一个upstream,让其包含一个server,地址是一个本地路径:

#include "workflow/UpstreamManager.h"

int main()
{
    UpstreamManager::upstream_create_round_robin("uds-host-name", false);
    UpstreamManager::upstream_add_server("uds-host-name", "/home/xxxxx/uds-service");

    struct RPCClientParams params = RPC_CLIENT_PARAMS_DEFAULT;
    params.host = "uds-host-name";
    Example::SRPCClient client(&params);
}

而server端直接用start(const struct sockaddr *addr, socklen_t addrlen);这个函数启动server,服务的地址在/home/xxxxx/uds-service就可以了。
非常抱歉一年多才想起来可以这么用。我们的http,redis这些协议的任务,也可以通过这个方式使用Unix domain socket。