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值,文件名,目录】

        

  • 相关阅读:
    格式化数字,将字符串格式的数字,如:1000000 改为 1 000 000 这种展示方式
    jquery图片裁剪插件
    前端开发采坑之安卓和ios的兼容问题
    页面消息提示,上下滚动
    可以使用css的方式让input不能输入文字吗?
    智慧农村“三网合一”云平台测绘 大数据 农业 信息平台 应急
    三维虚拟城市平台测绘 大数据 规划 三维 信息平台 智慧城市
    农业大数据“一张图”平台测绘 大数据 房产 国土 农业 信息平台
    应急管理管理局安全生产预警平台应急管理系统不动产登记 测绘 大数据 规划 科教 三维 信息平台
    地下综合管廊管理平台测绘 大数据 地下管线 三维 信息平台
  • 原文地址:https://www.cnblogs.com/MXubin/p/14410407.html
Copyright © 2011-2022 走看看