支持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(¶ms);
}
而server端直接用start(const struct sockaddr *addr, socklen_t addrlen);这个函数启动server,服务的地址在/home/xxxxx/uds-service就可以了。
非常抱歉一年多才想起来可以这么用。我们的http,redis这些协议的任务,也可以通过这个方式使用Unix domain socket。
Workflow项目里关于upstream的文档:https://github.com/sogou/workflow/blob/master/docs/about-service-governance.md