Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
lucasjinreal opened this issue Aug 19, 2022 · 15 comments
Open

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

lucasjinreal opened this issue Aug 19, 2022 · 15 comments

Comments

@lucasjinreal
Copy link

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

@Gooddbird
Copy link
Owner

暂时还不支持 json 协议哦

@Gooddbird
Copy link
Owner

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

@lucasjinreal
Copy link
Author

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

@Gooddbird
Copy link
Owner

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

@lucasjinreal
Copy link
Author

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

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
Copy link
Owner

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

@Gooddbird
Copy link
Owner

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

@lucasjinreal
Copy link
Author

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

@Gooddbird
Copy link
Owner

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

@Gooddbird
Copy link
Owner

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

@lucasjinreal
Copy link
Author

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

@Gooddbird
Copy link
Owner

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

@lucasjinreal
Copy link
Author

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

@Gooddbird
Copy link
Owner

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

@lucasjinreal
Copy link
Author

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants