在上面,已经学习了Eureka 用于服务注册和服务发现了,为什么还要学习Nacos呢?下面是在SpringCloud官网中的SpringAlibaba里面的一段对于Nacos的说明,从功能上可以看出来,Nacos支持的功能要比Eureka多。
01.下载
https://nacos.io/zh-cn/index.html //这是nacos的官网
https://github.com/alibaba/nacos/releases //nacos的下载地址
02.安装
01.将下载好的Nacos解压在一个中文路径上
02.解压完成后
03.启动nacos
方式一:双击bin/startup.cmd
方式二:
.\startup.cmd -m standalone //单机启动模式
如果出现找不到JAVA_HOME问题可以在启动脚本中将JAVA_HOME修改为所在路径
01.创建父工程
https://github.com/codeXYW/Microservices/tree/main/nacos
02.导入nacos依赖
https://github.com/codeXYW/Microservices/blob/main/nacos/pom.xml
03.创建服务
订单模块: https://github.com/codeXYW/Microservices/tree/main/nacos/order-service
导入依赖:https://github.com/codeXYW/Microservices/blob/main/nacos/order-service/pom.xml
用户模块: https://github.com/codeXYW/Microservices/tree/main/nacos/user-service
导入依赖:https://github.com/codeXYW/Microservices/blob/main/nacos/user-service/pom.xml
04.编辑配置文件件
spring:
application:
#必须配置服务名称
name: user-service
cloud:
nacos:
server-addr: localhost:8848 #nacos 服务地址
05.因为eureka和nacos都是支持rest访问的所以可以在只改变配置文件和依赖即可实现无缝切换,这个时候也可以去nacos控制台查看
一个服务可以有多个实例,可以将这多个实例称之为集群,但是在nacos引入了一个地区的概念(将同一个地区的实例同功能的实例称为一个集群),这就使得会优先访问相同地区的实例,可以降低延时效果,尽可能的避免跨集群的访问
配置集群只需要在配置文件中新增一个配置项
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8850
#设置名称
cluster-name: SH
实现效果
01.根据地区设置负载均衡
上面已经实现了,通过地区配置集群效果,但是没有实现通过地区选择负载均衡效果,要想实现这种负载均衡的效果就得先去修改负载均衡配置规则
user-service: #需要使用地区负载均衡的服务
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
使用了NacosRule后,会优先选择本地服务,如果本地服务中有多个会采用随机选择的方式来进行均衡
02.根据权重设置负载均衡
上面虽然实现了根据地区进行负载均衡,但是并没有考虑过不同的性能好坏而进行服务分发,所以可能会造成性能差的机器会崩掉,所以就需要用到根据管理员设置好的权重来进行配置,让性能好机器来处理更多的用户请求
1.在Nacos控制台设置实例权重
数字越低,访问到的概率就越低,设置为0后则不会被访问到
在nacos中可以给实例设置不同的环境,而每个环境的服务又不相同,默认的环境名称为public,也可以自己设置新的环境
设置好命名空间后,就可以在服务中进行配置
cloud:
nacos:
server-addr: 81.69.253.228:8848
discovery:
cluster-name: HN
namespace: 73972537-f019-4e75-8a40-64e2150b5fd6
配置好后就可以在控制台查看,并且不在同一个命名空间(环境)的服务是无法相互访问的。
在eureka和nacos中服务拉取不会一直拉取而是间歇性的每隔30秒拉取一次,然后缓存在一个列表内,然后从列表里面挑选服务,发送请求,而至于服务的注册eureka和nacos就有所不同,在nacos中会把实例分为临时实例和非临时实例,对于两种不同的实例采取不同的机制:
01.临时实例需要自主去发送心跳包来告诉注册中心存活,而非临时实例则是注册中心会主动去确认实例是否存活
02.临时实例一旦属于不健康状态时就会被注册中心从服务列表中剔除,而非临时实例则会一直存在服务列表等待其成为健康状态
而在eureka中已经挂掉的实例是会从服务列表中剔除,并且不会主动通知服务消费者这个实例已经挂掉了,nacos则会主动的推送给服务消费者
如何设置临时实例和非临时实例
cloud:
nacos:
discovery:
#注册中心地址
server-addr: 81.69.253.228:8848
#服务地区
cluster-name: SH
#命名空间
namespace: 73972537-f019-4e75-8a40-64e2150b5fd6
#是否为临时实例
ephemeral: false
首先需要创建一个配置
在新建配置时需要注意,配置的内容不是整个配置文件内的所有配置,而是说仅仅是需要热更新的配置可以放入里面,如果不需要热更新的配置是不建议放入nacos中增加服务器压力
在创建好配置后,服务是如何获取到配置的,首先我们需要了解 Nacos 读取配置文件的环节是在哪一步,在没加入 Nacos 配置之前,获取配置是这样:
加入 Nacos 配置,它的读取是在 application.yml 之前的:
这时候如果把 nacos 地址放在 application.yml 中,显然是不合适的,Nacos 就无法根据地址去获取配置了。
因此,nacos 地址必须放在优先级最高的 bootstrap.yml 文件。
首先引入依赖
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
添加配置文件bootstrap.yml
spring:
application:
name: order-service # 服务名称
profiles:
active: dev #开发环境,这里是dev
cloud:
nacos:
server-addr: 81.69.253.228:8848 # Nacos地址
config:
file-extension: yaml # 文件后缀名
根据 spring.cloud.nacos.server-addr 获取 nacos地址,再根据${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
作为文件id,来读取配置。
以上只是使用了nacos来进行配置管理,并不能实现配置文件热更新,配置的自动刷新
方式01:在需要热更新的类上加@RefreshScope注解
方式02:在需要注入的类上加@ConfigurationProperties(“前缀”)
在多环境中,不同的环境配置需求有相同的地方也有不相同的地方,在nacos启动的时候会从这个命名空间内读取多个配置文件
读取规则:
(拓展小点:配置注入时 是单例的,配置发生改变时只会修改变更了的结果,不会影响之前没发生改变的值,如果从配置中抹除配置项,已经注入的对象,是不会发生改变的)
在注册完成后就会有一个多配置文件的优先级问题,nacos默认:服务器名+环境名+文件后缀名> 服务名名+文件后缀名 > 服务名称 > 本地
其中三个Nacos节点,然后统一通过Nginx来对三个Nacos节点进行负载均衡,Nacos之间通过MySql数据库集群来进行数据同步
01.首先下载nacos,将文件复制为三份修改其配置文件,分别为以下配置
节点 | ip | port |
---|---|---|
nacos1 | 127.0.0.1 | 8848 |
nacos2 | 127.0.0.1 | 8849 |
nacos3 | 127.0.0.1 | 8850 |
02.配置数据库
Nacos 默认数据存储在内嵌数据库 Derby 中,不属于生产可用的数据库。官方推荐的最佳实践是使用带有主从的高可用数据库集群,主从模式的高可用数据库。这里我们以单点的数据库为例。
首先新建一个数据库,命名为 nacos,而后导入下面的 SQL
SQL文件链接: https://github.com/codeXYW/Microservices/tree/main/nacos/sql
03.配置nacos
进入 nacos 的 conf 目录,修改配置文件 cluster.conf.example,重命名为 cluster.conf
127.0.0.1:8848
127.0.0.1.8849
127.0.0.1.8850
然后修改 application.properties 文件,添加数据库配置
#设置nacos端口
server.port=8848/8849/8850
#添加数据库数据
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=123456
04.配置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;
}
}
然后分别启动三个集群 startup.cmd
05.使用集群
spring:
cloud:
nacos:
server-addr: localhost:80 # Nacos地址 之所以是80端口是因为Nginx代理了,访问80端口最后由Nginx来做负载均衡转发
项目文件地址