Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
一、Nacos 配置管理-集群部署
1、 把 nacos 应用程序包,复制3份,分别命名为 nacos1, nacos2, nacos3
分别在 conf 目录下,修改 application.properties 配置文件,
更改端口号为:8848, 8849,8850
nacos.inetutils.ip-address=127.0.0.1
2、配置集群模式:
分别在 conf 目录下,修改 cluster.conf.example 配置文件为:cluster.conf
并添加如下代码:
#it is ip
#example
127.0.0.1:8848
127.0.0.1:8849
127.0.0.1:8850
3、集群模式启动 nacos
startup -m cluster
4、修改配置文件 bootstrap.yml 配置文件,添加集群配置。
java
## C:\java-test\idea2019\nacos_config\service1\src\main\resources\bootstrap.yml
## bootstrap.yml 配置文件加载顺序优先于 application.yml 配置文件。
server:
port: 56010 #启动端口 命令行注入
spring:
application:
name: service1
cloud:
nacos:
config:
# enabled: false # 关闭配置
# 1) 通过 application 的 name 加 file-extension 后缀名称 :service1.yaml 配置的 DataId 优先级最高。
server-addr: 127.0.0.1:8848, 127.0.0.1:8849, 127.0.0.1:8850 #配置中心地址
file-extension: yaml #dataid 的名称是 application 的 name 加 file-extension 名称 :service1.yaml
namespace: eae273b2-9298-4b99-b4aa-a3d5ea5df089 #开发环境
group: TEST_GROUP #测试组
# 2)扩展的 DataId 配置 优先级次之。config external configuration
# 1.Data Id 在默认的组 DEFAULT_GROUP,不支持配置的动态刷新: common.age=18 common.address=beijing # 优先级低于 ext-config[1] ext-config[2]
ext-config[0]:
data-id: ext-config-common01.properties
# 2.Data Id 不在默认的组,不支持动态刷新: common.birthday=1990-8-8 # 优先级高于 ext-config[0]
ext-config[1]:
data-id: ext-config-common02.properties
group: GLOBALE_GROUP
# 3.Data Id 既不在默认的组,也支持动态刷新: common.fullname=djh # 优先级高于 ext-config[0] 和 ext-config[1]
ext-config[2]:
data-id: ext-config-common03.properties
group: REFRESH_GROUP
refresh: true #动态刷新
# # 3)自定义共享 DataId 配置,只支持 DEFAULT_GROUP 分组,优先级最低。
# shared-dataids: ext-config-common01.properties, ext-config-common03.properties, ext-config-common03.properties
# refreshable: ext-config-common01.properties
5、试着停掉一个 nacos 服务 ,启动 nacos 服务 (运行启动类 ),访问不受影响。
java
## C:\java-test\idea2019\nacos_config\service1\src\main\resources\bootstrap.yml
## bootstrap.yml 配置文件加载顺序优先于 application.yml 配置文件。
server:
port: 56010 #启动端口 命令行注入
spring:
application:
name: service1
cloud:
nacos:
config:
# enabled: false # 关闭配置
# 1) 通过 application 的 name 加 file-extension 后缀名称 :service1.yaml 配置的 DataId 优先级最高。
server-addr: 127.0.0.1:8848, 127.0.0.1:8849, 127.0.0.1:8850 #配置中心地址
file-extension: yaml #dataid 的名称是 application 的 name 加 file-extension 名称 :service1.yaml
namespace: eae273b2-9298-4b99-b4aa-a3d5ea5df089 #开发环境
group: TEST_GROUP #测试组
# 2)扩展的 DataId 配置 优先级次之。config external configuration
# 1.Data Id 在默认的组 DEFAULT_GROUP,不支持配置的动态刷新: common.age=18 common.address=beijing # 优先级低于 ext-config[1] ext-config[2]
ext-config[0]:
data-id: ext-config-common01.properties
# 2.Data Id 不在默认的组,不支持动态刷新: common.birthday=1990-8-8 # 优先级高于 ext-config[0]
ext-config[1]:
data-id: ext-config-common02.properties
group: GLOBALE_GROUP
# 3.Data Id 既不在默认的组,也支持动态刷新: common.fullname=djh # 优先级高于 ext-config[0] 和 ext-config[1]
ext-config[2]:
data-id: ext-config-common03.properties
group: REFRESH_GROUP
refresh: true #动态刷新
# # 3)自定义共享 DataId 配置,只支持 DEFAULT_GROUP 分组,优先级最低。
# shared-dataids: ext-config-common01.properties, ext-config-common03.properties, ext-config-common03.properties
# refreshable: ext-config-common01.properties
6、浏览器地址栏输入:http://localhost:56010/configs2
二、Nacos 配置管理-课程总结
1、查询所有进程及线程端口占用情况,并关闭某端口的方法
1.1、windows 系统下( cmd 模式下):
java
1)查询当前系统所有网络连接和监听端口以及对应的进程标识(PID):
netstat -aon
netstat -nao
2)查询特定端口占用情况,端口对应的 PID,
netstat -ano | findstr <端口号>
如:要查询 8848 端口占用情况:
netstat -aon | findstr 8848
netstat -nao |findstr "8848"
或者:
netstat -aon | findstr \"8848\"
3)若该 PID 为 0,则查看指定 PID 的进程
tasklist | findstr 0
或者:
tasklist | findstr "0"
## 如:查询 PID 为 11664 对应的程序进程:
tasklist | findstr 11664
tasklist | findstr "11664"
4)如果查看到是哪个进程或者程序占用了 8848 端口,
得知是哪个进程后,若该进程结束对后续操作无影响,
则通过 taskkill /T /F /PID 0 来结束该进程。
## 强制结束进程,包括所有关联的线程
taskkill /T /F /PID 0
taskkill /T /F /PID 11664
5)netstat 命令参数全解析
netstat -help
1.2、linux 系统下:
java
1)所有正在使用的端口及关联的进程/应用:
netstat -nap ## 列出当前系统占用的端口
ps aux ## 列出当前系统所有的进程
2)列出具体的端口占用情况:
netstat -tunlp | grep 3306 ## 端口号
netstat -tunlp | grep mysql ## 进程名称
netstat -tunlp | grep 29520 ## 进程ID
3)检查那个端口被那个进程占用:
netstat -lnp | grep 2222 ## 查看端口 2222 的占用情况
4)查看进程的详细信息
ps 6789
ps -aux | grep 6789
5)关闭进程,发送 kill 信号到指定的进程或进程组。使它们根据该信号进行操作。
kill -s 9 PID
kill -s SIGKILL PID
kill -s KILL PID
## 杀掉进程,重新启动 apache
kill -9 6 789 ## 杀掉编号为 6789 的进程
2、nacos2.x 启动出错问题分析
nacos2.0 以上,双击 startup.cmd 闪退,或者 cmd 下执行 startup 启动时的错分析
nacos2.x 以上,默认以集群方式启动,如果你未配置相关集群参数,
就会启动闪退或报错。
所以单机模式启动需加参数启动服务。
解决:添加参数,以改变成单机模式启动:
-
单机模式启动
startup.cmd -m standalone
-
集群模式启动
startup.cmd -m cluster
3、windows 系统下(nacos1.x) nacos-1.1.3 链接数据库 mysql8.0 出错分析
3.1、首先以下方法亲测无效:
1)需要在数据库 URL 链接配置信息中 添加 allowPublicKeyRetrieval=true 无效
db.url.0=**&allowPublicKeyRetrieval=true
2) 在 nacos 根目录下新建文件夹 plugins/mysql/ 文件夹,并上传相应驱动
mysql-connector-java-8.0.23.jar 无效。
3)查看 .../nacos/bin/startup.cmd 文件 mysql 加载配置,正确,无效。
set "JAVA_OPT=%JAVA_OPT% -Xbootclasspath/a:%BASE_DIR%\plugins\cmdb:%BASE_DIR%\plugins\mysql"
set "JAVA_OPT=%JAVA_OPT% -Dnacos.home=%BASE_DIR%"
set "JAVA_OPT=%JAVA_OPT% -Dloader.path=%BASE_DIR%/plugins/health -jar %BASE_DIR%\target\nacos-server.jar"
set "JAVA_OPT=%JAVA_OPT% --spring.config.location=%CUSTOM_SEARCH_LOCATIONS%"
set "JAVA_OPT=%JAVA_OPT% --logging.config=%BASE_DIR%/conf/nacos-logback.xml"
4)检查 application.properties 文件中,配置外部数据库链接用户名密码等,正确,无效。
#mysql datasource
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
db.user=root
db.password=******
5) 开启 mysql8.0 root 远程权限,无效。
mysql> use mysql
Database changed
mysql> select host,user from user;
±----------±-----------------+
| host | user |
±----------±-----------------+
| localhost | mysql.infoschema |
| localhost | mysql.session |
| localhost | mysql.sys |
| localhost | root |
| localhost | testuser |
±----------±-----------------+
5 rows in set (0.06 sec)
mysql> update user set host='%' where user='root';
Query OK, 1 row affected (0.09 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> flush privileges;
Query OK, 0 rows affected (0.07 sec)
6)下载 nacos-1.1.3 源码,idea 打开,修改,重新打包,失败!
- 1)修改 nacos 项目根目录下的 pom.xml,手动指定 mysql 驱动版本
(C:\java-test\idea2019\nacos-1.1.3\pom.xml)
mysql mysql-connector-java 8.0.23
- 2)修改 naming[nacos-naming] 下 相关类
( 修改 com.alibaba.nacos.naming.healthcheck.MysqlHealthCheckProcessor.java )
// 修改前
//import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
// 修改后
import com.mysql.cj.jdbc.MysqlDataSource;
- 3) 修改mysql连接参数:mysql8.X版本需要指定时区等参数(这里可不修改,但最好修改一下)
找到 nacos-console 下的 src/main/resources/META-INF/nacos-default.properties
并修改 db.url 的数据库连接配置为
characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
// 修改前
db.url.0=jdbc:mysql://11.162.196.161:3306/diamond_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.url.1=jdbc:mysql://11.163.152.91:3306/diamond_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
// 修改后
db.url.0=jdbc:mysql://11.162.196.161:3306/diamond_devtest?characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
db.url.1=jdbc:mysql://11.163.152.91:3306/diamond_devtest?characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
- 4)打包运行,执行构建命令:mvn install 失败!!!
mvn -Prelease-nacos -DskipTests clean install -U
打包失败!!!
3.2、 解决方案1:
1)在 nacos 根目录下新建文件夹 plugins/mysql/ 文件夹,并上传相应驱动
mysql-connector-java-8.0.23.jar 无效。
2)将 nacos 目录下的 conf\application.properties 改名为 bootstrap.properties
关键一步,否则上面的不会起作用。
3) 在配置文件 conf/bootstrap.properties 中,添加数据库配置:
#mysql datasource
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
db.user=root
db.password=yourpassword
4)运行脚本bin/startup.cmd(linux系统运行.sh脚本)
5)启动成功,可通过浏览器访问 http://127.0.0.1:8848/nacos
用户名:nacos 密码:nacos
3.3、解决方案2:
下载 nacos-1.1.3 源码,idea 打开,修改,重新打包,
1)修改 nacos 项目根目录下的 pom.xml,手动指定 mysql 驱动版本
(C:\java-test\idea2019\nacos-1.1.3\pom.xml)
mysql mysql-connector-java 8.0.23
2)修改 naming[nacos-naming] 下 相关类
( 修改 com.alibaba.nacos.naming.healthcheck.MysqlHealthCheckProcessor.java )
// 修改前
//import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
// 修改后
import com.mysql.cj.jdbc.MysqlDataSource;
3) 修改mysql连接参数:mysql8.X版本需要指定时区等参数(这里可不修改,但最好修改一下)
找到 nacos-console 下的 src/main/resources/META-INF/nacos-default.properties
并修改 db.url 的数据库连接配置为
characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
// 修改前
db.url.0=jdbc:mysql://11.162.196.161:3306/diamond_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.url.1=jdbc:mysql://11.163.152.91:3306/diamond_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
// 修改后
db.url.0=jdbc:mysql://11.162.196.161:3306/diamond_devtest?characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
db.url.1=jdbc:mysql://11.163.152.91:3306/diamond_devtest?characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
4)打包运行,执行构建命令:mvn install 打包失败!!!
mvn -Prelease-nacos -DskipTests clean install -U 打包失败!!!
5)打包 后的文件在 distribution 模块下的 target 目录,拷贝至定义好的目录
target.nacos-server-1.1.3.nacos
6) 修改配置文件 conf/application.properties
// 找到nacos下的conf/application.properties 增加mysql数据源配置
#mysql datasource
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
db.user=root
db.password=yourpassword
7)运行脚本bin/startup.cmd(linux系统运行.sh脚本)
8)启动成功,可通过浏览器访问 http://127.0.0.1:8848/nacos
用户名:nacos 密码:nacos
4、nacos 启动 报堆内存问题
"nacos is starting with cluster"
Error occurred during initialization of VM
Could not reserve enough space for object heap
4.1、打开 .../nacos/bin/startup.cmd 修改以下项( nacos1.x 版本,如:nacos-1.1.3 )
把 set "JAVA_OPT=%JAVA_OPT% -server -Xms2g -Xmx2g -Xmn1g
更改为:set "JAVA_OPT=%JAVA_OPT% -server -Xms512m -Xmx512m -Xmn256m
如:
if %MODE% == "standalone" (
set "JAVA_OPT=%JAVA_OPT% -Xms512m -Xmx512m -Xmn256m"
set "JAVA_OPT=%JAVA_OPT% -Dnacos.standalone=true"
) else (
set "JAVA_OPT=%JAVA_OPT% -server -Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
set "JAVA_OPT=%JAVA_OPT% -XX:-OmitStackTraceInFastThrow XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=%BASE_DIR%\logs\java_heapdump.hprof"
set "JAVA_OPT=%JAVA_OPT% -XX:-UseLargePages"
)
4.2、打开 .../nacos/bin/startup.cmd 修改以下项( nacos2.x 版本,如:nacos-2.2.2 )
把 set "NACOS_JVM_OPTS=-server -Xms2g -Xmx2g -Xmn1g
更改为 set "NACOS_JVM_OPTS=-server -Xms512m -Xmx512m -Xmn256m
如:
rem if nacos startup mode is cluster
if %MODE% == "cluster" (
echo "nacos is starting with cluster"
if %EMBEDDED_STORAGE% == "embedded" (
set "NACOS_OPTS=-DembeddedStorage=true"
)
set "NACOS_JVM_OPTS=-server -Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=%BASE_DIR%\logs\java_heapdump.hprof -XX:-UseLargePages"
)
5、nacos2.x 集群启动报错问题
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'authConfigs': Invocation of init method failed; nested exception is ErrCode:50002, ErrMsg:Empty identity, Please set nacos.core.auth.server.identity.key
and nacos.core.auth.server.identity.value
, detail: https://nacos.io/zh-cn/docs/v2/guide/user/auth.html
解决方案:
5.1、打开 .../nacos-server-2.2.2\nacos\conf\application.properties
修改以下 3 项( nacos2.x 版本,如:nacos-2.2.2 )
##1)修改前
#db.pool.config.minimumIdle=2
##1)修改后,此项非必要,但最好修改一下
db.pool.config.minimumIdle=4
##2)修改前
#nacos.core.auth.enabled=false
##2)修改后:开启鉴权
nacos.core.auth.enabled=true
##3)修改前
#nacos.core.auth.server.identity.key=
#nacos.core.auth.server.identity.value=
##3)修改后 : 配置自定义身份识别的 key 和 value (不可为空)
nacos.core.auth.server.identity.key=nacos
nacos.core.auth.server.identity.value=nacos
5.2、 有可能是端口冲突问题,修改端口号,我修改了两次端口号( 8852 --> 8850 --> 8855 )
5.3、堆内存问题,打开 .../nacos/bin/startup.cmd
修改以下项( nacos2.x 版本,如:nacos-2.2.2 )
把 set "NACOS_JVM_OPTS=-server -Xms2g -Xmx2g -Xmn1g
更改为 set "NACOS_JVM_OPTS=-server -Xms512m -Xmx512m -Xmn256m
如:
rem if nacos startup mode is cluster
if %MODE% == "cluster" (
echo "nacos is starting with cluster"
if %EMBEDDED_STORAGE% == "embedded" (
set "NACOS_OPTS=-DembeddedStorage=true"
)
set "NACOS_JVM_OPTS=-server -Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=%BASE_DIR%\logs\java_heapdump.hprof -XX:-UseLargePages"
)
5.4、修改后,重新启动 nacos2.x
nacos2.x 集群启动报错问题,nocos 堆内存问题,堆内存溢出,
6、nacos2.x 访问地址无登录界面,登录后显示:当前集群没有开启鉴权问题
(版本2.2.2)
解决方案:
6.1、打开 .../nacos-server-2.2.2\nacos\conf\application.properties
修改以下 3 项( nacos2.x 版本,如:nacos-2.2.2 )
##1)修改前
#nacos.core.auth.enabled=false
##1)修改后:开启鉴权
nacos.core.auth.enabled=true
#2)关闭使用 user-agent 判断服务端请求并放行鉴权的功能
nacos.core.auth.enable.userAgentAuthWhite=false
##3)修改前:
#nacos.core.auth.caching.enabled=false
##3)修改后:权限缓存开关,开启后权限缓存的更新默认有15秒的延迟,默认 : false
nacos.core.auth.caching.enabled=true
##4)修改前
#nacos.core.auth.server.identity.key=
nacos.core.auth.server.identity.value=
##4)修改后 : 配置自定义身份识别的 key 和 value (不可为空)
nacos.core.auth.server.identity.key=nacos
nacos.core.auth.server.identity.value=nacos
##5)修改前
nacos.core.auth.plugin.nacos.token.secret.key=
##5)修改后:自定义用于生成JWT令牌的密钥,注意:原始密钥长度不得低于32字符,且一定要进行Base64编码,否则无法启动节点。
nacos.core.auth.plugin.nacos.token.secret.key=${NACOS_AUTH_TOKEN:SecretKey01234567890123456789012345345678999987654901234567890123456789}
6.2、修改后,重新启动 nacos2.2.2
7、当改变 nacos 版本时(如 nacos-1.1.3 改变为 nacos-2.2.2 ),
导入的 nacos-mysql.sql 没有变时,
启动 nacos 浏览器登录 nacos 界面时,点击权限管理出现以下错误
caused: PreparedStatementCallback; bad SQL grammar [SELECT count(*) FROM permissions WHERE 1=1 ]; nested exception is java.sql.SQLSyntaxErrorException: Table 'nacos_config.permissions' doesn't exist;caused: Table 'nacos_config.permissions' doesn't exist;
解决方案:
1)SQLyon 或其他 登录 mysql 数据库 nacos_config 清空数据库表
右键 nacos_config 数据库
--> 更多数据库操作
--> 清空数据库...
2)重新导入新的数据表,如 nacos-2.2.2 版本 conf 目录下的 mysql-schema.sql
右键 nacos_config 数据库
--> 导入
--> 执行 SQL 脚本
--> 点击 ...
--> 浏览选择
...\nacos-server-2.2.2\nacos\conf\mysql-schema.sql
--> 执行
重新导入,即可。
上一节关联链接请点击
# Spring Cloud Alibaba Nacos_配置中心与服务发现(三)