当前位置: 首页 > news >正文

Docker之路(三)docker安装nginx实现对springboot项目的负载均衡

Docker之路(三)docker+nginx+springboot负载均衡

  • 前言:
  • 一、安装docker
  • 二、安装nginx
  • 三、准备好我们的springboot项目
  • 四、将springboot项目分别build成docker镜像
  • 五、配置nginx并且启动
  • 六、nginx的负载均衡策略
  • 七、nginx的常用属性
  • 八、总结

前言:

本文采用比较经典的方式来集成,如果想了解docker-compse方式的,请移步我的下篇文章。

一、安装docker

请参考我的这篇文章:Docker之路(一)–安装Docker

二、安装nginx

docker pull nginx

这个等同于docker pull nginx:latest,都是拉取最新的镜像版本。这里我们先不着急启动nginx,先把准备好的三个springboot项目准备好。

三、准备好我们的springboot项目

这里我用了同一个springboot项目,然后分了三个端口来打包,端口分别是8181,8182,8183,测试接口也是用的默认的,现在创建一个最新的springboot项目,会自动生成一个BaseController测试类。这里我们就用它这个默认的接口:/hello

@Controller
public class BasicController {// http://127.0.0.1:8181/hello?name=lisi@RequestMapping("/hello")@ResponseBodypublic String hello(@RequestParam(name = "name", defaultValue = "unknown user") String name) {return "Hello " + name;}
}

然后,我们分别将这个接口的返回值改一下,根据端口一一对应,这样后面nginx负载均衡的时候,我们就容易判断是否成功,具体负载到哪一个端口去了。

  • 8181–> return "Hello " + name;
  • 8182–> return “Hello 2” + name;
  • 8183–> return “Hello 3” + name;

四、将springboot项目分别build成docker镜像

  1. 修改项目为三个不同的端口分别打包,然后上传的linux,目录如下:

    	drwxr-xr-x. 2 root root       54 529 10:36 config-rw-r--r--. 1 root root      133 529 10:36 Dockerfile-rw-r--r--. 1 root root     7172 65 2024 jenkinsTest8182.jar-rw-r--r--. 1 root root     7172 65 2024 jenkinsTest8183.jar-rw-r--r--. 1 root root     7145 57 17:11 jenkinsTest.jardrwxr-xr-x. 2 root root     4096 57 16:49 lib
    
  2. 我这里用的是maven-jar-plugin而不是springboot的maven打包插件,所以目录会有所不同,springboot的会整体打包,没有lib和config这个,这里按照你自己需要来就行。如何将jar包build成docker镜像,参考我这篇文章:Docker之路(二)–用Docker部署一个Web项目。
    在本篇文章,我的Dockerfile是这样写的:如果你是springboot的打包插件,那么就只需要copy jar包为app.jar就行,不需要copy lib和config这个目录文件。

    FROM openjdk:11
    VOLUME /tmp
    #这一步需要修改jenkinsTest.jar为三个不同的jar包名称
    COPY jenkinsTest.jar app.jar
    #这里每次build我都会修改config下application.properties里面的端口
    COPY config config
    COPY lib lib
    ENTRYPOINT ["java","-jar","/app.jar"]
    
  3. build成功后看看我们的镜像:

    [root@localhost docker-nginx]# docker images
    REPOSITORY         TAG       IMAGE ID       CREATED          SIZE
    8183demo           latest    483ecd3a7fff   49 minutes ago   714MB
    8182demo           latest    c1fe57a09bc0   49 minutes ago   714MB
    8181demo           latest    3b76435d0f75   31 hours ago     714MB
    
  4. 运行这三个项目的镜像

    docker run --name 8181demo -d -p 8181:8181 8181demo
    docker run --name 8182demo -d -p 8182:8182 8182demo
    docker run --name 8183demo -d -p 8183:8183 8183demo
    

    然后看看浏览器能否访问
    在这里插入图片描述
    这里是看到是OK了的,然后就可以操作我们的nginx了。

五、配置nginx并且启动

  1. 启动前,需要将nginx的配置挂载一份到宿主机上,这样方便我们修改,而不用每次都进入容器去修改,因为容器里面vim这些指令是没有的。挂载的参数是-v(简易版)或者-mount(复杂版),这两个参数都可已实现挂载,我们后面再讨论,这里使用的是-v。

  2. -v格式: -v [宿主机绝对路径]:[容器路径],
    (1)这里我们在宿主机新建目录/home/docker-nginx,然后在将nginx默认的配置文件:nginx.conf和default.conf复制一份到/home/docker-nginx下面(这个目录最好新建,虽然可以自动生成,但是有时候会出麻烦,还有这两个文件,一定不能是空文件,不是你nginx容器启动不起来)。
    (2)从容器中copy文件:docker cp [容器名字或者id]:容器路径 宿主机路径

      docker cp mynginx:/etc/nginx/nginx.conf /home/docker-nginx/nginx.confdocker cp mynginx:/etc/nginx/conf.d/default.conf /home/docker-nginx/default.conf
    

    注意,这里容器启动才能copy,所以要不你先不挂载启动一个容器copy,要不就去搜一下默认的文件是啥(文章后面我会贴出来)。

  3. ngnix完整的启动命令:挂载两个conf文件和一个log日志目录,然后映射ngnix端口为:30001

    docker run --name mynginx \
    -v /home/docker-nginx/nginx.conf:/etc/nginx/nginx.conf \
    -v /home/docker-nginx/log:/var/log/nginx \
    -v /home/docker-nginx/default.conf:/etc/nginx/conf.d/default.conf \
    -d -p 30001:80 nginx
    
  4. 访问nginx看是否成功
    在这里插入图片描述

  5. 修改nginx配置文件。
    这里有两个文件,一个是nginx.conf和default.conf,这两者的关系是:nginx.conf包含了default.conf,这个很关键。
    (1)修改nginx.conf:因为我们用的是三个项目的集群,这里我们先将集群配置加到nginx.conf里面,使用upstream标签,后面名字随便取,我这里是demo1。上面都有注释

    user  nginx;
    worker_processes  auto;error_log  /var/log/nginx/error.log notice;
    pid        /var/run/nginx.pid;events {worker_connections  1024;
    }http {include       /etc/nginx/mime.types;default_type  application/octet-stream;log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log  main;sendfile        on;#tcp_nopush     on;keepalive_timeout  65;#gzip  on;#nginx默认配置文件,本文本案例只添加了如下配置upstream demo1 {server 172.16.72.128:8181;server 172.16.72.128:8182;server 172.16.72.128:8183;}#这行就是上面所说的,这两个文件的包含关系,在这里引用include /etc/nginx/conf.d/*.conf;
    }

    (2)修改default.conf,将我们定义的upstream demo1添加进location 标签里面去。

    server {listen       80;listen  [::]:80;server_name  localhost;#access_log  /var/log/nginx/host.access.log  main;location / {#这行就是我们作的唯一修改proxy_pass http://demo1;# root   /usr/share/nginx/html;# index  index.html index.htm;}#error_page  404              /404.html;# redirect server error pages to the static page /50x.html#error_page   500 502 503 504  /50x.html;location = /50x.html {root   /usr/share/nginx/html;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {#    proxy_pass   http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {#    root           html;#    fastcgi_pass   127.0.0.1:9000;#    fastcgi_index  index.php;#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;#    include        fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {#    deny  all;#}}

    负载均衡策略:我们什么都没有配置,用的是nginx默认的轮询策略,关于这点,我们会在后面详细讲解。

  6. 重启nginx容器查看是否实现了负载均衡

    docker container restart mynginx
    

    浏览器访问同一个URL,看看是否会负载均衡
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    这里可以看到,我请求了三次,分别返回了三个结果,然后再请求又从第一个返回,证明了我们的轮询策略是成功了的。

六、nginx的负载均衡策略

以下配置均采用本文的集群案例,介绍三种常用的。

  1. 轮询策略
    默认的策略,不需要额外配置,本文就使用默认的配置。
  2. 权重策略
    可以为某些服务器添加权重,让该服务器更多的为用户提供服务,后面添加weight字段就行。
    upstream demo1 {server 172.16.72.128:8181 weight=6;server 172.16.72.128:8182 weight=3;server 172.16.72.128:8183 weight=1;
    }
    
  3. IPHASH策略
    同一个ip一只访问同一个服务器,缺点就是服务器炸了就没法分发请求。
    upstream demo1 {ip_hash;server 172.16.72.128:8181 weight=6;server 172.16.72.128:8182 weight=3;server 172.16.72.128:8183 weight=1;
    }
    

七、nginx的常用属性

  1. down属性,标记不可用,这样就不会像这个服务器分发请求。
	upstream demo1 {server 172.16.72.128:8181 down;server 172.16.72.128:8182;server 172.16.72.128:8183;}
  1. BACKUP 备用机设置,正常情况下该服务器不会被访问.当主机全部宕机或者主机遇忙时,该服务器才会访问.
	upstream demo1 {server 172.16.72.128:8181 down;server 172.16.72.128:8182 backup;server 172.16.72.128:8183;}
  1. 宕机服务器高可用实现
    当服务器宕机时,如果访问的失败达到最大失败次数,则自动标识为down,在一定的周期之内,如果服务器恢复正常,则还会尝试访问故障机。
    max_fails=10 最大的失败次数
    fail_timeout=60s; 设定周期为60秒
	upstream demo1 {server 172.16.72.128:8181 max_fails=10 fail_timeout=60s;server 172.16.72.128:8182 max_fails=10 fail_timeout=60s;server 172.16.72.128:8183 max_fails=10 fail_timeout=60s;}

八、总结

以上就是本次文章全部内容了,都是比较简单和基础的操作,但是一些细节没注意还是容易出现问题,欢迎评论区讨论和错误纠正,我们Docker之路第四期见。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Java 程序结构 -- Java 语言的变量、方法、运算符与注释
  • Apache Spark
  • 解释一下I/O多路复用模型?
  • 单元测试覆盖率
  • 如何提高网站访问量?
  • Kafka 详解:全面解析分布式流处理平台
  • 单臂路由的配置(思科、华为)
  • linux中xterm窗口怎么调整字体大小
  • 【JMeter接口测试工具】第二节.JMeter项目实战(上)【实战篇】
  • Django 视图类
  • 以sqlilabs靶场为例,讲解SQL注入攻击原理【42-53关】
  • 【web前端】CSS样式
  • pdf分割为bmp
  • oracle删除表空间和用户命令
  • MySQL事务原理
  • 0x05 Python数据分析,Anaconda八斩刀
  • CentOS7 安装JDK
  • java 多线程基础, 我觉得还是有必要看看的
  • Java多线程(4):使用线程池执行定时任务
  • Linux快速复制或删除大量小文件
  • Mysql数据库的条件查询语句
  • swift基础之_对象 实例方法 对象方法。
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 从PHP迁移至Golang - 基础篇
  • 警报:线上事故之CountDownLatch的威力
  • 聚簇索引和非聚簇索引
  • 聊聊directory traversal attack
  • 前端之React实战:创建跨平台的项目架构
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 一个JAVA程序员成长之路分享
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ​2020 年大前端技术趋势解读
  • ​水经微图Web1.5.0版即将上线
  • #java学习笔记(面向对象)----(未完结)
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (13)DroneCAN 适配器节点(一)
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (二)windows配置JDK环境
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (七)c52学习之旅-中断
  • (七)理解angular中的module和injector,即依赖注入
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (算法设计与分析)第一章算法概述-习题
  • (一)80c52学习之旅-起始篇
  • (转)3D模板阴影原理
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • *2 echo、printf、mkdir命令的应用
  • .NET CORE使用Redis分布式锁续命(续期)问题