PS
: 本篇博客为作者学习笔记实际技术参考意义不大,小编将持续更新完善本篇文章。
Nacos服务注册配置中心,一个更易于构建云原生应用的动态服务发现,配置管理和服务管理平台,属于Springcloud Alibaba 体系中的组件之一,也是目前企业开发中最流行的服务注册与配置中心。
更多详细信息各位小伙伴可以参照Springcloud Alibaba官网: 点击跳转官网
Nacos源码地址: 点击跳转源码地址
Nacos官网地址: 点击跳转官网
一些注册中心特性对比:
Nacos既可以在Windows上使用,也可以在Linux上面使用,下面两种系统的Nacos安装小编都会介绍到,首先我们要准备好Nacos的安装包,点进入Nacos的仓库 点击跳转。
点击 【发行版】就可以看到Nacos的全部历史版本
点击 【标签】可以选择想要的版本下载
选择好版本点击最右边的【下载】后翻到最下面就可以看到对应的下载文件,【zip】则是windows版本 【tar.gz】就是Linux使用的版本。
准备好Windows环境下的安装包后,就可以开始Windows环境下Nacos的安装了。
将准备好的安装包解压到任意目录下(最好是全英文的路径)解压后文件夹内结构如下:
bin目录是存放启动脚本的目录 conf目录是存放Nacos配置文件的目录。
关于端口配置,Nacos的默认端口是8848
,如果你电脑上的其它进程占用了8848端口,请先尝试关闭该进程。如果无法关闭占用8848端口的进程,也可以进入nacos的conf目录,修改配置文件中Nacos默认启动占用的端口:
确认端口没有问题后就可以进入bin目录启动cmd窗口,使用下面的命令启动Nacos:
startup.cmd -m standalone
也可以直接双击startup.cmd文件启动Nacos
看到上面这个样子就是启动成功了,也标明了启动占用的端口和后台的访问地址。
我们用浏览器直接访问 http://127.0.0.1:8848/nacos
即可,正常情况下会看到下面的内容:
默认的用户名和密码都是 nacos 直接登录即可,至此Windows环境下安装Nacos就完成了
对于Linux环境下Nacos安装相对于Windows环境下的安装要复杂一点,首先要准备好Linux版本的Nacos安装包,其次Nacos依赖于JDK运行,索引Linux上也需要安装JDK才行。
没有安装java环境的小伙伴可以参考小编这篇文章 点击跳转 配置好java环境后就可以开始我们的安装了。
首先将我们准备好的安装包上传到任意目录,列如 /usr/local/
然后使用下面的命令进行解压:
tar -xvf nacos-server-1.4.1.tar.gz
然后执行下面的命令删除安装包:
rm -rf nacos-server-1.4.1.tar.gz
首先进入到已经解压好的Nacos目录的bin目录下:
cd /usr/local/nacos/bin
执行下面的命令启动Nacos:
sh startup.sh -m standalone
sh shutdown.sh
集群模式的启动需要先创建数据库,脚本位置: /usr/local/nacos/conf/nacos-mysql.sql
利用该脚本创建数据库。
紧接着我们需要配置一下Nacos的配置文件:
cd /usr/local/nacos/conf
vim application.properties
修改下面的内容(将原来的注释放开,)
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://10.114.12.177:3306/nacos?serverTimezone=GMT%2B8&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root
注意: 此处的ip地址、端口号、数据库名、账号和密码都需要按照自己的实际情况进行修改
。
启动:
cd /usr/local/nacos/bin
sh startup.sh
查看启动日志:
cd /usr/local/nacos/logs
vim start.out
我们可以执行下面的命令放行当前主机的8848端口,以便我们访问远程的web控制台:
firewall-cmd --zone=public --add-port=8848/tcp --permanent
放行完端口再执行下面的命令重启一下当前主机的防火墙:
firewall-cmd --reload
紧接着我们就可以访问 http://当前主机地址:8848/nacos
就会出现下面的情况:
默认的用户名是: nacos 默认的密码也是: nacos
为了更加方便的管理Nacos,最好是将其注册为系统服务
首先使用下面的命令修改 /usr/local/nacos/bin/startup.sh 启动文件
vim /usr/local/nacos/bin/startup.sh
将路径修改为当前系统中存放jdk的路径:
使用下面的命令创建并编辑nacos.service
文件:
vim /lib/systemd/system/nacos.service
向文件中添加下面的内容:
[Unit]
Description=nacos
After=network.target
[Service]
Type=forking
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
保存退出后执行下面的命令重载一下系统服务:
systemctl daemon-reload
就完成了Nacos的系统服务注册,服务名就叫nacos
。
之后我们就可以使用操作系统服务的命令对Nacos进行操作了,下面是一些常用命令:
systemctl start nacos.service // 启动nacos服务
systemctl stop nacos.service // 停止nacos服务
systemctl status nacos.service // 查看nacos服务状态
systemctl enable nacos.service // 设置为开机自启
systemctl restart nacos.service // 重启nacos服务
systemctl reload nacos.service // 重载nacos服务 (推荐使用)
要想使用Nacos首先要在父工程
的POM文件中添加下面的依赖:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>2.2.5.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
<dependencies>
<dependencyManagement>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
spring:
application:
name: orderservice # 服务名
cloud:
nacos:
server-addr: 127.0.0.1:8848 # 服务地址
再启动服务就可以在后台管理界面中的【服务列表】选项卡的子选项卡 【服务列表】中找到我们注册的服务。
在消费者进行服务调用的时候也就可以通过服务名进行调用了(orderservice代替id地址和端口),且Nacos自带了负载均衡。
配置当前服务的实例归属于哪个集群
修改模块的Yml配置文件:
spring:
application:
name: orderservice # 服务名 可以通过相同的服务名部署多个实例
cloud:
nacos:
server-addr: 127.0.0.1:8848 # 服务地址
discovery:
cluster-name: hangzhou # 集群名
在web控制台中可以看到集群的信息,再编辑Yml配置文件设置负载均衡的1Rule为NacosRule,这个规则优先会寻找与自己同集群的服务,本地集群找不到提供者,才去其它集群寻找,并且会报警告。
确定了可用实例列表后,再采用随机负载均衡挑选实例。
userservice:
ribbon:
# 优先请求同集群的实例
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
实际部署中会出现这样的场景:服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求。
Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。
默认权重都是1,在服务升级和优化时可以将该服务权重设置成0,该服务就不会再收到请求。
Nacos中服务存储和数据存储的最外层都是一个名为namespacel的东西,用来做最外层隔离。
修改实例的命名空间需要修改服务的配置文件,默认都是存储在public(保留空间中):
spring:
application:
name: orderservice # 服务名 可以通过相同的服务名部署多个实例
cloud:
nacos:
server-addr: 127.0.0.1:8848 # 服务地址
discovery:
cluster-name: hangzhou # 集群名
namespace: 4d6ce343-9e1b-44df-a90f-2cf2b6b3d177 # dev环境 命名空间Id
默认在Nacos中注册的实例都是临时实例,那么临时实例与非临时实例有什么区别呢?
临时实例: 采用心跳检测(服务每隔一段时间就会发送一次请求给注册中心Nacos确保实例的可用性)当长时间没有向Nacos发送心跳请求Nacos就会在服务列表中将该实例剔除。
非临时实例: 不会拥有心跳检测机制,而是由Nacos主动发送请求询问实例,如果检测到非临时实例Nacos不会将其剔除,而是标记为不健康状态除非手动删除,否则会一直等待其恢复健康状态。
对于配置实例是否为临时实例需要配置实例的YAM配置文件:
spring:
application:
name: orderservice # 服务名 可以通过相同的服务名部署多个实例
cloud:
nacos:
server-addr: 127.0.0.1:8848 # 服务地址
discovery:
cluster-name: hangzhou # 集群名
namespace: 4d6ce343-9e1b-44df-a90f-2cf2b6b3d177 # dev环境 命名空间Id
ephemeral: false # 是否为临时实例 默认是true
Nacos处理可以担任服务注册中心,还可以担任服务的配置中心,首先我们需要在模块的POM文件中添加Nacos的配置管理依赖:
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
然后我们在后台管理界面中点击【配置管理】的【配置列表】模块右上角的加号先添加一个。
【Data ID】其实就是配置文件名 (必须唯一) 一般以“服务名-运行环境.后缀
” 作为文件名
列如
:userservice-dev.yaml
【Group】组ID 这个自定义
【配置格式】一般都是使用YAML,根据后缀自定义
【配置内容】根据选择的文件格式书写有热更新需求的配置
修改完成后点击右下角的【发布】即可,由于在读取Nacos中的配置文件之前我们实例就需要知道Nacos的服务地址等信息,所以我们一般将Naocs的配置放在加载优先级更高的bootstrap.yml
文件中
注
: bootstrap.yml又叫引导文件,加载优先级比application.yml要高
可以在resources目录中添加一个bootstrap.yml,需要添加的配置如下:
spring:
application:
name: userservice # 服务名
profiles:
active: dev # 环境
cloud:
nacos:
server-addr: 127.0.0.1:8848 # nacos地址
config:
file-extension: yaml # 文件后缀名
其中“服务名
”、“环境
”、“文件后缀名
” 其实就是我们上面在后台创建的配置文件名,相应的就会读取后台相应配置文件内容,在项目中我们也可以使用value注解读取配置文件中的内容,列如:
@Value("${pattern.dateformat}")
private String dateformat;
要想实现配置热更新还差最后一步,Ncos中的配置文件变更后,微服务无需重启就可以感知。不过需要通过下面两种配置实现:
需要 prefix指定的前缀名跟变量名拼接和后台管理系统中的属性一致才可生效,一般第一种方式用的比较多。
假设一个业务场景,一个配置在开发环境,生产环境都需要用到,那么每份配置都配置一次显然是相当麻烦的。
这样无论是生产还是测试相同的配置都写在userservice.yaml中,这样给我们带来了极大的便利
spring:
application:
name: userservice # 服务名
profiles:
active: dev # 环境
cloud:
nacos:
server-addr: 127.0.0.1:8848 # nacos地址
config:
file-extension: yaml # 文件后缀名
这样即可以读取到userservice-dev.yaml 配置文件的内容,也可以读取到userservice.yaml配置文件中的内容,即使环境为test环境也可以读取到userservice.yaml配置文件的内容。
如果两个文件中有一个相同的属性,或者说application.yml也有一个属性相同,那么文件的加载优先级是:
userservice-dev.yaml > userservice.yaml > application.yml
官方给出的Nacos集群图:
其中包含3个nacos节点,然后一个负载均衡器代理3个Nacos。这里负载均衡器可以使用nginx。
我们计划的集群结构:
三个nacos节点的地址:
节点 | ip | port |
---|---|---|
nacos1 | 192.168.150.1 | 8845 |
nacos2 | 192.168.150.1 | 8846 |
nacos3 | 192.168.150.1 | 8847 |
搭建集群的基本步骤:
Nacos默认数据存储在内嵌数据库Derby中,不属于生产可用的数据库,官方推荐的最佳实践是使用带有主从的高可用数据库集群
这里我们以单点的数据库为例来讲解。
将Nacos解压后,首先启动本机mysql,创建nacos数据库,并在nacos_config数据库下执行nacos-mysql.sql脚本 (脚本存放位置nacos/cont/nacos-mysql.sql):
mysql> source /opt/nacos/cont/nacos-mysql.sql;
进入nacos的conf目录,修改配置文件cluster.conf.example,重命名为cluster.conf:
然后添加内容:
127.0.0.1:8845
127.0.0.1.8846
127.0.0.1.8847
然后修改application.properties文件,添加数据库配置:
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123
将nacos文件夹复制三份,分别命名为:nacos1、nacos2、nacos3
然后分别修改三个文件夹中的application.properties,
nacos1:
server.port=8845
nacos2:
server.port=8846
nacos3:
server.port=8847
然后我们就可以分别将他们都启动起来
关于Nginx的安装小编的专栏里面有对应的文章。
修改conf/nginx.conf文件,配置如下:
upstream nacos-cluster {
server 127.0.0.1:8845;
server 127.0.0.1:8846;
server 127.0.0.1:8847;
}
server {
listen 80;
server_name localhost;
location /nacos {
proxy_pass http://nacos-cluster;
}
}
而后在浏览器访问:http://localhost/nacos即可。
代码中application.yml文件配置如下:
spring:
cloud:
nacos:
server-addr: localhost:80 # Nacos地址
实际部署时,需要给做反向代理的nginx服务器设置一个域名,这样后续如果有服务器迁移nacos的客户端也无需更改配置,Nacos的各个节点应该部署到多个不同服务器,做好容灾和隔离。