zoukankan      html  css  js  c++  java
  • 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值,文件名,目录】

        

  • 相关阅读:
    linux消息队列相关操作
    linux下删除3分钟之前指定文件夹下的指定类型文件
    centos6.5安装gmime-2.6
    centos6.5安装filezilla
    posix 正则库程序
    nginx正向vs反向代理
    AbstractQueuedSynchronizer 原理分析
    JAVA NIO详解
    java NIO原理及实例
    Thread类详解
  • 原文地址:https://www.cnblogs.com/MXubin/p/14410407.html
Copyright © 2011-2022 走看看