docker+nginx+consul+swoft 实现动态负载均衡

一. 安装docker

  https://www.runoob.com/docker/centos-docker-install.htmlhttps://www.runoob.com/docker/centos-docker-install.html

二. 拉取镜像文件

  1. dockerhub 拉取 nginx、consul、swoft 镜像

    例:docker pull  centos:centos6.8

  2. 安装docker-compose 编写docker-compose文件使用 docker-compose up命令生成容器、指定端口、映射目录、自定义IP地址

    # 编排php,redis,nginx容器

    version: "3.6" # 确定docker-composer文件的版本
    services: # 代表就是一组服务 - 简单来说一组容器
      swoft_110: # 这个表示服务的名称,课自定义; 注意不是容器名称
        image: swoft/swoft # 指定容器的镜像文件
        container_name: swoft_110 # 这是容器的名称
        networks: ## 引入外部预先定义的网段
          swoft_consul:
            ipv4_address: 182.168.44.31 #设置ip地址
        privileged: true # 执行特殊权限的命令
        volumes: # 配置数据挂载
          - /www/wwwroot/swoft:/var/www/swoft
        working_dir: /var/www/swoft #工作目录
      swoft_120: # 这个表示服务的名称,课自定义; 注意不是容器名称
        image: swoft/swoft # 指定容器的镜像文件
        container_name: swoft_120 # 这是容器的名称
        networks: ## 引入外部预先定义的网段
          swoft_consul:
            ipv4_address: 182.168.44.32 #设置ip地址
        privileged: true # 执行特殊权限的命令
        volumes: # 配置数据挂载
          - /www/wwwroot/swoft:/var/www/swoft
        working_dir: /var/www/swoft #工作目录
      swoft_130: # 这个表示服务的名称,课自定义; 注意不是容器名称
        image: swoft/swoft # 指定容器的镜像文件
        container_name: swoft_130 # 这是容器的名称
        networks: ## 引入外部预先定义的网段
          swoft_consul:
            ipv4_address: 182.168.44.33 #设置ip地址
        privileged: true # 执行特殊权限的命令
        volumes: # 配置数据挂载
          - /www/wwwroot/swoft:/var/www/swoft
        working_dir: /var/www/swoft #工作目录
      nginx: # 这个表示服务的名称,课自定义; 注意不是容器名称
        image: nginx1.17 # 指定容器的镜像文件
        ports: # 配置容器与宿主机的端口
          - "81:80"
        networks: ## 引入外部预先定义的网段
          swoft_consul:
            ipv4_address: 182.168.44.20 #设置ip地址
        container_name: nginx # 这是容器的名称
        volumes: # 配置数据挂载
          - /www/wwwroot/srm_swoft/nginx:/nginx
      consul: # 这个表示服务的名称,课自定义; 注意不是容器名称
        image: consul1.4 # 指定容器的镜像文件
        ports: # 配置容器与宿主机的端口
          - "8500:8500"
        networks: ## 引入外部预先定义的网段
          swoft_consul:
            ipv4_address: 182.168.44.30 #设置ip地址
        container_name: consul # 这是容器的名称
        command: ./consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node=ali -bind=182.168.44.30 -ui -client=0.0.0.0
    # 设置网络模块
    networks:
    # 自定义网络
      swoft_consul:
        driver: bridge
        ipam: #定义网段
          config:
            - subnet: "182.168.44.0/24"

三. 创建nginx swoft 的挂载目录,开放 nginx 81端口 consul8500端口 或者关闭防火墙

  (swoft访问使用nginx转发不需要开放端口,docker容器实现通讯两种方式 1.端口映射(对外)2.自定义IP地址(对内))

  1. 在srm_swoft目录下创建 nginx目录

  2. www/wwwroot/srm_swoft/nginx 下创建 logs、conf 两个目录

  3. logs 下创建error.log 空文件  conf目录下创建 nginx.conf 自定义配置 swoft_servers.conf 空文件(用作nginx upsync动态异步获取consul数据填写)

  4. nginx.conf 文件配置

      upsync_timeout 超时时间

      upsync_interval 定时获取时间

      worker_processes 4;
      worker_cpu_affinity auto; #自动绑定cpu跟进程的关系
      events {
        worker_connections 100000; #设置单个worker连接数
      }
      error_log /nginx/logs/error.log;
      http {
        default_type application/octet-stream;
        sendfile on;

        upstream swoft_server {
          server 182.168.44.31:18306 max_fails=2 fail_timeout=30s;
          upsync 182.168.44.30:8500/v1/kv/upstreams/swoole_test upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=on;
          upsync_dump_path /nginx/conf/swoft_servers.conf;
          include /nginx/conf/swoft_servers.conf;
        }

        server {
          listen 80;
          server_name localhost;

          root /www;

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

四. swoft 创建一个方法 自定义注解(路由)(查看swoft官网 https://www.swoft.org/documents/v2/basic-components/annotation/)

   

 

  因此我的路由地址为 http://192.168.44.3:81/test

 

 五. 启动五个容器 nginx consul swoft110 swoft120 swoft130

  使用docker-compose启动容器 命令:docker-compose start

 六. consul添加服务数据

  curl -X PUT -d '{"max_fails":2,"fail_timeout":10}' http://182.168.44.30:8500/v1/kv/upstreams/swoole_test/182.168.44.31:18306
  curl -X PUT -d '{"max_fails":2,"fail_timeout":10}' http://182.168.44.30:8500/v1/kv/upstreams/swoole_test/182.168.44.32:18306
  curl -X PUT -d '{"max_fails":2,"fail_timeout":10}' http://182.168.44.30:8500/v1/kv/upstreams/swoole_test/182.168.44.33:18306

  curl命令在本机执行 所以 182.168.44.30 自定义IP地址可以访问到 访问结果返true 进入consul 界面查看 地址 192.168.44.3:8500

  

  添加成功

 

 

 七. 测试是否设置成功 浏览器访问地址 http://192.168.44.3:81/test

  第一次访问

    

 

  第二次访问

    

 

  第三次访问

    

 

  由此一个docker+nginx+consul+swoft动态负载均衡就完成了就搭建完成了

  可以尝试在consul中新增服务器k/v 刷新浏览器 观察是否动态添加服务器成功

 

实操过程中可能遇见的问题

  注册失败,【服务启动,无法访问,配置文件为空】

  服务启动:docker log 容器id

  无法访问:先检测所以服务是否正常启动,docker top

  配置文件为空:consul获取存在问题 ,【检查consul服务信息,consul k值,文件名,目录】

 

    

posted on 2021-02-18 01:24  旭彬  阅读(135)  评论(0编辑  收藏  举报