nacos学习笔记

一、nacos单机部署实战

1.nacos概述

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以**“服务”**为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

Nacos 支持几乎所有主流类型的**“服务”**的发现、配置和管理:
	- Kubernetes Service
	- gRPC
	- Dubbo RPC Service
	- Spring Cloud RESTful Service


Nacos官网地址:
	https://nacos.io/

Nacos的Github地址:
	https://github.com/alibaba/nacos

2.下载解压nacos

[root@elk91 ~]# wget https://github.com/alibaba/nacos/releases/download/2.5.1/nacos-server-2.5.1.tar.gz

[root@elk91 ~]# tar xf nacos-server-2.5.1.tar.gz -C /usr/local

3.启动nacos单机版

[root@elk91 ~]# /usr/local/nacos/bin/startup.sh -m standalone
#查看日志
[root@elk91 ~]# tail -100f /usr/local/nacos/logs/start.out
#如下字样即为成功
         ,--.
       ,--.'|
   ,--,:  : |                                           Nacos 2.5.1
,`--.'`|  ' :                       ,---.               Running in stand alone mode, All function modules
|   :  :  | |                      '   ,'\   .--.--.    Port: 8848
:   |   \ | :  ,--.--.     ,---.  /   /   | /  /    '   Pid: 58224
|   : '  '; | /       \   /     \.   ; ,. :|  :  /`./   Console: http://10.0.0.91:8848/nacos/index.html
'   ' ;.    ;.--.  .-. | /    / ''   | |: :|  :  ;_
|   | | \   | \__\/: . ..    ' / '   | .; : \  \    `.      https://nacos.io
'   : |  ; .' ," .--.; |'   ; :__|   :    |  `----.   \
|   | '`--'  /  /  ,.  |'   | '.'|\   \  /  /  /`--'  /
'   : |     ;  :   .'   \   :    : `----'  '--'.     /
;   |.'     |  ,     .-./\   \  /            `--'---'
'---'        `--`---'     `----'

2025-03-18 09:40:05,502 INFO Tomcat initialized with port(s): 8848 (http)

4.访问nacos的WebUI

http://10.0.0.91:8848/nacos/

二、nacos实现服务注册和服务发现

1.注册节点

  • 将一个名为 elasticstack 的服务实例,其 IP 地址为 10.0.0.91,端口为 9200 注册到 Nacos
[root@elk93 ~]# curl -s -X POST 'http://10.0.0.91:8848/nacos/v1/ns/instance?serviceName=elasticstack&ip=10.0.0.91&port=9200' ;echo
ok
[root@elk93 ~]# 
[root@elk93 ~]# curl -s -X POST 'http://10.0.0.91:8848/nacos/v1/ns/instance?serviceName=elasticstack&ip=10.0.0.92&port=9200' ;echo
ok
[root@elk93 ~]# 
[root@elk93 ~]# curl -s -X POST 'http://10.0.0.91:8848/nacos/v1/ns/instance?serviceName=elasticstack&ip=10.0.0.93&port=9200' ;echo
ok

2.服务发现

[root@elk93 ~]# curl -X GET -s  'http://10.0.0.91:8848/nacos/v1/ns/instance/list?serviceName=elasticstack'  | jq
{
  "name": "DEFAULT_GROUP@@elasticstack",
  "groupName": "DEFAULT_GROUP",
  "clusters": "",
  "cacheMillis": 10000,
  "hosts": [
    {
      "instanceId": "10.0.0.92#9200#DEFAULT#DEFAULT_GROUP@@elasticstack",
      "ip": "10.0.0.92",
      "port": 9200,
      "weight": 1,
      "healthy": true,
      "enabled": true,
      "ephemeral": true,
      "clusterName": "DEFAULT",
      "serviceName": "DEFAULT_GROUP@@elasticstack",
      "metadata": {},
      "instanceHeartBeatInterval": 5000,
      "instanceHeartBeatTimeOut": 15000,
      "ipDeleteTimeout": 30000,
      "instanceIdGenerator": "simple"
    },
    {
      "instanceId": "10.0.0.93#9200#DEFAULT#DEFAULT_GROUP@@elasticstack",
      "ip": "10.0.0.93",
      "port": 9200,
      "weight": 1,
      "healthy": true,
      "enabled": true,
      "ephemeral": true,
      "clusterName": "DEFAULT",
      "serviceName": "DEFAULT_GROUP@@elasticstack",
      "metadata": {},
      "instanceHeartBeatInterval": 5000,
      "instanceHeartBeatTimeOut": 15000,
      "ipDeleteTimeout": 30000,
      "instanceIdGenerator": "simple"
    },
    {
      "instanceId": "10.0.0.91#9200#DEFAULT#DEFAULT_GROUP@@elasticstack",
      "ip": "10.0.0.91",
      "port": 9200,
      "weight": 1,
      "healthy": true,
      "enabled": true,
      "ephemeral": true,
      "clusterName": "DEFAULT",
      "serviceName": "DEFAULT_GROUP@@elasticstack",
      "metadata": {},
      "instanceHeartBeatInterval": 5000,
      "instanceHeartBeatTimeOut": 15000,
      "ipDeleteTimeout": 30000,
      "instanceIdGenerator": "simple"
    }
  ],
  "lastRefTime": 1742264229641,
  "checksum": "",
  "allIPs": false,
  "reachProtectionThreshold": false,
  "valid": true
}

三、nacos实现服务中心案例

1.发布配置

  • 通过 curl 向 Nacos 的配置管理接口发送一个 POST 请求,将一个配置项添加到 Nacos 中。具体来说,你希望将一个名为 blog 的配置项(dataId=bloggroup=k8s)的内容设置为一个 URL(https://www.cnblogs.com/dingzhiyan
[root@elk93 ~]# curl -s -X POST "http://10.0.0.91:8848/nacos/v1/cs/configs?dataId=blog&group=k8s&content=https://www.cnblogs.com/dingzhiyan" ;echo
true
[root@elk93 ~]# 

2.获取配置

[root@elk93 ~]# curl -s "http://10.0.0.91:8848/nacos/v1/cs/configs?dataId=blog&group=k8s";echo
https://www.cnblogs.com/dingzhiyan
[root@elk93 ~]# 
[root@elk93 ~]# curl -s "http://10.0.0.91:8848/nacos/v1/cs/configs?dataId=laonanhai&group=DEFAULT_GROUP";echo
{"office": "https://www.dezyan.com","school":"dezyan"}
[root@elk93 ~]# 

四、名称空间


五、Nacos启动脚本编写

1.编写启动脚本

cat > /lib/systemd/system/nacos.service <<EOF
[Unit]
Description=nacos.service
After=network.target
[Service]
Type=forking
Environment=JAVA_HOME=/usr/share/elasticsearch/jdk
ExecStart=/usr/local/nacos/bin/startup.sh -m standalone
ExecStop=/usr/local/nacos/bin/shutdown.sh
[Install]
WantedBy=multi-user.target
EOF

2.配置开机自启动

[root@elk91 ~]# systemctl daemon-reload 
[root@elk91 ~]# systemctl enable --now nacos.service
[root@elk91 ~]# ss -ntl | grep 8848
LISTEN 0      100                     *:8848             *:*

六、nacos配置MySQL作为数据源

1.拷贝nacos的SQL初始化语句

[root@elk91 ~]# scp /usr/local/nacos/conf/mysql-schema.sql  10.0.0.93:~

2.创建用户并授权,导入SQL语句

[root@elk91 ~]#  mysql
mysql> CREATE DATABASE nacos;
mysql> CREATE USER nacos IDENTIFIED  WITH  mysql_native_password by 'dingzhiyan';
mysql> GRANT ALL ON nacos.* TO nacos;

[root@elk93 ~]# mysql nacos < mysql-schema.sql

3.修改nacos的配置文件


[root@elk91 ~]# vim /usr/local/nacos/conf/application.properties
# 修改nacos的访问站点
server.servlet.contextPath=/
...
# 指定数据库的类型是MySQL
spring.sql.init.platform=mysql
# 数据库的数量,官方写的是1,此处我也写1.
db.num=1
# 指定数据库的主机,端口,数据库及相关参数。
db.url.0=jdbc:mysql://10.0.0.93:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnic    ode=true&useSSL=false&serverTimezone=Asia/Shanghai
# 指定数据库的用户名
db.user.0=nacos
# 指定数据库的密码
db.password.0=dingzhiyan

4.重启nacos

[root@elk91 ~]# systemctl restart nacos.service 

5.访问nacos的WebUI

http://10.0.0.91:8848/

6.写入配置信息观察MySQL数据库是否有数据存储

#在此查询,应有刚刚写入的信息
mysql> SELECT * FROM config_info;

七、nacos配置认证功能及RBAC实战

1.nacos认证概述

​ Nacos是一个内部微服务组件,需要在可信的内部网络中运行,不可暴露在公网环境,防止带来安全风险。

​ Nacos提供简单的鉴权实现,为防止业务错用的弱鉴权体系,不是防止恶意攻击的强鉴权体系。

​ 如果运行在不可信的网络环境或者有强鉴权诉求,请参考官方简单实现做替换增强。

​ 参考链接:
https://nacos.io/zh-cn/docs/auth.html

2.生成toke的值

​ 自定义密钥时,推荐将配置项设置为Base64编码的字符串,且原始密钥长度不得低于32字符。

[root@elk91 ~]# openssl rand -base64 33
428Gjk5EGkADiPC+577iPOH49V1lGzDSN+gW8ggvUOyo

3.修改Nacos的配置文件

[root@elk91 ~]# tail  -5 /usr/local/nacos/conf/application.properties
nacos.core.auth.system.type=nacos
#启用认证功能
nacos.core.auth.enabled=true
#设置 Nacos 服务器的身份验证密钥
nacos.core.auth.server.identity.key=dingzhiyan
#设置 Nacos 服务器的身份验证值
nacos.core.auth.server.identity.value=dingzhiyan
nacos.core.auth.plugin.nacos.token.secret.key=428Gjk5EGkADiPC+577iPOH49V1lGzDSN+gW8ggvUOyo

4.重启nacos

[root@elk91 ~]# systemctl restart nacos.service

5.登录测试

http://10.0.0.91:8848/#/login

6.设置初始密码登录

  • 若使用默认设置,默认用户名密码均为nacos

7.创建用户并绑定权限测试

  • 创建用户

  • 创建角色,添加刚刚创建的用户

  • 创建权限,指定角色、资源、动作

八、nacos集群基于haproxy实现高可用实战

1.在单点的配置上修改配置文件

[root@elk91 ~]# cat /usr/local/nacos/conf/cluster.conf
10.0.0.91:8848
10.0.0.92:8848
10.0.0.93:8848

2.拷贝nacos程序

[root@elk91 ~]# scp -r /usr/local/nacos/ 10.0.0.92:/usr/local/
[root@elk91 ~]# scp -r /usr/local/nacos/ 10.0.0.93:/usr/local/

3.停止单点的nacos

[root@elk91 ~]# systemctl disable --now nacos.service

4.所有节点以集群的方式启动

①所有节点启动

/usr/local/nacos/bin/startup.sh -p embedded
注:默认就是以集群的方式启动,此处的-p直接指定了以集群方式启动

②访问验证

http://10.0.0.91:8848/#/clusterManagement
http://10.0.0.92:8848/#/clusterManagement
http://10.0.0.93:8848/#/clusterManagement

5.所有节点配置haproxy实现负载均衡

①修改内核参数

echo net.ipv4.ip_nonlocal_bind = 1 >> /etc/sysctl.d/nacos.conf
sysctl -f /etc/sysctl.d/nacos.conf
sysctl -q net.ipv4.ip_nonlocal_bind

②安装配置haproxy

apt -y install haproxy

③修改haproxy的配置文件

[root@elk91 ~]# tail -13 /etc/haproxy/haproxy.cfg 
listen status
    mode http
    bind 0.0.0.0:9999
    stats enable
    log global
    stats uri  /ruok
    stats auth admin:dingzhiyan

listen nacos
    bind 10.0.0.66:18848
    server elk91 10.0.0.91:8848 check
    server elk92 10.0.0.92:8848 check
    server elk93 10.0.0.93:8848 check
[root@elk91 ~]# scp /etc/haproxy/haproxy.cfg 10.0.0.92:/etc/haproxy
[root@elk91 ~]# scp /etc/haproxy/haproxy.cfg 10.0.0.93:/etc/haproxy

6.配置抢占式keepalived实现高可用

①在两台服务器上安装配置keepalived实现高可用

apt -y install keepalived

②修改keepalived的配置文件

[root@elk91 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
   router_id 10.0.0.91
}
vrrp_script chk_haproxy {
    script "killall -0 haproxy"
    interval 2
    weight -20
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 251
    priority 100
    advert_int 1
    mcast_src_ip 10.0.0.91
    nopreempt
    authentication {
        auth_type PASS
        auth_pass dingzhiyan
    }
    track_script {
         chk_haproxy
    }
    virtual_ipaddress {
        10.0.0.66
    }
}
[root@elk91 ~]# 



[root@elk92 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
   router_id 10.0.0.92
}
vrrp_script chk_haproxy {
    script "killall -0 haproxy"
    interval 2
    weight -20
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 251
    priority 80
    advert_int 1
    mcast_src_ip 10.0.0.92
    nopreempt
    authentication {
        auth_type PASS
        auth_pass dingzhiyan
    }
    track_script {
         chk_haproxy
    }
    virtual_ipaddress {
        10.0.0.66
    }
}
[root@elk92 ~]# 



[root@elk93 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
   router_id 10.0.0.93
}
vrrp_script chk_haproxy {
    script "killall -0 haproxy"
    interval 2
    weight -20
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 251
    priority 60
    advert_int 1
    mcast_src_ip 10.0.0.93
    nopreempt
    authentication {
        auth_type PASS
        auth_pass dingzhiyan
    }
    track_script {
         chk_haproxy
    }
    virtual_ipaddress {
        10.0.0.66
    }
}

③重启keepalived服务使得配置生效

[root@elk91 ~]# systemctl enable --now keepalived
[root@elk92 ~]# systemctl enable --now keepalived
[root@elk93 ~]# systemctl enable --now keepalived

④重启keepalived服务使得配置生效

[root@elk91 ~]# systemctl enable --now keepalived
[root@elk92 ~]# systemctl enable --now keepalived
[root@elk93 ~]# systemctl enable --now keepalived

⑤启动haproxy负载均衡器

systemctl restart haproxy.service 
ss -ntl | grep 18848
LISTEN 0      4096            10.0.0.66:18848      0.0.0.0:*  

7.访问测试验证

http://10.0.0.66:18848/#/login

8.验证高可用

[root@elk91 ~]# systemctl stop keepalived

九、Dubbo provider环境部署

1.下载provider(生产者)

dubbo-demo-provider-2.1.5-assembly.tar.gz

2.解压软件包

[root@elk91 ~]# tar xf dubbo-demo-provider-2.1.5-assembly.tar.gz -C /usr/local/

3.修改provider配置文件

[root@elk91 ~]# vim /usr/local/dubbo-demo-provider-2.1.5/conf/dubbo.properties 
...
 19 # dubbo.registry.address=multicast://224.5.6.7:1234                                                                                
 20 #dubbo.registry.address=zookeeper://127.0.0.1:2181
 21 dubbo.registry.address=zookeeper://10.0.0.91:2181 | zookeeper://10.0.0.92:2181 | zookeeper://10.0.0.93:2181

4.修改启动脚本指定JDK

[root@elk91 ~]# ll /usr/local/jdk1.8.0_291/
[root@elk91 ~]# vim /usr/local/dubbo-demo-provider-2.1.5/bin/start.sh 
...
 69 nohup /usr/local/jdk1.8.0_291/bin/java $JAVA_OPTS $JAVA_MEM_OPTS ...
...

[root@elk91 ~]# 
[root@elk91 ~]# scp -r /usr/local/jdk1.8.0_291/ 10.0.0.93:/usr/local/

5.启动provider

[root@elk91 ~]# /usr/local/dubbo-demo-provider-2.1.5/bin/start.sh 
Starting the demo-provider .....OK!
PID: 67227
STDOUT: logs/stdout.log

6.检查zookeeper是否生成dubbo数据

十、Dubbo consumer环境部署

1.下载consumer

dubbo-demo-consumer-2.1.5-assembly.tar.gz

2.解压consumer

[root@elk93 ~]# tar xf dubbo-demo-consumer-2.1.5-assembly.tar.gz -C /usr/local/

3.编辑"dubbo.properties"文件

[root@elk93 ~]# vim /usr/local/dubbo-demo-consumer-2.1.5/conf/dubbo.properties 
...
# 禁用默认的组播注册中心。
# dubbo.registry.address=multicast://224.5.6.7:1234
# 将默认的单个节点的配置注释掉
#dubbo.registry.address=zookeeper://127.0.0.1:2181
# 配置zookeeper集群地址
dubbo.registry.address=zookeeper://10.0.0.91:2181 | zookeeper://10.0.0.92:2181 | zookeeper://10.0.0.93:2181 

4.修改启动脚本

[root@elk93 ~]# ll /usr/local/jdk1.8.0_291/
[root@elk93 ~]# vim /usr/local/dubbo-demo-consumer-2.1.5/bin/start.sh 
...
 68 nohup /usr/local/jdk1.8.0_291/bin/java $JAVA_OPTS $JAVA_MEM_OPTS ...  

5.启动consumer服务

[root@elk93 ~]# /usr/local/dubbo-demo-consumer-2.1.5/bin/start.sh 
Starting the demo-consumer ....OK!
PID: 51783
STDOUT: logs/stdout.log

6.查看消费者的日志信息

[root@elk93 ~]# tail -100f /usr/local/dubbo-demo-consumer-2.1.5/logs/stdout.log
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: UseCMSCompactAtFullCollection is deprecated and will likely be removed in a future release.
log4j:WARN No appenders could be found for logger (com.alibaba.dubbo.common.logger.LoggerFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
[16:26:24] Hello world0, response form provider: 10.0.0.91:20880
[16:26:26] Hello world1, response form provider: 10.0.0.91:20880

十一、部署dubbo web管理页面

1.安装maven

[root@elk91 ~]# wget http://192.168.16.253/Resources/ElasticStack/softwares/Dubbo/apache-maven-3.3.9-bin.tar.gz
[root@elk91 ~]# tar xf apache-maven-3.3.9-bin.tar.gz -C /usr/local/
[root@elk91 ~]# 
[root@elk91 ~]# cat /etc/profile.d/maven.sh
#!/bin/bash

export MAVEN_HOME=/usr/local/apache-maven-3.3.9
export PATH=$PATH:$MAVEN_HOME/bin
[root@elk91 ~]# 
[root@elk91 ~]# source /etc/profile.d/maven.sh

2.部署nodejs环境

[root@elk91 ~]# apt update && apt -y install npm
#获取当前 npm 配置的镜像地址
[root@elk91 ~]# npm config get registry
https://registry.npmjs.org/
#设置 npm 使用淘宝镜像
[root@elk91 ~]# npm config set registry http://registry.npm.taobao.org
#获取当前 npm 配置的镜像地址
[root@elk91 ~]# npm config get registry
http://registry.npm.taobao.org/

3.克隆代码

[root@elk91 ~]# git clone https://github.com/apache/dubbo-admin.git
[root@elk91 ~]# cd dubbo-admin/

4.修改配置文件

[root@elk91 dubbo-admin]# vim dubbo-admin-server/src/main/resources/application.properties
...
#使用Zookeeper集群
 24 # admin.registry.address=zookeeper://10.0.0.91:2181
 25 # admin.config-center=zookeeper://10.0.0.92:2181
 26 # admin.metadata-report.address=zookeeper://10.0.0.93:2181      
..
#使用nacos集群
 34 admin.registry.address=nacos://10.0.0.91:8848?group=DEFAULT_GROUP&namespace=public&username=nacos&password=1
 35 admin.config-center=nacos://10.0.0.92:8848?group=dubbo&username=nacos&password=1
 36 admin.metadata-report.address=nacos://10.0.0.93:8848?group=dubbo&username=nacos&password=1

...
 47 admin.root.user.name=root
 48 admin.root.user.password=root
...

后期可以尝试的配置:【nacos关于密码认证的话,我此处是禁用了认证,如果有时间的小伙伴自行测试如下配置:】
 33 admin.registry.address=nacos://10.0.0.66:18848?username=nacos&password=1
 34 admin.config-center=nacos://10.0.0.66:18848?username=nacos&password=1
 35 admin.metadata-report.address=nacos://10.0.0.66:18848?username=nacos&password=1

5.开始编译

①使用zookeeper集群

[root@jenkins211 dubbo-admin-develop]# mvn clean install package -Dmaven.test.skip=true

②使用nacos集群

#重新编译dubbo-admin 
[root@jenkins211 dubbo-admin-develop]# rm -rf dubbo-admin-distribution/target/
[root@jenkins211 dubbo-admin-develop]# mvn clean install package -Dmaven.test.skip=true

6.启动服务

root@elk91:/usr/local/dubbo-admin-develop# ll dubbo-admin-distribution/target/dubbo-admin-0.5.0-SNAPSHOT.jar
-rw-r--r-- 1 root root 75098389 Mar 18 21:25 dubbo-admin-distribution/target/dubbo-admin-0.5.0-SNAPSHOT.jar
[root@jenkins211 dubbo-admin-develop]# java -jar dubbo-admin-distribution/target/dubbo-admin-0.5.0-SNAPSHOT.jar --server.port=8888

7.访问dubbo-admin的WebUI

http://10.0.0.91:8888/
用户名:root
密码:root

8.对比观察zookeeper和nacos的差异。

十二、zookeeper和nacos区别

- 相同点
	- 本质上都是基于JAVA语言设计;
	- 都可以做配置中心,注册中心,服务发现;
	- 都是由Apache基金会维护
	
- 不同点:
	- zookeeper主要应用场景在于配置大数据领域的组件,比如HDFS,YARN,kafka,HBASE等组件。
	- nocas主要针对JAVA领域,或微服务生态使用较多,由于nacos支持丰富的图形界面,相比zookeeper,在微服务领域更受欢迎

十三、总结

1.nacos集群部署的注意点

1.要在cluster.conf配置文件中定义要组成集群的nacos服务器地址及端口
2.要指定同一个数据源,通常使用MySQL数据库存储

2.nacos认证

主要通过在配置文件中设置
身份验证密钥、身份验证值、自己生成的token值实现

3.nacos的MySQL数据存储类型

nacos数据存储有两种类型:内置轻量化数据库和MySQL数据库
使用MySQL存储时,要创建特定库、用户并授权,导入指定sql文件

4.nacos高可用

nacos的高可用主要通过Haproxy和Keepalived来实现
Haproxy通过设置负载均衡,Keepalived通过设置VIP漂移规则组合实现
posted @ 2025-04-06 19:26  丁志岩  阅读(246)  评论(0)    收藏  举报