nacos详解
一 nacoa介绍
1 什么是nacos?
Nacos 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
Nacos 支持几乎所有主流类型的"服务"的发现、配置和管理:
Kubernetes Service
gRPC & Dubbo RPC Service
Spring Cloud RESTful Service
2 nacos的核心功能
- 服务发现与注册
Nacos作为服务注册中心,可以帮助服务实例注册和发现,实现微服务架构中的服务注册与发现功能。
支持多种注册方式,如HTTP、DNS等,能够动态地管理服务实例信息,实现服务之间的通信。
- 动态配置管理
Nacos提供了配置中心的功能,可以集中管理系统各个服务的配置信息。
支持动态配置更新、配置监听、配置推送等特性,可以实时地更新配置信息,而不需要重启服务。
- 服务健康监测
Nacos能够对服务进行健康检查,及时发现不健康的服务实例,并进行相应的处理。
通过心跳机制和健康检查,确保服务的可靠性和稳定性。
- 多环境支持
Nacos支持多环境的配置管理,可以根据不同的环境(如开发、测试、生产)来管理配置信息。
- 集群部署和扩展
Nacos支持集群部署,具有良好的扩展性和高可用性,可以应对大规模服务架构的需求。
- 统一的管理界面
Nacos提供了友好的Web界面和API接口,方便用户进行配置管理、服务注册和发现等操作。
3 nacos服务注册与发现的机制
Nacos 提供了灵活且强大的服务注册与发现机制,主要包括以下几个方面:
【1】服务注册:应用程序启动后,可以通过 Nacos 客户端将自己的服务实例信息注册到 Nacos 服务器上,包括服务名、IP 地址、端口号以及其他元数据信息。注册后的服务实例信息将被 Nacos 保存在注册中心中。
【2】服务发现:客户端通过 Nacos 客户端可以查询注册中心,获取指定服务名的服务实例列表,并根据负载均衡策略选择合适的服务实例进行调用。
【3】健康检查:Nacos 会定期检查已注册的服务实例的健康状态,对于不健康的实例进行标记,以便客户端在进行服务发现时过滤掉不健康的实例。
【4】动态感知:Nacos 支持动态感知服务实例的上下线变化,当服务实例发生变化时,客户端可以通过 Nacos 客户端实时获取最新的服务实例列表。
【5】元数据管理:除了基本的服务注册信息外,Nacos 还支持服务实例的元数据管理,例如版本信息、扩展信息等,这些元数据可以帮助客户端更精确地选择服务实例。
二 nacos集群部署
1 集群规划
我这里部署的nacos集群使用外置存储,所以需要MySQL数据库,生产部署时数据库也是需要集群模式的,我这里就采用单机版的MySQL了。
主机名 | IP | 应用 | OS |
---|---|---|---|
nacos-01 | 11.0.1.131 | jdk11、nacos_v2.3.2 | Euler 21.10 LTS |
nacos-02 | 11.0.1.136 | jdk11、nacos_v2.3.2 | Euler 21.10 LTS |
nacos-03 | 11.0.1.137 | jdk11、nacos_v2.3.2 | Euler 21.10 LTS |
test-db01 | 11.0.1.138 | mysql_v8.0.28 | Euler 21.10 LTS |
web | 11.0.1.133 | nginx_v1.26 | Euler 21.10 LTS |
2 部署
1)前置条件
【1】mysql数据库
部署略
# 创建nacos库以及nacos访问账号
CREATE DATABASE if not exists nacos CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'nacos'@'11.0.1.%' IDENTIFIED BY 'Qwerst@1311';
GRANT ALL PRIVILEGES ON nacos.* TO 'nacos'@'11.0.1.%';
FLUSH PRIVILEGES;
# 如果需要登录navicat连接工具,用以下创建语句
CREATE USER 'nacos'@'11.0.1.%' IDENTIFIED WITH mysql_native_password BY 'Qwerst@1311';
GRANT ALL PRIVILEGES ON nacos.* TO 'nacos'@'11.0.1.%'; WITH GRANT OPTION;
FLUSH PRIVILEGES;
# MySQL 8.0 默认使用了更加安全的身份验证方式(caching_sha2_password),而 Navicat 不支持该方式,所以还原成8.0之前的身份验证方式就行了(mysql_native_passowrd)
# WITH GRANT OPTION 的作用是允许被授权的用户将指定的对象权限授予其他用户
【2】jdk
[root@nacos-01 src]# java -version
java version "11.0.23" 2024-04-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.23+7-LTS-222)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.23+7-LTS-222, mixed mode)
[root@nacos-02 src]# java -version
java version "11.0.23" 2024-04-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.23+7-LTS-222)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.23+7-LTS-222, mixed mode)
[root@nacos-03 src]# java -version
java version "11.0.23" 2024-04-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.23+7-LTS-222)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.23+7-LTS-222, mixed mode)
2)nacos集群部署
可以参考官方文档:
https://nacos.io/zh-cn/docs/guide/admin/cluster-mode-quick-start/
Nacos支持三种部署模式:
- 单机模式 - 用于测试和单机试用。
- 集群模式 - 用于生产环境,确保高可用。
- 多集群模式 - 用于多数据中心场景。
环境准备:
- 64 bit OS Linux/Unix/Mac,推荐使用Linux系统。
- 64 bit JDK 1.8+;下载. 配置。
- Maven 3.2.x+;下载. 配置(我这里直接下载二进制包进行安装,不需要编译)。
- 3个或3个以上Nacos节点才能构成集群
【1】下载地址
https://github.com/alibaba/nacos/releases/download/2.3.2/nacos-server-2.3.2.tar.gz
【2】上传至服务器中
[root@nacos-01 src]# ll -tr
总用量 147M
-rw-r--r-- 1 root root 147M 6月 18 12:23 nacos-server-2.3.2.tar.gz
[root@nacos-02 src]# ll -tr
总用量 147M
-rw-r--r-- 1 root root 147M 6月 18 12:24 nacos-server-2.3.2.tar.gz
[root@nacos-03 src]# ll -tr
总用量 147M
-rw-r--r-- 1 root root 147M 6月 18 12:23 nacos-server-2.3.2.tar.gz
【3】解压到指定目录
[root@nacos-01 src]# tar -xf nacos-server-2.3.2.tar.gz -C /usr/local/
[root@nacos-02 src]# tar -xf nacos-server-2.3.2.tar.gz -C /usr/local/
[root@nacos-03 src]# tar -xf nacos-server-2.3.2.tar.gz -C /usr/local/
【4】配置集群配置文件 — 三个节点配置都一样
进入nacos的conf目录,修改集群配置文件,每行配置格式 ip:port
vim /usr/local/nacos/conf/cluster.conf
11.0.1.131:8848
11.0.1.136:8848
11.0.1.137:8848
修改application.properties配置文件
### 生成toke的值,至少32位,待会配置登录验证功能会用的到
openssl rand -base64 33
### 修改大致过程
1 修改数据库信息
2 启用登录验证功能 --- 修改四个地方
#*************** Access Control Related Configurations ***************#
..........
### The auth system to use, currently only 'nacos' and 'ldap' is supported:
nacos.core.auth.system.type=nacos
### If turn on auth system:
nacos.core.auth.enabled=true # 将false改为true
..........
### Since 1.4.1, worked when nacos.core.auth.enabled=true and nacos.core.auth.enable.userAgentAuthWhite=false.
### The two properties is the white list for auth and used by identity the request from other server.
nacos.core.auth.server.identity.key=eastcom #指定值,负责无法启动
nacos.core.auth.server.identity.value=SRE2024 #指定值,负责无法启动
..........
### The default token (Base64 String):
nacos.core.auth.plugin.nacos.token.secret.key=6GRLjEpD+lN3C82Bb/XH2bATVxR+MMWJW3TqWM/p9yJD #前面生成的token值
修改完后的配置文件(可以直接把配置通过scp传到其他两个节点)
[root@nacos-01 nacos]# egrep -v "^#|^$" conf/application.properties
server.servlet.contextPath=/nacos
server.error.include-message=ALWAYS
server.port=8848
spring.sql.init.platform=mysql
db.num=1
db.url.0=jdbc:mysql://11.0.1.138:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=nacos
db.password.0=Qwerst@1311
db.pool.config.connectionTimeout=30000
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2
nacos.config.push.maxRetryTime=50
server.tomcat.mbeanregistry.enabled=true
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.rotate=true
server.tomcat.accesslog.file-date-format=.yyyy-MM-dd-HH
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i
server.tomcat.basedir=file:.
nacos.security.ignore.urls=/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-ui/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**
nacos.core.auth.system.type=nacos
nacos.core.auth.enabled=true
nacos.core.auth.caching.enabled=true
nacos.core.auth.enable.userAgentAuthWhite=false
nacos.core.auth.server.identity.key=eastcom
nacos.core.auth.server.identity.value=SRE2024
nacos.core.auth.plugin.nacos.token.cache.enable=false
nacos.core.auth.plugin.nacos.token.expire.seconds=18000
nacos.core.auth.plugin.nacos.token.secret.key=6GRLjEpD+lN3C82Bb/XH2bATVxR+MMWJW3TqWM/p9yJD
nacos.istio.mcp.server.enabled=false
【5】在mysql节点上,进行nacos初始化
注意:是在数据库服务器上操作!!!
# 先将sql文件发送至数据库节点
[root@nacos-03 conf]# ll /usr/local/nacos/conf/mysql-schema.sql
-rw-r--r-- 1 502 games 11K 2月 6 09:58 /usr/local/nacos/conf/mysql-schema.sql
[root@nacos-03 conf]# scp /usr/local/nacos/conf/mysql-schema.sql root@11.0.1.138:/home/weihu/
# 导入sql文件进行初始化
[root@test-db01 weihu]# mysql -h11.0.1.138 -unacos -pQwerst@1311 nacos < mysql-schema.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
【6】启动nacos集群
# 三个节点都执行这个启动命令,默认为集群启动模式
/usr/local/nacos/bin/startup.sh
# 启动后查看日志
tail -100f /usr/local/nacos/logs/start.out
......
2024-06-18 13:39:00,936 INFO Nacos started successfully in cluster mode. use external storage
# 有以上信息就代表启动成功,也可以查看端口
【7】启动成功后查看端口
[root@nacos-01 nacos]# ps -ef |grep nacos
root 3497 1 16 13:38 pts/0 00:01:22 /home/weihu/jdk/jdk-11.0.23/bin/java -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/nacos/logs/java_heapdump.hprof -XX:-UseLargePages -Dnacos.member.list= -Xlog:gc*:file=/usr/local/nacos/logs/nacos_gc.log:time,tags:filecount=10,filesize=100m -Dloader.path=/usr/local/nacos/plugins,/usr/local/nacos/plugins/health,/usr/local/nacos/plugins/cmdb,/usr/local/nacos/plugins/selector -Dnacos.home=/usr/local/nacos -jar /usr/local/nacos/target/nacos-server.jar --spring.config.additional-location=file:/usr/local/nacos/conf/ --logging.config=/usr/local/nacos/conf/nacos-logback.xml --server.max-http-header-size=524288 nacos.nacos
root 4123 3234 0 13:46 pts/0 00:00:00 grep --color=auto nacos
[root@nacos-01 nacos]# ss -ntlp |grep 3497
LISTEN 0 100 *:8848 *:* users:(("java",pid=3497,fd=121))
LISTEN 0 128 *:9848 *:* users:(("java",pid=3497,fd=79))
LISTEN 0 128 *:9849 *:* users:(("java",pid=3497,fd=80))
LISTEN 0 128 *:7848 *:* users:(("java",pid=3497,fd=64))
# 可以看到每个实例监听了4个端⼝8848、9848、9849、7848
端口说明如下:
端口 | 与主端口的偏移量 | 描述 |
---|---|---|
8848 | 0 | 主端口,客户端、控制台及OpenAPI所使用的HTTP端口 |
9848 | 1000 | 客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求 |
9849 | 1001 | 服务端gRPC请求服务端端口,用于服务间同步等 |
7848 | -1000 | Jraft请求服务端端口,用于处理服务端间的Raft相关请求,其实是为了兼容低版本的leader选举 |
注意:3个节点如开启了iptables,则必须开放8848、9848、9849端⼝,否则集群无法建立!!!
【8】可以页面访问nacos
注意:页面登录成功后注意要修改密码!!!而且只需要在一个节点上修改密码即可,因为是共用一个数据库的!!!
http://11.0.1.131:8848/nacos
http://11.0.1.136:8848/nacos
http://11.0.1.137:8848/nacos
三 负载均衡配置
我这里采用nginx实现负载均衡,当然也可以使用keepalived+haproxy进行专业的负载均衡。
ngixn部署这里就略过了。
1)nginx配置文件
[root@web conf]# vim /usr/local/nginx/conf/nginx.conf
user weihu;
worker_processes 2;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream nacos {
server 11.0.1.131:8848 max_fails=3 fail_timeout=5s;
server 11.0.1.136:8848 max_fails=3 fail_timeout=5s;
server 11.0.1.137:8848 max_fails=3 fail_timeout=5s;
}
server {
listen 8848;
server_name 11.0.1.133;
location / {
proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://nacos;
proxy_http_version 1.1;
add_header Set-Cookie "Path=/; HttpOnly; Secure";
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
expires 0;
}
}
}
# 重启nginx服务器
[root@web conf]# systemctl restart nginx
[root@web conf]# ss -ntl |grep 8848
LISTEN 0 511 0.0.0.0:8848 0.0.0.0:*
2)客户端通过nginx负载均衡节点访问nacos
http://11.0.1.133:8848/nacos