Nacos是阿里开源的微服务架构组件,既可以用作服务注册中心,也可用作配置中心。
虽然Nacos的官方文档也有关于如何部署的说明,但是个人觉得不够详细和连续,故本文将阐述在单机环境实际搭建Nacos环境的详细步骤已经遇到的一些问题。
环境准备
由于安装的是单机环境,且需要使用MySQL数据库,所以需要在安装主机准备好Java8+运行时环境和MySQL数据库服务。
安装MySQL服务可以参考:yum方式安装mysql。
安装步骤
第一步:下载Nacos安装包
Nacos的最新发布版本可以从这里下载,有2中格式的压缩包文件(zip和tar.gz),分别为:nacos-server-${version}.tar.gz
和nacos-server-${version}.zip
。如本文示例中使用的安装包为:nacos-server-2.2.3.zip
。
第二步:安装Nacos
由于Nacos只是一个简单的压缩包,所以所谓的安装就是解压到一个指定的目录即可,比如:~/opt
。
1 | unzip nacos-server-2.2.3.zip -d ~/opt |
从Nacos的配置文件中可以找到有关MySQL的连接配置,如下:
1 | vim ~/opt/nacos/conf/application.properties |
显然,需要将如下几项配置参数的注释删除掉:
1 | spring.sql.init.platform=mysql |
由上述配置参数可知,默认连接的数据库名为nacos
,连接用户名为:nacos
,连接用户密码为:nacos
。
因此,需要登录MySQL数据库执行相应的初始化操作。
首先,需要创建一个名为nacos
的数据库(如下命令基于MySQL 8.0.34操作)。
1 | 创建数据库 |
其次,需要添加访问用户并为之授权。
1 | 添加用户 |
再者,在nacos的安装目录下还存在一个数据库表的初始化脚本,即:mysql-schema.sql
,需要将该脚本导入上面创建的nacos
数据库中。
1 | # 登录到MySQL中并切换到nacos数据库后执行如下操作 |
至此,运行一个使用MySQL数据库的单实例nacos环境已经准备好了。
第三步:启动Nacos
执行如下命令启动nacos:
1 | cd ~/opt/nacos/bin |
查看日志~/opt/nacos/logs/start.out
,当出现如下提示时说明nacos启动成功了。
1 | ,--. |
nacos启动后默认会打开4个端口:7848
,8848
,9848
,9849
。
各个端口的含义及作用描述如下:
端口 | 与主端口的偏移量 | 描述 |
---|---|---|
8848 | 0 | 主端口,客户端、控制台及OpenAPI所使用的HTTP端口 |
9848 | 1000 | 客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求 |
9849 | 1001 | 服务端gRPC请求服务端端口,用于服务间同步等 |
7848 | -1000 | Jraft请求服务端端口,用于处理服务端间的Raft相关请求 |
注:9849和7848端口为服务端之间的通信端口,请勿暴露到外部网络环境和客户端测。
第四步:停止Nacos
如果需要停止nacos,则执行如下操作:
1 | cd ~/opt/nacos/bin |
如何使用nacos作为注册中心
对于应用程序而言(不论是服务提供者还是服务消费者),通过如下2种方式集成nacos客户端即可接入nacos了。
方式1:引入nacos-client
组件。
1 | <dependency> |
方式2:对于Dubbo应用而言,还可以直接引入dubbo-registry-nacos
组件。
1 | <dependency> |
如果是应用程序是基于Spring Boot框架开发,添加如下配置:
1 | dubbo: |
如果项目并非基于Spring Boot框架开发,接入Nacos的详细步骤参考:Java SDK 。
至此,就完成了应用程序接入nacos的全部工作。
遇到的问题
Q1:主机未关闭防火墙,导致nacos无法连接MySQL数据库。
A1:我的安装环境为CentOS 8.5.2111
,默认是启动了防火墙的,即使MySQL服务和nacos安装在同一台主机也需要将防火墙关闭才能连接,否则nacos会启动失败,并且在日志中会看到报错信息:Caused by: java.lang.IllegalStateException: No DataSource set
。
当然,我看github上有人还遇到了同样的报错问题,参考:部署 Nacos:2.0.3 连接 MySQL 报错 Nacos Server did not start because dumpservice bean construction failure : No DataSource set。
关闭防火墙命令:systemctl stop firewalld.service