Nacos多注册中心及集群

SpringBoot 整合Spring Cloud Alibaba Nacos注册/配置中心。多数情况一个应用系统系统只有一个注册中心,但由于微服务架构系统跨区域分布部署可能有网络延迟问题,需要考虑多注册中心方案。

Nacos作为阿里开源的注册中心和配置中心框架,以其活跃的社区和超高的性能吸引了很多开发者和公司的青睐,目前了解到的注册中心框架有Eureka、Consul、Nacos和ZK,这几种框架都各具特色,可根据公司业务和成本来具体选型,这里讨论Nacos多中心和集群方案。

一、方案1:多个注册中心

由于存在老旧基于Spring Cloud的微服务系统迁移到新注册中心问题,类似灰度发布,需要新老Nacos注册中心并存,可以通过某个SpringBoot项目同时配置多个注册中心来解决。
当然启动同一个项目的不同Pod时一部分用老配置中心,一部分用新配置中心也是个方案(注:Ali给的方案,这个是物理共存方案,同样的代码手动维护不同的配置)。
下面讨论使用同样配置但同时注册不同注册中心的更优方案。

1. 新建 bootstrap.properties 配置文件

项目本地resource目录下新建bootstrap.properties配置文件。关于SpringBoot配置文件加载顺序:bootstrap.properties>bootstrap.yml>application.yml,建议采用bootstrap.properties名称的配置文件编写配置,bootstrap 作用于应用程序的父上下文,所以优先于application加载配置文件内容。bootstrap.properties配置文件内容如下:

spring.application.name=ErbadangangAppName # 应用的名称,可自定义
spring.profiles.active=dev  # 当前有效的配置,为支持多环境配置文件,可能有test、dev、prod等多个环境

#nacos配置中心
spring.cloud.nacos.config.server-addr=ip1:port1,ip2:port2,....#nacos服务的ip和端口,支持集群
spring.cloud.nacos.config.file-extension=yaml/properties/xml #配置文件的后缀格式,不可省略
spring.cloud.nacos.config.prefix=application #配置文件DataID的前缀,若无此项配置,则默认${spring.application.name}

二、Nacos集群方式

Nacos的单节点,也就是我们最开始使用的standalone模式,配置的数据是默认存储到内嵌的数据库derby中。
如果我们要搭建集群的话,那么肯定是不能用内嵌的数据库,不然数据无法共享。集群搭建的时候我们需要将Nacos对接外部独立部署的Mysql进行数据存储。
集群模式跟我们平时进行扩容是一样的,可以通过Nginx转发到多个节点,最前面挂一个域名即可。
通过集群来解决单点问题,同时变相实现分布部署多个Nacos注册中心。

2.1主机规划

规划3个Nacos节点。示例IP及端口如下:

192.168.44.191:8848
192.168.44.192:8848
192.168.44.193:8848

2.2 配置Nacos节点信息

切换目录
cd /usr/local/nacos/conf

拷贝文件
cp cluster.conf.example cluster.conf

编辑
vim cluster.conf

加入节点信息

 192.168.44.191:8848
 192.168.44.192:8848
 192.168.44.193:8848

2.3 配置数据库节点信息

切换目录
cd /opt/module/nacos/conf

编辑
vim application.properties

加入内容【根据实际填写】
表明用MySQL作为后端存储
spring.datasource.platform=mysql

有几个数据库实例
db.num=1

第1个实例【从0开始】

db.url.0=jdbc:[mysql://192.168.44.191:3306/nacos_config?useUnicode=true&characterEncoding=UTF-8&useSSL=false](https://links.jianshu.com/go?to=mysql%3A%2F%2F192.168.44.191%3A3306%2Fnacos_config%3FuseUnicode%3Dtrue%26characterEncoding%3DUTF-8%26useSSL%3Dfalse)
db.user=root
db.password=SYS_666_admin
配置数据库信息

2.4查看集群节点信息

http://192.168.44.191:8848/nacos
http://192.168.44.192:8848/nacos
http://192.168.44.193:8848/nacos

集群管理-->节点列表

2.5 观察集群

3个节点都正常启动之后, 可以分别登录 各个web 界面查看 集群的节点、健康状态。
最开始的时候, 所有节点都没有启动, 集群任期 应该都是0

看到这个图片, 说明 3个节点都正常启动了, 否则请检查是否有步骤遗漏了!

如果我们只启动一个节点,那么它的状态会是 candidate:


处于candidate 状态的 集群会一直进行选举, 从而任期也会一直增加:


最先启动的节点, 一般就是 leader , 但这个时候还只是 准leader,需要至少多数节点都启动了, 才能做一个决断。如下面的 126:

在没有leader 产生之前, 集群会进行多次的选举。 每次的选举 任期会加1。 从而 最后会进行大概 2次的选举, 从而 126 的任期是2;最后加入的 节点已经没有了选举的机会, 故直接作为 follower 加入, 其任期默认是0;

如果某一个或某几个节点都挂了, 只要剩余节点不少于 1+ 1/N ,那么 集群仍然能够正常运行; 挂掉的节点重新加入集群后,如果此时集群已经有了leader, 那么它的角色一般是follower, 它的任期是0( 就跟一个新节点一样的);

当然,如果集群的剩余节点少于 1+ 1/N,集群仍然是可以工作的,只是已经无法保证 高可用了。

任期低节点一般是没有资格参与选举的,leader 一般是在 任期高的几个节点之中产生(至少会有2个节点)。

如果把126 的nacos 杀掉,我们会观察到 多个leader,其实这个时候的 126 已经死了, 至少集群保留它之前的状态。同时 集群会重新选举,如下,我们看到200 被选举为 leader,126 的状态被保留(其实他已经死掉了), 同时任期 +1:

在已经存在leader 的集群中,如果挂掉的节点不是 leader,那么不会重新进行选举。 挂掉的节点虽不可用(其状态会一直保留直到重启), 不会影响集群的使用。

如果我们又把 126 启动起来, 那么它的角色会是 follower,任期是0:

我们再把 200 的nacos 杀掉, 那么又会产生新的 leader:

2.6 Nacos + Docker 集群

nacos 官方 https://hub.docker.com/r/nacos/nacos-server 有提供docker 的镜像:nacos/nacos-server,我们拿来用即可:
docker run --name nacos --net=host --env MODE=cluster --env NACOS_SERVERS="192.168.11.126:8748 192.168.11.196:8748 192.168.11.200:8748" --env MYSQL_DATABASE_NUM=1 --env MYSQL_MASTER_SERVICE_HOST=192.168.11.200 --env MYSQL_MASTER_SERVICE_PORT=3316 --env MYSQL_MASTER_SERVICE_DB_NAME=test3 --env MYSQL_MASTER_SERVICE_USER=root --env MYSQL_MASTER_SERVICE_PASSWORD=123456 --env NACOS_SERVER_PORT=8848 -d -p 8748:8848 nacos/nacos-server
上面的语句即启动了 docker nacos ,同时通过env 设置了所有的相关的参数 比如数据库、端口等。 特别需要注意的是, 网络模式是 host,也就是使用直接宿主机的网络, 这个是最简单的nacos +docker 集群,否则我们可能需要做比较多的docker网络配置。 另外注意, --net=host 应该放在命令的前面, 不能放最后, 否则不会生效。

NACOS_SERVERS 是所有的节点+端口 配置,目前只能写死, nacos 不提供自动扩容等功能。

如果配置有误,我们只能删除nacos 容器,重新配置 : docker stop nacos && docker rm nacos 。

3个节点都执行上面的命令之后,我们的nacos 集群就做好了!

2.7 通过Nginx配置真正的集群

上面的集群,虽然可用, 但仍不是真正的集群, 我们一般不会这么用。官方推荐,nacos集群一般有3种方式:

  1. http://ip1:port/openAPI 直连ip模式,机器挂则需要修改ip才可以使用。
  2. http://VIP:port/openAPI 挂载VIP模式,直连vip即可,下面挂server真实ip,可读性不好。
  3. http://nacos.com:port/openAPI 域名 + VIP模式,可读性好,而且换ip方便,推荐模式

域名的方式比较麻烦,暂不考虑。vip 的方式也稍稍麻烦。 这里我使用 nginx 的方式。 nginx 做集群很简单, 只要 nginx.conf 做如下的配置就好了:

upstream nacos_server {
server 192.168.11.200:8748;
server 192.168.11.196:8748;
server 192.168.11.126:8748;
}

server {
listen 8648;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://nacos_server;
index index.html index.htm;
}
}

8648 的nginx 提供的 nacos 服务接口,可以自定义。 我们访问
192.168.11.139:8648/nacos/#/clusterManagement?dataId=&group=&appName=&namespace=&serverId=,就可以看到:

我们可以简单测试一下,杀掉 126 或 196 上的 nacos ,看服务是否正常。 后面,我们对微服务提供nacos服务的时候,只要配置这个nginx 端口就好了!!

2.8 其他注意事项

nacos 默认是需要登录, 有些麻烦,开发测试的时候,我们可以把它关闭,怎么办呢? 修改 conf/application.properties 的相关配置即可:

### turn off security
spring.security.enabled=false
management.security=false
security.basic.enabled=false
nacos.security.ignore.urls=/**

#nacos.security.ignore.urls=/,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/login,/v1/console/health/**,/v1/cs/**,/v1/ns/**,/v1/cmdb/**,/actuator/**,/v1/console/server/**

另外,我们发现 nacos 的日志实在增长太快, 可以tomcat.accesslog 关闭:

server.tomcat.accesslog.enabled=true – 改为false 

另外,我们可以把 日志级别调整一下,修改 conf/nacos-logback.xml 即可。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容