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/.env
  • env/mysql.env
  • env/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.yamlmysql容器使用的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/nacosport是三个nacos8848端口映射到主机的三个端口之一。
在这里插入图片描述

四、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就可以访问nginxnginx会通过负载均衡的策略将你的请求重定向到nacos集群中的某一个。

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

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

相关文章

收款码在线生成系统源码/开源layui前端框架/附多套前端UI模板/三合一收款码生成系统源码

源码简介: 收款码在线生成系统源码,它是采用开源layui前端框架,并且它附多套前端UI模板,作为三合一收款码生成系统源码,界面简洁大方。 Layui前端的多合一收款码在线生成系统源码,附带了多套精美的前端UI…

EnlightenGAN论文阅读笔记

EnlightenGAN论文阅读笔记 论文是2019年IEEE的EnlightenGAN: Deep Light Enhancement without Paired Supervision.这篇论文是低光增强领域无监督学习的开山之作。 论文链接如下:arxiv.org/pdf/1906.06972.pdf 文章目录 EnlightenGAN论文阅读笔记出发点**出发点1**&…

阻塞队列底层原理分析(一)

文章目录 一、阻塞队列介绍1. Queue接口2. BlockingQueue接口3. 阻塞队列特性 二、 ArrayBlockingQueue1. 简介3. 使用3. 底层原理 三、LinkedBlockingQueue(使用最多的阻塞队列)1. 简介2. 使用3. 底层原理4. LinkedBlockingQueue与ArrayBlockingQueue对…

原创改进|多策略融合的改进蜣螂优化算法

作者在前段时间的一篇文章中介绍过了蜣螂优化算法(dung beetle optimizer,DBO)的原理及实现,该算法是由东华大学沈波教授团队在2022年提出[1],其灵感来自蜣螂的滚球、跳舞、觅食、偷窃和繁殖行为这5种习性,其不同的子种群执行了不…

论文阅读三——端到端的帧到凝视估计

论文阅读三——端到端的帧到凝视估计 主要内容研究问题文章的解题思路文章的主要结构 论文实验关于端到端凝视估计的数据集3种基线模型与EFE模型的对比在三个数据集中与SOTA进行比较 问题分析重要架构U-Net 基础知识 主要内容 文章从端到端的方法出发,提出了根据he…

西南交通大学【数据结构实验8】

实验内容及要求: 编写控制台应用程序,提供以下菜单项: 插入元素 从键盘输入若干两两互不相同的非0整数,直到输入0时停止。将输入的所有非0整数按输入次序插入二叉排序树(初始时是空树)。 插入某个非0整数时,若该整…

MySQL笔记-第11章_数据处理之增删改

视频链接:【MySQL数据库入门到大牛,mysql安装到优化,百科全书级,全网天花板】 文章目录 第11章_数据处理之增删改1. 插入数据1.1 实际问题1.2 方式1:VALUES的方式添加1.3 方式2:将查询结果插入到表中 2. 更…

Latex/Overleafc插入eps格式图片不显示、png转eps等解决问题

最近在搞论文,有些程序生成的图片大部分为png格式,但很多期刊要求eps矢量图格式,特此整理下遇到的各种坑,虽然不算什么技术问题,但是确实也浪费了不少时间。。。 1. png转eps在线神器: 【cloudconvert】 …

Python从入门到精通九:Python异常、模块与包

了解异常 什么是异常 当检测到一个错误时,Python解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的“异常”, 也就是我们常说的BUG bug单词的诞生 早期计算机采用大量继电器工作,马克二型计算机就是这样的。 19…

Redis生产实战-热key、大key解决方案、数据库与缓存最终一致性解决方案

生产环境中热 key 处理 热 key 问题就是某一瞬间可能某条内容特别火爆,大量的请求去访问这个数据,那么这样的 key 就是热 key,往往这样的 key 也是存储在了一个 redis 节点中,对该节点压力很大 那么对于热 key 的处理就是通过热…

【JVM从入门到实战】(四)类的生命周期

什么是类的生命周期 类的生命周期描述了一个类加载、连接、初始化、使用、卸载的整个过程 一个类完整的生命周期如下: 加载阶段 加载阶段第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息。 程序员可以使用Java代码拓展的不同的渠道…

CentOS7安装MySQL8.0

一、使用Yum安装 1. 使用wget下载MySQL的rpm包 wget https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm2. 安装下载好的rpm包 yum localinstall mysql80-community-release-el7-3.noarch.rpm 3. 安装mysql(该步可能出现问题) yum…