Docker部署Nacos集群并用nginx反向代理负载均衡
首先找到Nacos官网给的Github仓库,里面有docker compose可以快速启动Nacos集群。
文章目录
- 一. 脚本概况
- 二. 自定义修改
- 1. `example/cluster-hostname.yaml`
- 2. `example/.env`
- 3. `env/mysql.env`
- 4. `env/nacos-hostname.env`
- 三、运行
- 四、nginx反向代理,负载均衡
- 1. 配置文件修改
- 2. 运行
一. 脚本概况
我们要运行的脚本是example/cluster-hostname.yaml,可以看到里面包含了来自外界的${NACOS_VERSION}和加载外界env文件的env_file条目,于是我们可以找到本yaml所依赖的以下文件列表:
example/.envenv/mysql.envenv/nacos-hostname.env
二. 自定义修改
1. example/cluster-hostname.yaml
找到mysql-healthcheck-test修改为
mysql:healthcheck:test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}" ]
这样做的原因是防止mysql容器测试时一直报错Access denied(password: No)
2. example/.env
在后面运行docker compose时,会加载这个文件为环境变量,填入${NACOS_VERSION}和${MYSQL_ROOT_PASSWORD}。
NACOS_VERSION=v2.3.0
MYSQL_ROOT_PASSWORD=1009
NACOS_VERSION的版本选多少可以参考Nacos官方的对照表。
官方指出Nacos有一定向下兼容性,所以选择新一点的Nacos版本也没问题,同时,某些版本的Nacos已被指出存在部分问题。
MYSQL_ROOT_PASSWORD为数据库root密码。
3. env/mysql.env
这是cluster-hostname.yaml中mysql容器使用的env_file
MYSQL_ROOT_PASSWORD=1009
MYSQL_DATABASE=nacos
MYSQL_USER=nacos
MYSQL_PASSWORD=nacos
LANG=C.UTF-8
MYSQL_ROOT_PASSWORD为数据库root密码,和上面那个保持一致
MYSQL_DATABASE为数据库名称
MYSQL_USER为数据库用户名
MYSQL_PASSWORD为用户(nacos)密码
4. env/nacos-hostname.env
这是cluster-hostname.yaml中3个nacos容器使用的env_file
PREFER_HOST_MODE=hostname
NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
SPRING_DATASOURCE_PLATFORM=mysql
MYSQL_SERVICE_HOST=mysql
MYSQL_SERVICE_DB_NAME=nacos
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_USER=nacos
MYSQL_SERVICE_PASSWORD=nacos
MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true
NACOS_AUTH_IDENTITY_KEY=2222
NACOS_AUTH_IDENTITY_VALUE=2xxx
NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789
关于docker nacos的环境变量,可以参考Nacos官方给的一张表格。
为什么
NACOS_SERVERS填的是nacos1,nacos2,nacos3,不是具体的ip地址?
为什么MYSQL_SERVICE_HOST(数据库连接地址)填的是"mysql"?
同时MYSQL_SERVICE_PORT应该填mysql容器的端口还是映射到主机的端口?
因为三个
nacos容器和一个mysql在一个docker compose文件里,也就是cluster-hostname.yaml,那么在运行这个yaml文件时,docker会默认把这个yaml里所有的容器放到一个新的bridge网络中,于是,四个容器可以通过它们在这个bridge网络里的ip互相访问,同时也可以通过hostname互相访问,如果没有指明hostname,那么默认就是服务的名称(services),比如mysql的就是mysql。同时这四个容器之间互相访问的端口是容器开放的端口,而不是映射到主机的端口。
三、运行
在根目录运行docker-compose -f example/cluster-hostname.yaml up
然后浏览器就可以访问localhost:port/nacos,port是三个nacos的8848端口映射到主机的三个端口之一。

四、nginx反向代理,负载均衡
docker pull nginx:stable下载nginx的稳定版镜像
然后用这个镜像随便启动一个容器,把里面的以下文件copy到主机,修改后做-v映射。
/etc/nginx/nginx.conf/etc/nginx/conf.d/default.conf
1. 配置文件修改
其中nginx.conf无需修改
default.conf参考以下示例
upstream nacos-cluster {server 172.29.0.3:8848;server 172.29.0.4:8848;server 172.29.0.5:8848;
}server {listen 80;listen [::]:80;server_name localhost;#access_log /var/log/nginx/host.access.log main;location / {proxy_pass http://nacos-cluster;# 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;#}
}
主要注意两个地方,一个是
upstream nacos-cluster {server 172.29.0.3:8848;server 172.29.0.4:8848;server 172.29.0.5:8848;
}
这里面写明了3个nacos容器的ip和端口,其中ip是它们处于docker bridge小局域网中的ip,以及port也是容器服务的端口,这是因为我们最后会把nginx容器也加入这个bridge网络。
用以下命令查看三个nacos的ip
C:\Users\mumu\IdeaProjects\nacos-docker>docker network ls
NETWORK ID NAME DRIVER SCOPE
fdfe3fcab913 bigdata bridge local
45d79fa3e39e bridge bridge local
2d784bdacaa1 example_default bridge local
83b9f11eccaa host host local
d138886a8b5b none null local
C:\Users\mumu\IdeaProjects\nacos-docker>docker network inspect example_default
[.....
]
另一个是
location / {proxy_pass http://nacos-cluster;# root /usr/share/nginx/html;# index index.html index.htm;}
这里的意思是把/的url请求(/的话基本就是所有请求了)全部转发到上面定义的upstream nacos-cluster服务器集群中。
这里默认是以轮询作为负载均衡的策略。
!!!分配方式Nginx的upstream支持5种分配方式,下面将会详细介绍,其中,前三种为Nginx原生支持的分配方式,后两种为第三方支持的分配方式:1、轮询 轮询是upstream的默认分配方式,即每个请求按照时间顺序轮流分配到不同的后端服务器,如果某个后端服务器down掉后,能自动剔除。upstream backend {server 192.168.200.131:8848;server 192.168.200.131:8849;server 192.168.200.131:8850;}
2、weight 轮询的加强版,即可以指定轮询比率,weight和访问几率成正比,主要应用于后端服务器异质的场景下。upstream backend {server 192.168.200.131:8848 weight=1;server 192.168.200.131:8849 weight=2;server 192.168.200.131:8850 weight=3;}
3、ip_hash 每个请求按照访问ip(即Nginx的前置服务器或者客户端IP)的hash结果分配,这样每个访客会固定访问一个后端服务器,可以解决session一致问题。upstream backend {ip_hash;server 192.168.200.131:8848;server 192.168.200.131:8849;server 192.168.200.131:8850;}
4、fair fair顾名思义,公平地按照后端服务器的响应时间(rt)来分配请求,响应时间短即rt小的后端服务器优先分配请求。upstream backend {server 192.168.200.131:8848;server 192.168.200.131:8849;server 192.168.200.131:8850;fair;}
5、url_hash与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下。upstream backend {server 192.168.200.131:8848;server 192.168.200.131:8849;server 192.168.200.131:8850;hash $request_uri;hash_method crc32;}其中,hash_method为使用的hash算法,需要注意的是:此时,server语句中不能加weight等参数。
2. 运行
参考以下命令运行(cmd版)
docker run -id --name=nacos_nginx ^
-p 80:80 ^
-v C:\Users\mumu\IdeaProjects\nacos-docker\nginx\nginx.conf:/etc/nginx/nginx.conf ^
-v C:\Users\mumu\IdeaProjects\nacos-docker\nginx\conf.d\default.conf:/etc/nginx/conf.d/default.conf ^
-v C:\Users\mumu\IdeaProjects\nacos-docker\nginx\logs:/var/log/nginx ^
-v C:\Users\mumu\IdeaProjects\nacos-docker\nginx\html:/usr/share/nginx/html ^
--network example_default ^
nginx:stable
最后,访问localhost/nacos就可以访问nginx,nginx会通过负载均衡的策略将你的请求重定向到nacos集群中的某一个。
相关文章:
Docker部署Nacos集群并用nginx反向代理负载均衡
首先找到Nacos官网给的Github仓库,里面有docker compose可以快速启动Nacos集群。 文章目录 一. 脚本概况二. 自定义修改1. example/cluster-hostname.yaml2. example/.env3. env/mysql.env4. env/nacos-hostname.env 三、运行四、nginx反向代理,负载均衡…...
C++STL的stack和queue(超详解)
文章目录 前言stack栈的题目最小栈JZ31 栈的压入、弹出序列150. 逆波兰表达式求值 stack的模拟实现queue的模拟实现dequedeque底层设计 前言 栈和队列这一块其实有数据结构的基础,学起来非常简单。 stack 栈的成员函数就这么写,除了emplace其他都已经非…...
【C语言实现windows环境下Socket编程TCP/IP协议】
C语言实现windows环境下Socket编程TCP/IP协议 主要是记录解决一些在我本地编译运行时出现的问题connect :No error关于头文件关于stray /xxx和socket:No error问题千万记得是服务器先启动哦,客户端后启动下面附上我改好的代码 主要是记录解决…...
CGAL的3D简单网格数据结构
由具有多个曲面面片的多面体曲面生成的多域四面体网格。将显示完整的三角剖分,包括属于或不属于网格复合体、曲面面片和特征边的单元。 1、网格复合体、 此软件包致力于三维单纯形网格数据结构的表示。 一个3D单纯形复杂体由点、线段、三角形、四面体及其相应的组合…...
正则表达式(9):扩展正则表达式
正则表达式(9):扩展正则表达式 小结 本博文转载自 前文中一直在说,在Linux中,正则表达式可以分为”基本正则表达式”和”扩展正则表达式”。 我们已经认识了”基本正则表达式”,现在,我们来认…...
静态SOCKS5:了解基本概念和协议
SOCKS5是一种网络协议,是SOCKS协议的第五个版本,它提供了一种安全的、加密的网络连接,可以帮助用户在互联网上保护自己的隐私和安全。静态SOCKS5是指使用静态IP地址和端口的SOCKS5代理服务器,这种代理服务器可以提供更稳定、更快速…...
用23种设计模式打造一个cocos creator的游戏框架----(十二)状态模式
1、模式标准 模式名称:状态模式 模式分类:行为型 模式意图:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 结构图: 适用于: 1、一个对象的行为决定于它的状态,并且它必须…...
js 转换为数组并返回(Array.of())
Array提供了方法直接将一组值转换为数组并返回 Array.of()方法 Array.of(1,2,3) 结果...
git上传文件夹后打不开,有@.....
这种情况是你上传的这个文件夹也是个git仓库,需要删除.git文件。 如果你删除.git文件后,上传git还是不行,文件夹还是…,那就需要清理以下整个项目的缓存: git rm -r --cached ....
31、应急响应——Windows
文章目录 一、账户排查1.1 登录服务器的途径1.2 弱口令1.3 可疑账号 二、网络排查三、进程排查四、注册表排查五、内存分析 一、账户排查 1.1 登录服务器的途径 3389smb 445httpftp数据库中间件 1.2 弱口令 弱口令途径:3389、smb 445、http、ftp、数据库、中间件…...
QT linux下使用Qt Creator调试附加进程,加快调试
文章目录 一、调试附加进程二、配置流程(1)开放linux内核配置项(2)命令行直接启动程序(3)调试附加到进程 一、调试附加进程 使用附加进程调试要比直接调试速度要快,但是不足之处是,…...
IDEA Maven项目如何引用本地jar包,并打包发布
jar包位于当前路径下的lib目录中 引入所需要的配置 查看当前jar包的相关信息 包的引入,需要使用到当前包的artifactId, groupId, version 需要到包的/META-INF/maven/ 下面的 pom.xml 文件里面找 在Maven构建项目时,生成的依赖包中的/META-INF/maven目录存放了一些…...
Unity中Batching优化的GPU实例化(3)
文章目录 前言一、UNITY_SETUP_INSTANCE_ID(v);二、在UnityInstancing.cginc文件中,看一下Unity这句话做了什么1、使用了该 .cginc 后,会自动预定义该函数2、需要满足GPU实例化条件,才会执行对应语句3、满足GPU实例化后,主要执行的…...
Web应用JSON数据保护(密码算法、密钥、数字签名和数据加密)
1.JSON(JavaScript Object Notation) JSON是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据。JSON通过简单的key-value键值对来描述数据,可以被广泛用于网络通信、数据存储等各种应用场景࿰…...
【软件安装】VMware安装Centos7虚拟机并且设置静态IP,实现Windows和Centos7网络互相访问
这篇文章,主要介绍VMware安装Centos7虚拟机并且设置静态IP,实现Windows和Centos7网络互相访问。 目录 一、VMware安装Centos7 1.1、下载Centos7镜像 1.2、安装Centos7系统 二、设置静态IP地址 2.1、查看虚拟机网络IP 2.2、禁用NetworkManager服务 …...
203. 移除链表元素
203. 移除链表元素 https://leetcode.cn/problems/remove-linked-list-elements/description/ 方法一:迭代 迭代遍历链表 注意:这里的head是指向第一个节点的(首元节点),并没有一个虚拟的头节点,所以这…...
最新鸿蒙HarmonyOS4.0开发登陆的界面1
下载deveco-studio 说明一下,本人只是学习中,现在只是拿着vue及uniapp的经验在一点一点的折腾,不过现在看来,鸿蒙入门并不是很难。也许是自己没有深入下去。 https://developer.harmonyos.com/cn/develop/deveco-studio#download…...
【模型训练】目标跟踪
【模型训练】目标跟踪...
zabbix——实现高效网络监控
在当今的数字化时代,网络和服务器的健康状况对于企业的正常运营至关重要。为了及时发现和解决潜在的问题,许多企业选择使用网络监控工具来追踪服务器的性能和网络参数。其中,Zabbix是一个功能强大且开源的网络监控工具,被广泛应用…...
LeetCode力扣每日一题(Java):58、最后一个单词的长度
一、题目 二、解题思路 1、我的思路 先将字符串转换成字符数组 由于我们需要获取最后一个单词的长度,所以我们从后往前遍历字符数组 我们还需判断所遍历的字符是不是字母,即判断每个字符对应的ASCII值即可,用计数器count来储存单词长度 …...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...
【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权
摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题:安全。文章将详细阐述认证(Authentication) 与授权(Authorization的核心概念,对比传统 Session-Cookie 与现代 JWT(JS…...
云安全与网络安全:核心区别与协同作用解析
在数字化转型的浪潮中,云安全与网络安全作为信息安全的两大支柱,常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异,并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全:聚焦于保…...
ui框架-文件列表展示
ui框架-文件列表展示 介绍 UI框架的文件列表展示组件,可以展示文件夹,支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项,适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...
