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

【node实战系列】rpc与http协议通讯 #64

Open
yeyeye0525 opened this issue Aug 26, 2021 · 0 comments
Open

【node实战系列】rpc与http协议通讯 #64

yeyeye0525 opened this issue Aug 26, 2021 · 0 comments

Comments

@yeyeye0525
Copy link
Contributor

yeyeye0525 commented Aug 26, 2021

file

本文首发于:https://github.com/bigo-frontend/blog/ 欢迎关注、转载。

背景

bigo前端开始推广bff,hello农场作为首个bff落地项目,历经2个月,完成了从0-1的落地实践。

【node实战系列】按照小模块拆分,从开发者的角度讲叙,如何进行bff高可用编码。

本系列文章,基于eggjs框架编码,使用ts语法,为了提升阅读体验,建议大家先了解一下eggjs。

系列文章

欢迎大家关注我们的github blog,持续更新。
https://github.com/bigo-frontend/blog/issues

rpc与http协议通讯

rpc是什么

RPC(Remote Procedure Call)远程过程调用,简单的理解是一个节点请求另一个节点提供的服务。RPC就是要像调用本地的函数一样去调远程函数。

RPC 是一种技术思想而非一种规范或协议,是一种统称。

常见 RPC 技术和框架如下:
应用级的服务框架:
阿里的 Dubbo/Dubbox、Google gRPC、Spring Boot/Spring Cloud、百度的 bRPC。

远程通信协议:RMI、Socket、SOAP(HTTP XML)、REST(HTTP JSON)。

通信框架:MINA 和 Netty。

目前流行的开源 RPC 框架还是比较多的,有阿里巴巴的 Dubbo、Facebook 的 Thrift、Google 的 gRPC、Twitter 的 Finagle 等。

rpc出现的原因

有同学会问,使用基于http协议的rest不香吗,简单方便。
如上介绍,rpc其调用协议通常包含传输协议和序列化协议。传输协议也是基于tcp实现,与http协议类似。

问题就回到为什么要使用自定义tcp协议的rpc做后端进程通信?

一是:http1.1协议报文头携带的信息过于臃肿,影响传输速度,譬如header头的信息基本不会被消费。

二是:另外伴随这业务发展,用户数、业务负责度及系统架构日崔复杂,业务服务演进到微服务架构后,需要对微服务进行服务治理。“服务发现”,"负载均衡",“熔断降级”一类面向服务的高级特性,就是rpc框架带来的优势。

rpc调用过程

直接上图吧

1.rpc核心功能

rpc核心功能
2.rpc调用过程
image
3.基于gw的rpc调用过程
基于gw的rpc调用过程

nodejs实现rpc调用

如上,rpc调用过程与基于gw的rpc调用过程区别,rpc调用过程需要在业务框架获取服务端地址再进行服务调用,流程繁杂,不同的语言还需要自行实现。
使用rpcgw接入方式体验就好多了,接入方式与rest类似。
目前bigo的rpc接入就是使用该方式,对nodejs相当友好。

const {ctx} = this;
const params = {
  bizProtocol: 'bigo', // brpc所属业务
  registerName: 'bigo_auth', // 注册名字
  fullMethodName: 'bigo.server.AuthTokenService.CheckAuthToken',
  protocol: Eprotocal.BAIDUSTD,
  payload() { // 入参序列化
    const message = new AuthToken.CheckAuthTokenReq();
    message.setToken(token);
    message.setSeqid(ctx.seqId);
    return ctx.helper.obj2base64(message.toObject());
  },
};
return await this.service.rpcgw.http.request(params);

总结

RPC 主要用于公司内部的服务调用,性能消耗低,传输效率高,实现复杂。
HTTP 主要用于对外的异构环境,浏览器接口调用,App 接口调用,第三方接口调用等。
RPC 使用场景(大型的网站,内部子系统较多、接口非常多的情况下适合使用 RPC):
长链接。不必每次通信都要像 HTTP 一样去 3 次握手,减少了网络开销。
注册发布机制。RPC 框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作。
安全性,没有暴露资源操作。
微服务支持,就是最近流行的服务化架构、服务化治理,RPC 框架是一个强力的支撑。

参考文章:https://www.jianshu.com/p/7d6853140e13

欢迎大家留言讨论,祝工作顺利、生活愉快!

我是bigo前端,下期见。

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

1 participant