实现负载均衡

一、前言

分布式架构(一)中,我们通过编排工具docker-compose,创建了一组服务,其中:

服务容器 IP 对宿主机暴露的端口号 作用
宿主机 192.168.78.104 提供对外访问
swoft_110 172.22.22.110 18110 提供业务服务
swoft_120 172.22.22.120 18120 提供业务服务
swoft_130 172.22.22.130 18130 提供业务服务
nginx1.21 172.22.22.20 81 提供代理服务、负载均衡
consul1.10 172.22.22.30 8500 提供服务注册、发现,配合Nginx提供动态负载均衡

本节,会先介绍单纯的Nginx负载均衡,下一节会介绍使用consul配合Nginx进行动态负载均衡。

 

二、编辑Nginx配置文件 nginx.conf

worker_processes  4;
worker_cpu_affinity auto;  #自动绑定cpu跟进程的关系
events {
    worker_connections  100000; #设置单个worker连接数
}

error_log  logs/error.log  error;

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    upstream swoft_server {
        server 172.22.22.110:18306 max_fails=2 fail_timeout=30s;
        server 172.22.22.120:18306 max_fails=2 fail_timeout=30s;
        server 172.22.22.130:18306 max_fails=2 fail_timeout=30s;
    }

    server {
        listen       80;
        server_name  localhost;

        root /www;

        location / {
            proxy_pass http://swoft_server;
        }
    }
}

 

三、访问宿主机IP:81,查看结果

为了验证确实是已经负载均衡了,可以在swoft框架中的app/Http/Controller/HomeController.php文件中,添加一个test方法,输出提供服务的ip

    /**
     * @RequestMapping("/test")
     */
    public function test()
    {
        exec("ifconfig", $out, $stats);
        return $out;
    }

这时,访问192.168.78.104:81/test,连续访问三次,会依次得到结果

inet 172.22.22.110
inet 172.22.22.120
inet 172.22.22.130

证明现在已经实现了负载均衡。

首先,通过宿主机访问81端口,因为宿主机的81端口映射着nginx容器的80端口,所以实际上访问的是nginx容器的80端口。

之后,nginx又做了一次负载均衡,由于没有设置权重和hash等,所以是轮询访问upstream中配置的ip地址,也就是三台swoft服务。

这里需要注意的是宿主机已经关掉了防火墙或开放了81端口,否则会访问不了。