Nacos,一款服务发现、配置管理工具,诞生于微服务尤其是Spring Cloud微服务框架大行其道时,相当于Spring Cloud Eureka + Spring Cloud Config。无论是单机版还是集群版,都推荐使用MySQL作为存储。MySQL安装请看:CentOS 8安装MySQL8记录
Nacos支持三种部署模式
从GitHub Release页面可以获知当前最新发布版本,并下载安装包。Nacos配置信息等数据默认存储到内嵌数据库Derby中。实战中一般会使用其他数据库。本地MySQL版本是5.5.57,在创建数据表config_info
时报错:Invalid default value for 'gmt_create'
猜测是版本兼容问题。在控制台console下执行如下SQL语句报错:
确实是版本兼容问题。Nacos1.4.1,默认支持MySQL 8版本,不向下兼容低版本MySQL。由于并不知道nacos哪个版本默认支持MySQL5,或Nacos版本发布日志找起来很麻烦。另一方面也推荐开发环境使用较新版本的工具。升级MySQL版本。
从MySQL下载地址下载安装8.0即可。
编辑文件,
Ctrl + R,全文搜索替换
CREATE TABLE
替换为CREATE TABLE IF NOT EXISTS
use nacos;
12张数据表;
application.properties
配置数据库
编辑startup.cmd
文件,找到MODE,更新如下:
rem set MODE="cluster"
set MODE="standalone"
双击startup.cmd
文件启动,打开http://localhost:8848/nacos/,默认的用户名密码为 nacos/nacos,
如果双击cmd文件,控制台输出报错信息:
Caused by: java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up
com.mysql.cj.exceptions.UnableToConnectException: Public Key Retrieval is not allowed
大意是连接失败,MySQL服务已经启动,重试解决问题。
问题:如何安装为服务?
参考
wget https://github.com/alibaba/nacos/releases/download/1.4.1/nacos-server-1.4.1.tar.gz
http://192.168.20.145:8848/nacos
https://www.freesion.com/article/4748443321/
cd /root
tar zxvf nacos-server-1.4.1.tar.gz
mv nacos /usr/local/nacos
编写开机启动文件:
vim /lib/systemd/system/nacos.service
文件内容:
[Unit]
Description=nacos
After=network.target
[Service]
Type=forking
# -m standalone表示作为单机启动,不加表示集群启动
ExecStart=/usr/local/nacos/bin/startup.sh -m standalone
ExecReload=/usr/local/nacos/bin/shutdown.sh
ExecStop=/usr/local/nacos/bin/shutdown.sh
PrivateTmp=true
[Install]
WantedBy=multi-user.target
使用内置数据库安装:
sh startup.sh -p embedded
MySQL导入nacos-mysql.sql
脚本:
create database nacos;
use nacos;
source /usr/local/nacos/conf/nacos-mysql.sql;
先进行文件生效配置
systemctl daemon-reload
设置为开机启动:
systemctl enable nacos.service
启动nacos服务:systemctl start nacos.service
如果启动报错:
Job for nacos.service failed because the control process exited with error code. See "systemctl status nacos.service" and "journalctl -xe" for details.
执行命令:journalctl -xe
输出关键信息:which: no javac in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin)
执行命令:whereis javac
输出:javac: /usr/local/java/bin/javac
创建软链接:ln -s /usr/local/java/bin/javac /usr/bin/javac
启动成功后进行查看:
systemctl status nacos.service
停止服务:
systemctl stop nacos.service
集群模式和扩容是一样的,可通过Nginx转发到多个节点,最前面挂一个域名即可:
可以只安装并创建一个数据库,三台Nacos节点都指向同一个MySQL库(注),三个节点全部编辑
vim /lib/systemd/system/nacos.service
[Unit]
Description=nacos
After=network.target
[Service]
Type=forking
# -m standalone表示作为单机启动,不加表示集群启动
ExecStart=/usr/local/nacos/bin/startup.sh
ExecReload=/usr/local/nacos/bin/shutdown.sh
ExecStop=/usr/local/nacos/bin/shutdown.sh
PrivateTmp=true
[Install]
WantedBy=multi-user.target
配置application.properties
文件:
# 指定数据源为MySQL
spring.datasource.platform=mysql
# 数据库实例数量
db.num=1
db.url.0=jdbc:mysql://<ip>:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=<password>
网上说,针对application.properties
文件,需要对三台机器都是相同的更改?但实际安装下来,只在安装有MySQL那台机器的节点更改此配置。
三台机器全部配置cluster.conf
文件:
切换到目录:cd /usr/local/nacos/conf/
复制:cp cluster.conf.example cluster.conf
编辑:vim cluster.conf
# 不代表安装过程中的真实IP
192.168.12.203:8848
192.168.12.204:8848
192.168.12.205:8848
切换到bin
目录:cd /usr/local/nacos/bin/
执行启动脚本,默认就是集群模式,不需要加任何参数:sh startup.sh
或者./startup.sh
查看安装日志:
cat /usr/local/nacos/logs/start.out
成功一半。下面配置Nginx:
切换目录:cd /etc/nginx/conf.d
新建文件:vim nacos.conf
添加如下配置信息:
upstream nacos {
server centos170:8848;
server centos203:8848;
server centos113:8848;
}
server {
listen 80;
server_name centos170;
location /nacos/ {
proxy_pass http://nacos/nacos/;
}
}
集群搭建成功后,可以通过:http://centos170/nacos访问。
上面提到3台Nacos指向同一个MySQL节点。可以假想一下:如果三台节点都安装并MySQL数据库,然后每个Nacos节点分别指向本机的MySQL节点,有什么优势和劣势
MySQL的高可用,高可用MySQL搭建方案有很多,不同方案搭建方式不同:
引入依赖:
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
即注册中心,Nacos的服务发现,有主动拉取和推送两种模式。拉模型:
List<Instance> getAllInstances(String serviceName) throws NacosException;
List<Instance> selectInstances(String serviceName, boolean healthy) throws NacosException;
Instance selectOneHealthyInstance(String serviceName) throws NacosException;
Nacos 提供三个同步拉取服务的方法:
一般情况下,订阅端并不关心不健康的实例或权重设为 0 的实例,但是也不排除一些场景下,有一些运维或者管理的场景需要拿到所有的实例。上述 Nacos 实例中有一个 weight 字段,便是作用在此处的selectOneHealthyInstance接口上,按照权重返回一个健康的实例。一般的 RPC 框架都有自身配套的负载均衡策略,很少会由注册中心提供此功能。
除了主动查询实例列表,Nacos还提供订阅模式来感知服务下实例列表的变化,包括服务配置或者实例配置的变化。可以使用下面的接口来进行订阅或者取消订阅:
void subscribe(String serviceName, EventListener listener) throws NacosException;
void unsubscribe(String serviceName, EventListener listener) throws NacosException;
在实际的服务发现中,订阅接口尤为重要。消费者启动时,一般会同步获取一次服务信息用于初始化,紧接着订阅服务,实现服务发现。
引入依赖:
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
配置文件优先级(由高到低):bootstrap.properties
-> bootstrap.yml
-> application.properties
-> application.yml
。
在Nacos后台管理页面新增一个配置文件时,Data ID的完整格式如下:${prefix}-${spring.profiles.active}.${file-extension}
prefix
默认为spring.application.name
的值,可通过配置项spring.cloud.nacos.config.prefix
来配置;spring.profiles.active
即为当前环境对应profile,注意当spring.profiles.active
为空时,对应的连接符-
也将不存在,Data ID拼接格式变成${prefix}.${file-extension}
;file-exetension
为配置内容的数据格式,可通过配置项spring.cloud.nacos.config.file-extension
来配置,目前只支持 properties 和 yaml 类型。几个概念:
在使用Nacos后,如果不能实现配置的热更新,而必须要重启应用程序才能生效,那引入Nacos就会感觉不是很必要。
使Nacos支持配置热更新的方式:
Bean类上增加@RefreshScope
注解+@Value("${my.nacos.config: johnny}")
当配置越来越多时,就会发现有很多配置是重复的,此时即可考虑将公共配置文件提取出来。即所谓的配置共享。根据是否隶属于一个微服务的配置信息,又包括如下两种:
新增一个没有profile的配置文件,然后把所有环境的公共配置键值对放到此配置文件中,其他环境的配置文件将会继承此文件,再追加每个环境不一样的配置信息即可。
配置越来越多后,会发现不同微服务之间也有一些配置信息是重复的。此时可以新增一个all-service.yaml
文件,然后修改bootstrap.yaml
:
spring:
cloud:
nacos:
config:
shared-dataids: all-service.yaml # 配置要引入的配置
refreshable-dataids: all-service.yaml # 配置要实现动态配置刷新的配置
Nacos提供Namespace、Group、Data ID来确定一个配置文件。因此,实现多环境配置的方案也有三种:
启动参数:-Dspring.cloud.nacos.config.namespace=
命名空间用默认的public,启动参数:-Dspring.cloud.nacos.config.group=
利用Data ID命名来区分环境,命名空间和组默认即可。启动参数:-Dspring.profiles.active=dev
等
总结: