Gooddbird / tinyrpc

c++ async rpc framework. 14w+qps.
Apache License 2.0
1.26k stars 189 forks source link

问个无关问题,协议可以用json吗 #37

Open lucasjinreal opened 2 years ago

lucasjinreal commented 2 years ago

问个无关问题,协议可以用json吗

Gooddbird commented 2 years ago

暂时还不支持 json 协议哦

Gooddbird commented 2 years ago

原来是同厂的大佬,哈哈。 目前还没支持 json 协议,后续有考虑支持json格式的计划.

lucasjinreal commented 2 years ago

大佬好,意思是json也是可以是吗,protobuf感觉依赖比较麻烦哎。为啥不直接用json呢

Gooddbird commented 2 years ago

json这块我也不知道怎么弄好, 是直接 json 传数据(外面加一下自定义的包头), 还是说 http 请求体里面加 json。 我个人有点倾向于 Http 请求体里面包 json 字符串,然后服务端增加下json解析。大佬有什么高见不

lucasjinreal commented 2 years ago

老实说,我不太懂后端的东西,我搞人工智障的,这里面这个用法:

tinyrpc::TinyPbRpcChannel channel(std::make_shared<tinyrpc::IPAddress>("127.0.0.1", 39999));
QueryService_Stub stub(&channel);

假如说我有很多个API,例如login register, post_article, 之类的接口,怎么在channel里面区分啊,这channel直接就写死了一个路径

Gooddbird commented 2 years ago

channel 不需要区分,就每次调用 RPC 的时候,都需要初始化一个 TinyPbRpcChannel 对象。 如果是有多个接口,比如 login register,目前的做法是 先把 proto 文件加上这些接口, 然后调用 QueryService_Stub.login() , QueryService_Stub.register 方法就可以了

Gooddbird commented 2 years ago

你说的 channel 写死路径指的是啥啊,是指这里指定了对端服务的 ip:port吗

lucasjinreal commented 2 years ago

那比如我的客户端是flutter,我怎么在dart里面去调用login register啊

Gooddbird commented 2 years ago

抱歉,我没用过 flutter 不太懂。哈哈哈。 不过如果是外部客户端想调用 rpc 服务,我觉得rpc服务应该提供 HTTP 协议的接口这种比较规范的。 protobuf 更适用于内部服务之间的相互调用。 对外就提供HTTP

Gooddbird commented 2 years ago

或者说你期望以哪种形式调用,可以给我个简单的示例吗。

lucasjinreal commented 2 years ago

@Gooddbird 那比如说python里面,要吊用tinyrpc,有势力吗

Gooddbird commented 2 years ago

这个还没有,如果服务端是 protobuf 协议的话,目前只有 c++ 调用。 我后面看看怎么解决这个问题

lucasjinreal commented 2 years ago

但是讲道理,他不应该是与客户端无关并且跨语言的吗

Gooddbird commented 2 years ago

嗯嗯,是这样的。本身现在支持两种协议, 一种是标准的 HTTP 协议, 这个不说了,肯定是客户端无关并且跨语言的,随便什么语言都能构造HTTP请求包。这种协议一般提供给外部调用。 另外一个是自定义的 TinyPB 协议,这个协议是基于 protobuf 的。这种自定义协议由于自己扩展了一些包头,加了一些字段如起始标志符,包长度等。而且加这些字段是必要的, 因为不可能只传 protobuf 二进制的字节流,因为服务端没法解包,甚至连包的起始和结束位置都找不到。 所以这种自定义的协议,一般适用于公司内部多个服务之前相互调用。 如果要跨语言的话,这时候需要把你的协议编解码格式提供给客户端才行,比如提供一套 TinyPB 协议的编解码api接口,客户端先用api编码之后再发送才行。 我下来也看了一下其他的 RPC 实现,事实上也可以用 json 来序列化。 客户端只需要传入纯 json 字符串就行了,当然要按照一定的格式, 比如 {method: "xxx", param: "xxx"} 这种,然后服务端按这个格式解包并且进行处理。所以支持json协议也是可以的,这个我后面可以实现一下,大佬如果有兴趣的话也可以指定下或者参与进来。

lucasjinreal commented 2 years ago

如果考虑跨端夸语言的话哪种方式好一些? protobuf应该包体积更小,传输更快,json得还得反序列化肯定没有protobuf快,但json好在无依赖,protobuf对于一些比较特殊的端,例如dart,或者是对体积要求很小的APP,再加上一个protobuf的依赖感觉比较重。

业内有比较成熟的对比和应用案例吗