服务注册配置中心Nacos



一. 前言

PS: 本篇博客为作者学习笔记实际技术参考意义不大,小编将持续更新完善本篇文章。
Nacos服务注册配置中心,一个更易于构建云原生应用的动态服务发现,配置管理和服务管理平台,属于Springcloud Alibaba 体系中的组件之一,也是目前企业开发中最流行的服务注册与配置中心。
在这里插入图片描述
更多详细信息各位小伙伴可以参照Springcloud Alibaba官网: 点击跳转官网
Nacos源码地址: 点击跳转源码地址
Nacos官网地址: 点击跳转官网
一些注册中心特性对比:
在这里插入图片描述

二. 下载安装

1. 下载安装包

Nacos既可以在Windows上使用,也可以在Linux上面使用,下面两种系统的Nacos安装小编都会介绍到,首先我们要准备好Nacos的安装包,点进入Nacos的仓库 点击跳转
点击 【发行版】就可以看到Nacos的全部历史版本
在这里插入图片描述
点击 【标签】可以选择想要的版本下载
在这里插入图片描述
选择好版本点击最右边的【下载】后翻到最下面就可以看到对应的下载文件,【zip】则是windows版本 【tar.gz】就是Linux使用的版本。
在这里插入图片描述

2. Windows环境安装

准备好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就完成了

3. Linux环境安装

对于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

1. 单击模式启动

首先进入到已经解压好的Nacos目录的bin目录下:

cd /usr/local/nacos/bin

执行下面的命令启动Nacos:

sh startup.sh -m standalone

下面的情况是正常启动了
在这里插入图片描述
停止Nacos的命令:

sh shutdown.sh

2. 集群模式启动

集群模式的启动需要先创建数据库,脚本位置: /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

3. 远程web控制

我们可以执行下面的命令放行当前主机的8848端口,以便我们访问远程的web控制台:

firewall-cmd --zone=public --add-port=8848/tcp --permanent

放行完端口再执行下面的命令重启一下当前主机的防火墙:

firewall-cmd --reload

紧接着我们就可以访问 http://当前主机地址:8848/nacos 就会出现下面的情况:
在这里插入图片描述
默认的用户名是: nacos 默认的密码也是: nacos

4. 注册为系统服务

为了更加方便的管理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服务 (推荐使用)

三. 基本使用

1. 添加依赖

要想使用Nacos首先要在父工程的POM文件中添加下面的依赖:

<dependencyManagement>
	<dependencies>
		<dependency>
		    <groupId>com.alibaba.cloud</groupId>
		    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
		    <version>2.2.5.RELEASE</version>
		    <type>pom</type>
		    <scope>import</scope>
		</dependency>
	<dependencies>
<dependencyManagement>

在这里插入图片描述
然后修改子工程的POM文件,将下面的依赖加入其中:

<!-- nacos客户端依赖包 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2. 服务注册

spring:
	application:
     name: orderservice  # 服务名
	cloud:
	 nacos:
	 	server-addr: 127.0.0.1:8848 # 服务地址

再启动服务就可以在后台管理界面中的【服务列表】选项卡的子选项卡 【服务列表】中找到我们注册的服务。
在消费者进行服务调用的时候也就可以通过服务名进行调用了(orderservice代替id地址和端口),且Nacos自带了负载均衡。

3. 配置实例集群属性

配置当前服务的实例归属于哪个集群
修改模块的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

4. 实例权重负载均衡

实际部署中会出现这样的场景:服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求。
Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。
在这里插入图片描述
默认权重都是1,在服务升级和优化时可以将该服务权重设置成0,该服务就不会再收到请求。

5. 环境隔离

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

在这里插入图片描述
注意: 只有相同命名空间的服务实例才可以相互调用

6. 临时实例与非临时实例

默认在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配置管理

1. Nacos实现配置热更新

Nacos处理可以担任服务注册中心,还可以担任服务的配置中心,首先我们需要在模块的POM文件中添加Nacos的配置管理依赖:

<!--nacos的配置管理依赖-->
<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</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指定的前缀名跟变量名拼接和后台管理系统中的属性一致才可生效,一般第一种方式用的比较多。
在这里插入图片描述

2. Nacos多环境配置共享

假设一个业务场景,一个配置在开发环境,生产环境都需要用到,那么每份配置都配置一次显然是相当麻烦的。
在这里插入图片描述
这样无论是生产还是测试相同的配置都写在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集群搭建

官方给出的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安装包
  • 配置nacos
  • 启动nacos集群
  • nginx反向代理

1. 搭建数据库

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

2. 启动

将nacos文件夹复制三份,分别命名为:nacos1、nacos2、nacos3
然后分别修改三个文件夹中的application.properties,
nacos1:

server.port=8845

nacos2:

server.port=8846

nacos3:

server.port=8847

然后我们就可以分别将他们都启动起来

3. 安装Nginx

关于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的各个节点应该部署到多个不同服务器,做好容灾和隔离。

猜你喜欢

转载自blog.csdn.net/Siebert_Angers/article/details/128371124