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之路第四期见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/23085.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot高手之路02-全局异常处理器

RestControllerAdvice 可以将响应数据返回json格式然后响应 那么开始做全局异常处理器 首先先定义一个类 package com.healer.exception;import com.healer.common.Result; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.we…

高并发系统限流原理

短时间内巨大的访问流量,我们如何让系统在处理高并发的同时还能保证自身系统的稳定性?估计有人会说,增加机器就可以了,因为我的系统架构设计就是按照分布式思想进行架构设计的,所以可以只需要增加机器就可以解决问题了…

在Unity中配置Android项目以允许HTTP流量,解决AVPro在Android平台中无法播放http视频

解决方法快速通道:拉到底,看倒数第二张图 好记性不如烂笔头 最近在使用AVpro插件播放http视频,在Editor中一切正常,然而打包在Android平台下就播放不了 AVPro在Unity中的警告: 感觉只是个警告,没引起注意…

为什么3D渲染有的模型是黑的?---模大狮模型网

在3D建模和渲染的过程中,遇到模型渲染出来是黑色的情况并不罕见。这可能是由于多种原因导致的,包括但不限于材质设置问题、灯光配置不当、渲染设置错误等。 一、材质设置问题 材质丢失或错误:如果模型在导入或创建时材质没有正确加载或设置&…

webservice、WCF、webAPI、MVC权限认证

webservice 权限认证 》》soapHeader SOAPHeader案例 服务引用下生成的服务方法参数中会自动加入一个soapHeader的参数, WEB服务引用则没有,我感觉采用WEB服务引用基于这种验证比较方便, 因为只需将soapHeader实例赋值一次就可以多次调用不…

IDC数据中心内容合规检测

摘要:电信数据中心通过实施AI数据质检方案,自动检测反馈预警,提升服务质量,保障网络合规,降低风险,增强企业竞争力。 1. 客户背景 该客户是国内领先的IDC云计算综合服务提供商,专注于为客户提供…

Vue3中的常见组件通信之v-model

Vue3中的常见组件通信之v-model 概述 ​ 在vue3中常见的组件通信有props、mitt、v-model、 r e f s 、 refs、 refs、parent、provide、inject、pinia、slot等。不同的组件关系用不同的传递方式。常见的撘配形式如下表所示。 组件关系传递方式父传子1. props2. v-model3. $r…

.NET周刊【6月第1期 2024-06-02】

国内文章 一文带你了解.NET能做什么? https://www.cnblogs.com/Can-daydayup/p/18214473 .NET是一个免费、开源、跨平台的开发平台框架,广泛应用于桌面、Web、移动、云服务、游戏、物联网、大数据和人工智能等领域开发。它支持C#、Visual Basic、F#等…

Redis 单线程问题 BigKey问题

前言 简单的redis基础类型以及常用操作我们都也已经介绍过了 现在今天我们来谈谈redis对于单线程是需要怎么理解的 以及redis假设遇见大key我们需要怎么去查询和删除呢??? redis单线程 假设有个人现在问你一个问题:redis是单线程的还是多线程的 这个问题本身就不严谨 就像问…

I.MX6ULL 串口格式化函数移植实验

系列文章目录 I.MX6ULL高精度延时实验 I.MX6ULL高精度延时实验 系列文章目录一、前言二、串口格式化函数简介三、硬件原理分析四、实验程序编写五、编译下载验证 一、前言 上一节实验实现了 UART1 基本的数据收发功能,虽然可以用来调试程序,但是功能太单…

蒙层(css)

如何在 Vue 中实现一个包含图像和蒙层效果的组件?这个组件根据某个条件显示或隐藏蒙层,用于表示图像是否已读。 1. 创建基础模板 首先,我们在模板中使用 div 包裹我们的图像组件 GraphImage,并为最外层 div 设置 position: relat…

使用Hadoop MapReduce分析邮件日志提取 id、状态 和 目标邮箱

使用Hadoop MapReduce分析邮件日志提取 id、状态 和 目标邮箱 在大数据处理和分析的场景中,Hadoop MapReduce是一种常见且高效的工具。本文将展示如何使用Hadoop MapReduce来分析邮件日志,提取邮件的发送状态(成功、失败或退回)和…

Rethinking overlooked aspects in vision-language models

探讨多模态视觉语言模型的一些有趣结论欢迎关注 CVHub!https://mp.weixin.qq.com/s/zouNu-g-33_7JoX3Uscxtw1.Introduction 多模态模型架构上的变化不大,数据的差距比较大,输入分辨率和输入llm的视觉token大小是比较关键的,适配器,VIT和语言模型则不是那么关键。InternVL-…

Ubuntu 20.04 LTS配置JDK、Git

一、配置JDK 1.1 更新系统 执行以下命令 sudo apt update 出现以下界面即为安装成功 1.2 安装openjdk-11-jdk Ubuntu20.04中没有默认JDK,执行以下指令安装,默认会自动配置一些必要环境变量 sudo apt install openjdk-11-jdk 1.3 配置环境变量&…

每天五分钟深度学习PyTorch:Tensor张量的索引和切片

本文重点 有时候当我们拥有一个Tensor张量的时候,我们可能需要获取它某一维度的信息,那么此时我们就需要索引和切片的技术,它们可以帮助我们解决这些问题。 切片操作 a是四维的,然后默认是从第一维开始取,逗号表示取不同的维度 a[:2]表示第一维取0,1,后面三维取所有 …

场外个股期权交易最新指南

场外个股期权交易最新指南 场外个股期权作为一种灵活的衍生品工具,允许投资者在特定条件下对交易所指定的股票进行买卖。相较于标准化的场内个股期权,场外个股期权为投资者提供了更大的自由度。以下是关于场外个股期权交易的基本步骤和要点:…

通信技术振幅键控(ASK)调制与解调硬件实验

一、实验目的 1. 掌握用键控法产生ASK信号的方法; 2. 掌握ASK非相干解调的原理。 二、实验内容 1. 观察ASK已调信号的波形; 2. 观察ASK解调信号的波形。 三、实验器材 1. 双踪示波器; 2. 通信原理实验箱信号源模块、③、④、⑦号模块。…

全息之镜,未来的眼镜

全息之镜,作为未来眼镜的一种设想和展望,凭借其独特的全息技术,将在未来带来全新的视觉体验和应用场景。以下是关于全息之镜未来的详细分析和展望: 一、技术原理与特点 全息之镜利用全息技术,通过干涉、衍射和折射等…

【踏雪无痕的痕六】——数学中有意思的问题

一、背景介绍 提出一个问题往往比解决一个问题更有意义,因为提出一个问题相当于提出了一个思考问题的维度;而解决一个问题是沿着这个维度将已有的知识串起来的过程 三、过程 1.数人数你会吗? 小名再第10位,小李再第15位&#…

Linux下SpringBoot项目部署(centos系统)

一、首先找到自己的sql文件,没有就从数据库挪进来 二、在Maven下打包一下(点击package),看到BUILD SUCCESS就是打包好了 三、将上面两个文件分别挪到 linux 中对应的文件,没有就创建一个(我的是spring_blog…