bigo-frontend / blog

👨🏻‍💻👩🏻‍💻 bigo前端技术博客
https://juejin.cn/user/4450420286057022/posts
MIT License
129 stars 9 forks source link

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

Open yeyeye0525 opened 3 years ago

yeyeye0525 commented 3 years ago

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前端,下期见。