这样的场景:具有高并发性和高性能的后台服务往往有多个不同的应用程序服务。问题是,您将如何设计架构?为了共享稳定有效的网络处理功能,所有服务都是在一个进程中编写的。

那么悲剧就会上演,如果每个模块都是多人协作开发,那么网络库的作者必须找到一种方法,为每个应用程序设计一种插件机制,无论是人员还是代码非常严重地耦合在一起,极大地影响了合作、开发效率,后来添加或删除一个应用程序也需要做大量的工作。这是可以接受的。问题是,编写应用程序的人的技术标准可能不均衡,而短板可能会导致整个服务崩溃。

相互依赖太严重,效率低,责任推诿使各种协作者受害,每个应用服务的作者决定在各自的服务中分别提供网络模块。每个应用服务提供商都提供自己的网络功能模块。

那么悲剧就来了,要知道高性能的网络服务模块所需要的技术内容并不是每个人都能写好,即使我们能够很好的写好或者统一使用一个牛X网络库,你向客户公开这么多的服务地址也是不烦人的,甚至在我身边也用一个专用的写集中的服务为客户端获取每个应用服务的地址设计。

通过对上述两种设计的批评,你会否认为这个建筑的缺陷是明显的,肯定很少有人采用,但老实说,我曾多次遇到这种设计,也许是从不同的角度来看,在上述情况下,我对上述两种设计持否定态度。

那么,我们应该使用什么样的设计来适应这种情况呢?

如下图所示,这是腾讯和微信背景设计架构的一部分。

您可以看到有一个访问服务,然后将不同的请求分发给不同的应用服务。实际上,这种访问服务是”网关服务”,这种设计反映在nginx的负载平衡和反向代理功能中,此外,这种设计思想也被广泛应用于网络游戏服务器,网关服务器将不同的请求分发给不同的应用服务,然后经过处理后通过网关服务器转发给客户端。

那么,这种设计的优点是什么呢?借用王明宇的比喻:

把服务器看作是一家没有网关服务器的酒店,就像每个厨师都为一桌顾客服务一样,从点菜到做饭再到收银台,n名厨师只能为n桌的顾客服务。有了网关服务器,网关服务器就变成了一个强大的服务生,问候、点菜、服务和出纳员的工作都完成了,厨师只需要专注于烹饪。这样,酒店的效率就大大提高了。

这样,想要执行高并发性和高性能任务的网络服务就可以独立完成并得到加强(对于HTTP协议的场景,nginx可以直接用作网关服务器)。这样,每个应用程序只需要集中处理业务逻辑。在技术架构和项目协作方面实现了解耦。系统的健壮性得到增强,一个应用程序的故障不会影响其他应用程序。在稍后阶段,操作和维护人员也会使灰色级别发生变化。在应用程序集群的情况下,您可以通过网关服务器平衡负载,并以低负载将请求分发给服务器。

引用游戏公司对网关服务器的评估:

服务器架构

带有网关的服务器体系结构用于将客户端与游戏服务器隔离开来,与传统的客户机-服务器直接连接体系结构相比,游戏服务器具有以下优点:

主要内容如下:

(1)作为网络通信的中转站,它负责维护和隔离内部网络与外部网络,使外部无法直接访问内部服务器,保证内部网络服务器的安全,在一定程度上减少插件的攻击。

(2)网关服务器负责解析数据包、加密和解密、超时处理和某些逻辑处理,以便预先过滤错误数据包和非法数据包。

(3)客户端程序只需与网关服务器建立连接即可进入游戏,而不需要与其他游戏服务器同时建立多个连接,从而节省了客户端和服务器程序的网络资源开销。

服务器是高度模块化的:前厅服务器将登录、用户信息、房间信息、日常任务、道具、银行、竞赛、排名、活动、网站等11个功能组合成11个独立的服务终端模块,模块之间不会相互影响,即使模块错误不会影响整体情况,提高服务器的稳定性;与子模块并行的新功能可以自由添加和挂载,扩展性强。