Open yeyeye0525 opened 3 years ago
本文首发于: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(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 等。
有同学会问,使用基于http协议的rest不香吗,简单方便。 如上介绍,rpc其调用协议通常包含传输协议和序列化协议。传输协议也是基于tcp实现,与http协议类似。
问题就回到为什么要使用自定义tcp协议的rpc做后端进程通信?
一是:http1.1协议报文头携带的信息过于臃肿,影响传输速度,譬如header头的信息基本不会被消费。
二是:另外伴随这业务发展,用户数、业务负责度及系统架构日崔复杂,业务服务演进到微服务架构后,需要对微服务进行服务治理。“服务发现”,"负载均衡",“熔断降级”一类面向服务的高级特性,就是rpc框架带来的优势。
直接上图吧
1.rpc核心功能
2.rpc调用过程 3.基于gw的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前端,下期见。
本文首发于: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核心功能
2.rpc调用过程 3.基于gw的rpc调用过程
nodejs实现rpc调用
如上,rpc调用过程与基于gw的rpc调用过程区别,rpc调用过程需要在业务框架获取服务端地址再进行服务调用,流程繁杂,不同的语言还需要自行实现。 使用rpcgw接入方式体验就好多了,接入方式与rest类似。 目前bigo的rpc接入就是使用该方式,对nodejs相当友好。
总结
RPC 主要用于公司内部的服务调用,性能消耗低,传输效率高,实现复杂。 HTTP 主要用于对外的异构环境,浏览器接口调用,App 接口调用,第三方接口调用等。 RPC 使用场景(大型的网站,内部子系统较多、接口非常多的情况下适合使用 RPC): 长链接。不必每次通信都要像 HTTP 一样去 3 次握手,减少了网络开销。 注册发布机制。RPC 框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作。 安全性,没有暴露资源操作。 微服务支持,就是最近流行的服务化架构、服务化治理,RPC 框架是一个强力的支撑。
参考文章:https://www.jianshu.com/p/7d6853140e13
欢迎大家留言讨论,祝工作顺利、生活愉快!
我是bigo前端,下期见。