快速成长期应用架构实践 (8):系统通信

勿忘初心2018-11-15 10:06

欢迎访问网易云社区,了解更多网易技术产品运营经验


4.2.5 系统通信


1. 系统通信的应用场景 

按照应用场景,系统通信可以分为系统间和系统内部两种,从技术角度上看,两种方 式没有实质的区别。但在实际场景中,会涉及部署环境、系统兼容等问题,需要根据具体 的场景进行分析。


系统内通信:随着系统规模的增大,单体架构会越来越复杂,因此必须对原有系 统进行拆分和部署。从另外一个角度看,单点的计算能力,可靠性总是有限的, 现在的技术方案也倾向于使用集群部署来解决问题。一个系统的多个独立模块之 间要协同工作,需要模块之间的通信能力。


系统间通信:一个系统不可能完全孤立,越是复杂的系统越是如此。一个复杂系 统,除了自己的核心功能外,肯定会依赖各种外部服务来完成各种外围任务。这 就涉及与外部系统的通信问题。


系统集成的核心问题是不同系统(模块)之间通信的问题,因此,本节会介绍系统通 信所使用的主要技术、优缺点,以及在实践中如何选择。


2. 网络协议选择 

最常见的系统间通信方式是直接使用应用层协议消息集成,如图 4-11 所示。根据使用 的协议,可以分为基于 HTTP 协议的消息通信、基于 HTTPS 协议的消息通信和基于 TCP 协议的消息通信。 

图 4-11 应用层消息集成

基于 HTTP 协议的消息通信 

最常见的做法是将 HTTP 协议封装为 RESTful 风格的接口,用来处理系统间的调用。 作为系统间通信协议,HTTP 的优点十分明显。 

语言无关:HTTP 协议本身的语言无关性,可以直接在跨语言系统使用。 

格式灵活:HTTP 协议对传输内容几乎没有要求,因此用户可以方便地根据需求进 行定制和二次封装。 

良好支持:很多语言都对 HTTP 协议提供了原生支持,而几乎所有语言都有成熟 的 HTTP 第三方库。

易用性:由于 HTTP 协议的广泛使用,互联网开发人员对 HTTP 协议都有所了解。 而 HTTP 协议采用简单的请求/响应(Req/Res)模式,学习成本很低,就算不曾 接触 HTTP 协议的开发人员也很容易在项目中使用。


正是由于 HTTP 协议有着以上诸多优势,在实际应用中,HTTP 协议也成为现在应用 最为广泛的系统间通信方式。而很多第三方框架,更是在 HTTP 协议之上进行了封装,让 HTTP 协议变得更加简单易用。


但是,事情总是相对的。简单易用则表示功能单薄,格式灵活的另一面是数据臃肿, 而易使用并不等于易精通,过于广泛的使用也就意味着存在着协议滥用的情况,因此根据 具体的业务场景进行分析,选择合适的传输协议十分必要。


HTTP 协议是通过明文传输的,在互联网上毫无安全性可言,因此如果要通过外网进 行系统间通信,那么 HTTPS 协议是必要的。


基于 HTTPS 协议的消息通信 

HTTPS协议就是通过SSL/TLS加密后的HTTP协议,通过在底层使用数据加密,HTTPS 协议可以保证在使用新的协议版本(TLS 1.1 以上)和没有安全问题的加密协议的前提下, 数据是安全的。对 HTTPS 协议安全性感兴趣的读者可以自己搜索,或者直接查看官方 RFC 文档。但是,HTTPS 协议在带来了安全性的同时,也会显著降低访问效率。


与 HTTP 协议相比,HTTPS 协议采用了全链路加密,相较 HTTP 协议,HTTPS 协议的 数据量要大一些,而传输效率更低。这在建立连接时最为明显(用在协议上的时间会增加 数倍),在传输过程中,由于使用了高效的对称加密协议,因此在通信过程中效率并不会和HTTP 协议有太大差异。


HTTPS 协议使用注意事项如下。

保管好私钥,这一点非常重要,HTTPS 安全性的前提是建立在私钥不被泄露的基础上, 私钥一旦被泄露,HTTPS 的安全性就毫无意义。更为严重的是,如果没有发现私钥被泄露, 第三方攻击者就可以解析网站的任何请求。一旦私钥被泄露,除了更换密钥,没有任何办 法。考虑到网站的 HTTPS 证书大多是真金白银买来的,最后再强调一遍—保管好私钥!

HTTPS 协议配置优化。 

在使用 HTTPS 协议时,建议打开 http keepalive 功能(http 1.1 协议默认开启),这样在 使用 HTTPS 协议的时候,除了第一次建立连接的时候稍慢,之后的请求大部分都可以通过 缓存绕过握手过程,提高访问效率。


而在使用 HTTPS 服务端时,也建议打开 HTTPS 的会话重用,这样在用户多次访问的 情况下,可以大幅减少握手的次数,提高服务端资源占用。


在简单的测试中,使用 Nginx 作为服务端,在开启/关闭 HTTPS 会话重用,并且会话 未失效的情况下,服务端性能会有 7~8 倍的性能差异。在实际使用场景中,虽然不会有如 此明显的性能提升,但是效果也很明显。


基于 TCP 协议的消息通信 

无论是HTTP 协议还是 HTTPS协议,都无法解决HTTP 协议数据臃肿、效率低下的问题。

这一问题的根本原因在于,HTTP 协议(超文本传输协议 HTTP,HyperText Transfer Protocol), 就像它的名字一样,在设计之初只为了在网络上传输超文本信息而存在,并不 是为了实现服务器间通信,从另一个角度来说,现在 HTTP 协议的广泛使用,很多情况下 也是一种滥用。


因此,在那些对于有高性能和实时性要求很高的场景,使用 HTTP 方式通信并不合适, 基于传输层协议(TCP/UDP)实现应用层的消息通信更好。


与 HTTP 协议相比,TCP 协议位于更底层,是基于连接的协议。在使用上,大概可以 分为以下几种:使用针对 TCP 协议封装好的框架来实现,比如 Thrift,Netty;使用基于 TCP 之上的私有协议实现,这个在很多大小公司的设计上;使用第三方基于 TCP 的标准协议实 现,比如针对移动通信优化的 MQTT 协议,针对数据传输的 Google protobuf 协议等。

设计要点 

由于使用简单,HTTP 协议使用率很高,但也存在协议被滥用的情况。在一些需要高 性能、实时性更高的场合,基于 TCP 的通信协议则更为合适。可以根据业务场景和具体的 性能需求来选择。


无论哪种协议,对于消息的可靠性都不会有很好的保证,在实际使用中会出现数据丢 失、响应变慢的情况。对于对通信数据可靠性、数据到达有较高要求的应用,可以使用消 息队列来解决问题。


文章节选自《云原生应用架构实践》 网易云基础服务架构团队 著 


网易计算基础服务深度整合了 IaaSPaaS 及容器技术,提供弹性计算、DevOps 工具链及微服务基础设施等服务,帮助企业解决 IT、架构及运维等问题,使企业更聚焦于业务,是新一代的云计算平台。点击可免费试用