一种基于Nginx反向代理机制的微服务负载均衡方法分析

2020-11-30 01:02
无线互联科技 2020年16期
关键词:队列进程代理

赵 凯

(中国人民大学 信息学院,北京 100872)

0 引言

随着互联网应用软件的发展,具有迭代周期短、灵活性高、扩展容易等特点的微服务架构成为当下最流行的软件架构方案。微服务架构由面向服务的架构(Service-Oriented Architecture,SOA)演化而来,解决了SOA架构笨重、灵活性差的缺点,几乎成为当前互联网企业建设各类Web服务的事实标准。

互联网应用往往面对海量用户,后台的各个微服务模块需要部署在服务器或容器集群中,根据用户访问压力进行适应性的调整,以上场景对建立一个高效、易用的负载均衡服务提出迫切的需求,本研究将介绍一种基于Nginx反向代理机制的负载均衡方法。

1 微服务架构概述

微服务架构从SOA演化而来[1],借助轻量的Http协议与数据格式,克服了SOA架构笨重、改造成本高的缺点,减少了落地实际业务所面临的技术成本。微服务架构良好地满足了现代互联网应用迭代快、成本低、可伸缩等方面的需求,得到了来自企业和社区的大力支持,相关的概念和技术框架也得到了进一步发展。

微服务架构的核心在于“微”,是相对于将所有代码打包到一起的单体应用架构而言的。构建微服务的核心是要做到代码的“单一职责”,具体而言,就是按照业务对后台服务进行组件化的拆分,一个服务中除了与该服务相关的逻辑不包含其他无关代码。服务运行在不同的进程中,通过统一资源定位系统(Uniform Resource Locator,URL)进行调用,实现业务的解耦。在服务模块进行升级维护时,只需更新、重启指定服务,而不必重启整个应用,提升了维护效率与业务健壮性。

由于微服务强调“微”,需要拆分众多服务模块,有服务治理的需求,否则可能出现在不同的服务中充斥着杂乱的URL调用的局面,埋下更大的业务隐患。

服务治理的3个核心概念是服务网关、服务注册、负载均衡。服务网关抽象了微服务的公共功能,统一接入用户请求,并提供授权、路由、限流、监控、路由、日志、协议转换等功能[2];服务注册提供一种机制,使得微服务能将自身的URL、名称共享到一个公享库中;负载均衡负责将用户请求按照一定策略代理到各个活跃的服务实例上,是确保微服务可伸缩、高可用、高效率的关键机制。

2 Nginx及其反向代理机制介绍

Nginx是一个高性能的HTTP和反向代理Web服务器,由俄罗斯的伊戈尔·赛索耶夫开发,第一个公开版本0.1.0发布于2004年10月4日。Nginx采用事件驱动的多进程架构、异步网络输入输出(Input-Output,IO)机制以及极少的进程间切换设计,能够同时支持百万级别的网络连接[3]。得益于Nginx采用的多进程架构,Nginx管理进程可以在负责处理网络请求的工作进程异常退出后重新启动新的进程,从而提高Web服务器的稳定性。除此之外,主从架构结合IO多路复用的事件机制消除了以Apache和Tomcat为代表的进程模型与线程模型所带来的进程创建、销毁以及线程创建、切换和销毁等较重的操作,极大地提升了网络IO处理能力。

Nginx提供了upstream模块,用于提供反向代理服务。在接收到客户端请求时,Nginx可以不直接产生响应,而是在缓存客户端请求的基础上从upstream模块所配置的后端服务中挑选一个发送客户端请求,后端服务的响应直接回复给Nginx,Nginx在接收的同时也将响应数据发送到缓存的客户端连接上。upstream模块是借助Nginx实现负载均衡的核心,在选择后端服务时,upstream模块支持5类算法,分别是轮询及加权轮询、网际互联协议(Internet Protocol,IP)散列算法、URL散列算法、最少连接数法、最短响应时间法。

3 基于Nginx反向代理机制的微服务负载均衡方法

基于Nginx反向代理机制的微服务负载均衡技术主要内容包括:服务注册、消息队列、upstream配置动态管理和心跳。

(1)服务注册,是实现微服务架构的一个重要基础,负责记录、更新微服务组件的具体访问IP、端口、权重和其他必须内容,配合服务网关实现后端服务组件的路由、负载均衡、限流等功能。服务注册中心需要两个基本模块,一个是用作存储、共享服务组件信息的MySQL数据库;另一个是负责接收服务组件心跳包,并更新数据库的心跳监听模块。分布在不同设备进程中的服务实例通过心跳机制将自身的IP、端口、URL、负载、资源等情况以心跳包的形式发布到消息队列中,心跳监听模块从消息队列获取心跳并根据心跳包中服务ID,IP、端口、负载等信息新增一项纪录或更新已有服务纪录的心跳时间、可用状态、服务负载等信息。

(2)消息队列,是一个共享的数据通道,用于传递服务组件的心跳包、服务组件变化通知,实现各个功能模块的相互协作,降低模块耦合性。消息队列使用Kafka提供,Kafka通过发布/订阅模式可以提供可靠、快速、分布式的消息队列服务,最新的Kafka提供了流处理模块,使用Kafka提供的Stream API可以不引入额外的流计算框架的情况下实现对消息的实时处理。在这里,需要两个消息队列(Kafka中使用topic概念):topic_heartbeat作为心跳包传输的队列,topic_upstream_conf作为upstream配置项传输的队列。

(3)upstream配置动态管理,主要是根据注册中心服务组件的状态信息,自动剔除失效服务节点、增加新注册服务节点和更新各服务实例的权重,并将更新后的配置重载进入Nginx进程,自动化地依据服务注册信息及时调节整体服务组件负载均衡配置。在这里,需要两个基本功能模块:一个负责定时轮询注册中心数据库,根据各服务组件的最后心跳时间来筛选出活跃的服务组件记录,对超时未进行心跳上报的服务记录做标注。在确认有服务注册记录发生更改后,根据最新注册信息生成upstream配置文件,并将配置文件内容发送到topic_upstream_conf消息队列中。另一个是与Nginx服务器部署在同节点的topic_upstream_conf队列消息处理程序,在收到最新的配置内容后,覆盖本机提前使用Nginx自带的include命令包含在主配置文件nginx.conf中的upstream配置文件upstream.conf,并调用nginx -s reload命名,让最新的配置生效。

(4)心跳,是一种探测服务组件存活状态的机制。要求服务组件按照心跳包的数据格式每10 s发送一次心跳数据到topic_upstream_conf实现,最后一次心跳时间至今超过30 s的认定为失效服务。心跳至少需要提供发送时间、服务ID、服务URL、部署IP、端口,负载情况与资源情况等内容可以根据需要进行增补,可以配合upstream的负载均衡算法实现更细致的负载均衡控制。

上述各项技术都是非常成熟、性能稳定、被广泛应用在互联网一线业务场景中的技术或解决方案,具有技术复杂性低、改造成本低、与编程语言和平台无关的优点,既适合基于Docker的容器化服务集群,又适合基于内核虚拟机(Kernel Virtual Machine,KVM)技术的虚拟化服务集群,适应场景范围较广。

4 结语

文章对微服务架构的起源、特点和核心概念进行了说明,对高性能Web服务器Nginx及其反向代理机制进行了介绍,在此基础上,利用非常成熟的MySQL技术、Kafka技术、心跳机制设计了一个适用于基于Docker的容器化服务集群和基于KVM技术的虚拟化服务集群的负载均衡方案,并对其中关键的技术角色和信息进行了较为详细的说明。该技术具有易用性高、技术改造少、平台无关的特点,可以作为当前开源社区发布的各类微服务框架的补充,希望能为从事微服务应用研发的读者提供更多选择。

猜你喜欢
队列进程代理
队列里的小秘密
债券市场对外开放的进程与展望
代理圣诞老人
在队列里
代理手金宝 生意特别好
丰田加速驶入自动驾驶队列
复仇代理乌龟君
社会进程中的新闻学探寻
我国高等教育改革进程与反思
Linux僵死进程的产生与避免