OpenResty 动态负载均衡

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenResty 动态负载均衡相关的知识,希望对你有一定的参考价值。

参考技术A

在之前提到的OpenResty/nginx的负载均衡当中,当服务器启动之后,upstream中的上游服务器就是固定死的了,做不到动态的变更。这里面说到的变更,其实更多指的是增加机器。因为当上游服务器不可用时,upstream会自动将服务器摘除,但是当新增服务器时,upstream就做不到了。传统的负载均衡办法,就是能是修改配置,然后重启服务。下面介绍一下动态负载均衡的方式,一种是通过动态重启服务;另外一种是通过代码的方式动态拉取服务器列表。

Consul是一个分布式服务注册与发现系统。这里面使用Consul来管理上游服务器,当服务器启动时将其注册到注册中心去,当服务关闭时从注册中心列表中剔除。这里面需要注意一点的是:当上游服务器关闭时,Consul本身不会自动从列表中剔除,而是需要在服务器关闭前主动向Consul发起删除服务。

Consul有以下特性:

通过Consul可以获取到upstream中的上游服务器列表,下面要做的事情就是生成upstream中的模板了。这里就需要用到Consul-templete,它可以使用HTTP长轮询实现变更触发和配置更改。从而可以根据Consul服务器列表动态生成配置文件,然后去重新启动OpenResty/Nginx即可。

Consul+Consul-templete 就如上面所说的,是一种监听服务器列表变更,然后动态生成upstream模板,重启服务器。

Consul-Server

笔者使用的是MAC,下面所进行的操作都是基于MAC系统的。首先需要安装Consul如下:

安装完成之后,可以通过如下命令启动Consul服务:

启动完成之后,可以通过如下地址:localhost:8500/ui。访问Consul的Web界面:

可以使用HTTP的方式向Consul注册一个服务:

Consul-template

Consul-template的作用是生成upstream配置模板,安装命令如下:

然后在nginx.conf同级目录下创建moguhu_server.ctmpl

重启OpenResty脚本如下:reboot.sh

然后nginx.conf配置如下:

上游服务器

上游服务器upstream中使用的是Spring Boot实现的,其核心代码如下所示:

笔者在实验时,Consul版本的问题,造成在JVM停止时,没有执行删除服务的操作。因此附上下面的pom依赖

测试验证

1、启动Consul

2、启动Consul-template

3、启动2台upstream服务器

然后你会发现在nginx.conf的同级目录下生成了moguhu_server.conf文件,内容如下:

当手动停掉一台服务器时,配置又会变更为如下:

此时reboot.sh脚本会自动触发执行,如下所示:

上面的方式实现动态负载均衡在配置较多的时候会有一些问题,比如配置较多时,OpenResty重启的速度就会变慢。所以通过Lua脚本的方式可以规避掉重启这一步骤。

使用Lua实现时,与上面的组件相比Consul-templete就不需要了。通过Consul的 http://127.0.0.1:8500/v1/catalog/service/moguhu_server 接口就可以获取到服务的列表,如下所示:

这一方式当中主要就是OpenResty里面的相关配置。

OpenResty 配置

upstreams.lua

nginx.conf

上面通过balancer_by_lua_block去动态的设置了,upstream的服务器列表。然后启动OpenResty就可以了。

参考:《亿级流量网站架构核心技术》

以上是关于OpenResty 动态负载均衡的主要内容,如果未能解决你的问题,请参考以下文章

负载均衡基于Cookie OpenRest+tomcat+php+memcache+Jsp

openresty用haproxy2.0实现负载均衡

apache_conf openresty负载均衡下的特殊应用 - 特定请求转发所有后端主机

死磕nginx系列--使用upsync模块实现负载均衡

死磕nginx系列--使用upsync模块实现负载均衡

9.Kong入门与实战 基于Nginx和OpenResty的云原生微服务网关 --- 高级进阶