在本文中,我将向大家展示如何使用 haProxy 从我通过 express 设置的 servler 制作一个简单的负载均衡器。
我们将有两个文件夹:
让我们使用 Express 创建一个简单的后端服务器。为此,我们创建一个名为 app 的文件夹并将其输入。
首先,我们通过说来创建我们的包结构 yarn init
。然后我们根据服务器的要求添加快递包:yarn add express。
现在我们创建一个名为 index.js 的文件并添加以下代码:
const app = require('express')();
const appid = process.env.APPID || 4000;
app.get('/', (req, res) => res.send(`APP ID: ${appid}`));
app.listen(appid, () => console.log(`listening on ${appid}`));
为了使这个 nodeJS 项目成为 docker 镜像,我们添加了 Dockerfile:
FROM node:12
WORKDIR /home/node/app
COPY / /home/node/app
RUN npm install
CMD npm run app
要创建我们的 Docker 镜像,我们运行命令:
docker image -t example-app .
什么是 HaProxy?
HAProxy(高可用性代理)是一个负载均衡器任务管理器。它提供免费和安全的服务,例如负载平衡、高可用性和许多服务的代理。
我们为 laod-balancer 创建 haproxy 文件夹,并向其中添加一个名为 haproxy.cfg 的文件:
frontend http
bind *:80
mode http
timeout connect 10s
timeout client 10s
timeout server 10s
retries 3
use_backend all
backend all
mode http
server s1 nodeapp1:4001
server s2 nodeapp2:4002
server s3 nodeapp3:4003
server s4 nodeapp4:4004
这里关键字的含义:
在 haproxy 文件夹中,我们添加 Dockerfile 文件以将此结构转换为 docker 镜像。
FROM haproxy:1.7
COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg
为了运行所有这些结构(图像),我们docker-compose.yml在外部创建文件。
version: '3'
services:
haproxy:
build: ./haproxy
container_name: haproxy
ports:
- '80:80'
nodeapp1:
image: example-app
environment:
- APPID=4001
nodeapp2:
image: example-app
environment:
- APPID=4002
nodeapp3:
image: example-app
environment:
- APPID=4003
nodeapp4:
image: example-app
environment:
- APPID=4004
当我们创建整个结构时,我们的文件夹结构应该是这样的:
> app/
> node_modules/
> Dockerfile
> index.js
> package.json
> yarn.lock
>
> haproxy/
> Dockerfile
> haproxy.cfg
>
> docker-compose.yml
我们来运行我们的图像:
docker-compose up --build
运行此命令后,我们转到http://localhost. 这里我们可以看到,每次刷新页面,APP_ID的值都会发生变化。我们已经成功完成了一个简单的负载均衡器服务。
对于更复杂的结构,您可以像这样更改 haproxy 的内容:
global
defaults http
timeout client 50s
timeout connect 50s
timeout queue 60s
timeout http-keep-alive 2m
frontend MyFrontent1
bind :80
mode http
use_backend MyBackends1 # or -> default_backend MyBackends
frontend MyFrontend2
bind :4000
mode http
use_backend MyBackends2
backend MyBackends1
mode http
server server1 nodeapp1:4001
server server2 nodeapp2:4002
backend MyBackends2
mode http
server server3 nodeapp3:4003
server server4 nodeapp4:4004
由于我们添加了另一个前端,因此我们需要将其添加到 docker-compose 中。
.
.
.
haproxy:
build: ./haproxy
container_name: haproxy
ports:
- '80:80'
- '4000:4000' # 4000 inputtan 4000 outputa aktarıyoruz
.
.
.
在这里,我们创建了两个前端和两个连接到每个前端的服务器。当你去http://localhost
刷新页面时,你可以看到你在 4001 和 4002 端口之间切换,当你去 port http://localhost/4000
时,可以看到你在 4003 和 4004 端口之间切换。