docker 应用负载均衡解决方案

article/2025/8/25 2:18:42

 

项目中使用SpringBoot开发web应用,打包部署采用docker;之前看到通过docker-compose 来扩展容器,通过scale命令来扩展容器:

docker-compose scale test-app=4

但是试了下发现直接报错了,端口冲突,因为每个docker容器都映射宿主机的8080端口,所以端口冲突了;于是通过这篇文章找到了解决办法,https://deployeveryday.com/2016/09/28/composing-docker-environments-scale.html

基本的思路是:web容器不再映射宿主机的8080端口,而是通过nginx来进行负载均衡;需要启动一个nginx容器,所有的请求都先发送到nginx,然后再进行请求的转发,比如宿主机的ip对外ip是192.168.140.5,那么请求请求192.168.140.5,nginx把请求再进行转发,根据启动了的web容器地址,比如我们扩展了3个web容器,那么nginx把请求转发到对应的一台上面去;但是这样nginx需要记录扩展了几个容器,以及对应的容器的ip,还是很麻烦的,于是文章引入了一个 nginx-proxy 镜像,它承担了nginx的功能,同时它会调用docker的api来发现现有的容器和对应的ip地址,当容器启动和停止的时候,会reload生成的nginx配置文件;

下面是完整的docker-compose.yml 文件

version: '2'
services:my-app:image: app-imageenvironment:- VIRTUAL_HOST= 172.16.140.5- SPRING_PROFILES_ACTIVE=prod,swagger- SPRING_DATASOURCE_URL=jdbc:mysql://172.16.140.5:3306/app_test?useUnicode=true&characterEncoding=utf8&useSSL=false- SPRING_DATASOURCE_USERNAME=app- SPRING_DATASOURCE_PASSWORD=123- JHIPSTER_SLEEP=10 # gives time for the database to boot before the applicationexpose:- 8080depends_on:- nginxnginx:image: jwilder/nginx-proxyvolumes:- /var/run/docker.sock:/tmp/docker.sock:ro- /mnt/aaa/nginx:/etc/nginx/conf.d/ports:- 80:80

这里的VIRTUAL_HOST指的是容器的外网访问地址,也可以是域名,比如你的web的域名是www.aaaa.com,也是可以的;docker-compose 启动之后,它会根据这个配置生成一个nginx的配置文件;下面            - /mnt/aaa/nginx:/etc/nginx/conf.d/,是将生成的nginx配置文件给挂载出来了,目的是方便我们观察调试问题,当时可以去掉,是不需要也可以工作的;之后通过下面的命令扩展出3个web容器

docker-compose -f app.yml scale my-app=3 

下面是生成的nginx的配置文件

proxy_set_header Proxy "";
server {server_name _; # This is just an invalid value which will never trigger on a real hostname.listen 80;access_log /var/log/nginx/access.log vhost;return 503;
}
# 172.16.140.5
upstream 172.16.140.5 {## Can be connected with "default" network# my-app_3server 172.19.0.5:8080;## Can be connected with "default" network# my-app_2server 172.19.0.4:8080;## Can be connected with "default" network# my-app_1server 172.19.0.3:8080;
}
server {server_name 172.16.140.5;listen 80 ;access_log /var/log/nginx/access.log vhost;location / {proxy_pass http://172.16.140.5;}
}

解释下上面的配置:server_name表示Http请求的host中有172.16.140.5这个信息的都会被proxy_pass 的upstream处理,再upstream制定了三个容器的地址去处理请求,根据负载均衡,会路由到其中的一个上面去;这个server_name是根据docker-compose 中的

- VIRTUAL_HOST= 172.16.140.5

指定的;server_name就是对应请求中如下所示的地方

在根据https://deployeveryday.com/2016/09/28/composing-docker-environments-scale.html文章配置成localhost的测试的时候,发现只能在172.16.140.5这个服务器上,通过“localhost”才可以访问,外网通过地址一直“503”错误;就是因为外网访问的时候地址中带的是172.16.140.5,然而nginx只接受localhost的访问,这个地方困惑了我好久;其实VIRTUAL_HOST参数可以任意配置,只需要你的请求host中包含这个就好了;比如

- VIRTUAL_HOST= tomcat-service

然后,使用curl -H "host:tomcat-service" 172.16.140.5也是可以访问的;curl -H 是添加请求的host信息;这样就可以了,之后先启动docker-compose -f app.yml up -d ,然后docker-compose -f app.yml scale 服务名=3 就是扩展出3个容器来;其他的不用管了,很方便有木有;需要注意的是,如果采用的是session的方式,会存在session丢失的情况,需要进行其他的配置的;推荐使用jwt的登录方式;

 

 

 


http://chatgpt.dhexx.cn/article/935v7H32.shtml

相关文章

Oracle 负载均衡解决方案

为什么要运用负载均衡 一般我们在数据库中的操作无非不就是增删改查这四个基本操作,最终数据库和磁盘文件打交道也就是读写操作。如果采用传统的一台服务器去运作,可能会在读写高峰时会出现一些无法预知的问题。这些我们或许可以通过优化应用代码结构&a…

两台web服务器实现负载均衡的解决方案

写在前面:如果此文有幸被某位朋友看见并发现有错的地方,希望批评指正。如有不明白的地方,愿可一起探讨。 总体方案 平台规划拓扑图如下: 总体解决方案: 两台web服务通过DNS实现负载均衡,共享NFS服务器&…

负载均衡的硬件与软件实现方案

一、什么是负载均衡 负载均衡是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带…

分布式及负载均衡解决方案

一、问题域 nginx、lvs、keepalived、f5、DNS轮询,每每提到这些技术,往往讨论的是接入层的这样几个问题: 1)可用性:任何一台机器挂了,服务受不受影响 2)扩展性:能否通过增加机器&…

阿里云的网站负载均衡解决方案

2015年5月,国务院印发了《关于进一步做好新形势下就业创业工作的意见》,全国范围内刮起了“大众创业,万众创新”的高潮。于是中关村电子市场悄然改成了创业大街,美食街变成了创业公社,就连公司的地下室也一夜之间成了创…

实现负载均衡的2种解决方案

注: NAT 为网络地址转移, 访问进来时, 最初以LVS将访问进行地址转移到内部的Nginx, 由 Nginx 进行负载均衡

mysql负载均衡完美解决方案

1.环境: mysql 5 ubuntu10.04 x86_64 mdb1 eth0 192.168.5.11 mdb2 eth0 192.168.5.12 sdb1 eth0 192.168.5.21 sdb2 eth0 192.168.5.22 sdb3 eth0 192.168.5.23 sdb4 eth0 192.168.5.24 haproxy…

负载均衡-

常见的负载均衡系统包括 3 种:DNS 负载均衡、硬件负载均衡和软件负载均衡。 DNS 负载均衡 DNS 是最简单也是最常见的负载均衡方式,一般用来实现地理级别的均衡。例如,北方的用户访问北京的机房,南方的用户访问深圳的机房。DNS 负…

负载均衡的解决方案

负载均衡的解决方案 前言 我们在设计分布式系统的时候往往需要考虑系统的伸缩性,这里所说的伸缩性指的是我们可以通过添加服务器节点的方式来提升我们整个系统的并发能力,这种提高伸缩性的基础原理其实就是我们所说的——负载均衡。 正文 负载均衡 …

负载均衡及解决方案

目录 一、什么是负载均衡? 二、负载均衡方案有几种? 1、基于DNS负载均衡 2、基于硬件负载均衡 3、基于软件负载均衡 三、常用的均衡算法有哪些? 1、轮询策略 2、负载度策略 3、响应策略 4、哈希策略 一、什么是负载均衡?…

吃透这份Github点赞120k的Spring全家桶笔记Offer拿到手软

Spring框架自诞生以来一直备受开发者青睐,有人亲切的称之为:Spring 全家桶。它包SpringMVC、SpringBoot、Spring Cloud、Spring Data等解决方案。 很多研发人员把spring看作心目中最好的java项目,没有之一。Spring系列包含非常多的项目&…

分布式事务及解决方案

1、分布式事务 分布式事务就是在一个交易中各个服务之间的相互调用必须要同时成功或者同时失败,保持一致性和可靠性。在单体项目架构中,在多数据源的情况下也会发生 分布式事务问题。本质上来说,分布式事务就是为了保证不同数据库的数据一致性…

负载均衡方案

负载均衡方案 1、负载均衡概念 一台普通服务器的处理能力是有限的,假如能达到每秒几万个到几十万个请求,但却无法在一秒钟内处理上百万个甚至更多的请求。但若能将多台这样的服务器组成一个系统,并通过软件技术将所有请求平均分配给所有服务…

负载均衡的多种解决方案

以下为原文 当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题。为了解决这些性能压力带来问题,我们需要在Web系统架构层面搭建多个层…

信息熵笔记

观察两个事件同时发生时获得的信息量应该等于观察到事件各自发生时获得的信息之和? 两个事件的信息量之和等于两个事件和的信息量? 两个随机变量熵的和大于两个随机变量和的熵 图片引自:https://blog.csdn.net/luoxuexiong/article/details/…

一文弄懂信息熵

引言 今天我们来探讨一下信息熵是怎么来的。 信息熵 信息的价值在于消除事件的不确定性,那事件的不确定性要怎么度量呢?答案就是信息熵(information entropy)。 比如你告诉别人你中了500万彩票,别人会大吃一惊,因为他被消除了…

信息熵 entropy

熵 最早是由热力学定义的一个函数,是普朗克来中国讲学的时候引入的。英文是“entropy”这个字,中文词汇中没有相关的字眼。当时是一个有名的姓胡的学者作为普朗克的翻译。因为这个熵“S”是定义为热量Q与温度的比值,所以当时他翻译是立刻创造…

信息熵学习笔记

简介 在信息论中,熵(entropy)是接收的每条消息中包含的信息的平均量,又被称为信息熵、信源熵、平均自信息量。 熵最好理解为不确定性的量度而不是确定性的量度,因为越随机的信源的熵越大。 比较不可能发生的事情&…

信息熵到底是什么

信息是我们一直在谈论的东西,但信息这个概念本身依然比较抽象。在百度百科中的定义:信息,泛指人类社会传播的一切内容,指音讯、消息、通信系统传输和处理的对象。 但信息可不可以被量化,怎样量化?答案当然…

什么是信息熵

熵 当一件事情(宏观态)有多种可能情况(微观态)时,这件事情(宏观态)对某人(观察者)而言具体是哪种情况(微观态)的不确定性叫做熵(entropy&#xff…