Nacos是SpringCloudAlibaba的一个组件,遵循SpringCloud规范
1.支持服务端主动检测服务提供者状态。临时实例采用心跳检测,非临时实例采用主动检测
2.Nacos支持服务列表变更消息推送,消息更加及时
3.拥有服务分级存储、权重配置、环境隔离等友好配置,优化了服务提供和获取的各种方式
在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码:
GitHub主页:https://github.com/alibaba/nacos
GitHub的Release下载页:https://github.com/alibaba/nacos/releases
windows版本使用nacos-server-xxx.zip
包即可。
目录说明:
Nacos的默认端口是8848,如果你电脑上的其它进程占用了8848端口,请先尝试关闭该进程。
如果无法关闭占用8848端口的进程,也可以进入nacos的conf目录,修改配置文件中的端口:
修改其中的内容:
启动非常简单,进入bin目录,结构如下:
然后执行命令即可:
windows命令:
startup.cmd -m standalone
在浏览器输入地址:http://127.0.0.1:8848/nacos即可:默认的账号和密码都是nacos:
Linux或者Mac安装方式与Windows类似。
Nacos依赖于JDK运行,所以Linux上也需要安装JDK才行。
下载jdk安装包:
然后解压缩:
tar -xvf jdk-8u144-linux-x64.tar.gz
然后重命名为java
配置环境变量:
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
设置环境变量:
source /etc/profile
Linux版本使用nacos-server-xxx.tar.gz
包即可。nacos-server-1.4.1.tar.gz
命令解压缩安装包:
tar -xvf nacos-server-1.4.1.tar.gz
然后删除安装包:
rm -rf nacos-server-1.4.1.tar.gz
与windows中类似
在nacos/bin目录中,输入命令启动Nacos:
sh startup.sh -m standalone
在需要注册到Nacos的服务的pom.xml文件中引入Nacos的客户端依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
在需要注册到Nacos的服务的配置文件中添加Nacos地址,默认端口是8848
spring:
cloud:
nacos:
server-addr: localhost:8848
找到需要注册到Nacos的服务的启动类,进行启动,启动成功后,登录到Nacos控制台,可以看到出现新的服务
启动后查看nacos控制台
Nacos采用服务、集群、实例的分级模型,一个服务下可以有多个集群,一个集群下可以有多个实例。例如:一个orderService服务有三个不同实例:实例1、实例2、实例2,三个不同实例分布在不同的机房,一个机房中的实例就称为一个集群。微服务互相访问时,应该优先同一集群实例进行访问,当同一集群的实例不可访问时,才去访问其它集群的实例
修改服务的application.yml,添加 cluster-name
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: BJ # 集群名称
查看nacos控制台服务详情,可以看到出现集群信息
默认的ZoneAvoidanceRule
并不能实现根据同集群优先来实现负载均衡,Nacos提供了一个NacosRule
的实现,可以优先从同集群中挑选实例
给服务配置集群信息
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: BJ # 集群名称
在服务的application.yml修改负载均衡的规则
例如给:orderService进行配置
orderservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
实际使用场景中,不同的机器设备的性能也不同,最理想的场景是性能好的机器多承担一些请求,性能差的机器少承担一些请求,但是默认情况NacosRule是在集群内随机挑选,不会考虑机器性能情况。因此Nacos提供了控制台修改权重配置,权重越大,访问频率越高
注意:如果权重修改为0,则该实例永远不会被访问,可以用于服务升级和维护
Nacos提供了namespace来实现环境隔离功能,nacos中可以有多个namespace,每个namespace下有多个group和service,不同的namespace的服务之间是不可见的。Nacos中默认所有group和service都在一个namespace下,名称为public
spring:
application:
name: userservice
cloud:
nacos:
server-addr: 192.168.1.109:8848
discovery:
cluster-name: BJ
namespace: 348c7a78-0b69-43ff-9987-9fc4cafec67c #命名空间ID,创建命名空间时自动生成,复制即可
Nacos除了用做注册中心以外,它的另一大功能是配置管理,当微服务的数理越来越多时,微服务的配置文件难以进行管理,Nacos提供了配置管理,当配置文件变动时,及时通知对应的微服务,实现热更新
在Nacos控制台左侧找到“配置管理”下的“配置列表”选项,点击右侧“+“,填写配置表单
微服务要拉取Nacos里的配置,而且需要和本地配置文件application.yml中内容合并,才能完成项目启动
但是会有个问题,如果不先读取本地的application.yml文件,怎么会知道Nacos的地址?为了解决此问题,Spring引入了一种新的配置文件bootstrap.yaml,它会在application.yml文件被读取之前进行读取
在微服务中引入nacos-config依赖和nacos-discovery依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
在userservice微服务中新建bootstrap.yaml文件,并添加Nacos相关配置内容
spring:
application:
name: userservice # 服务名称
profiles:
active: pro # 环境名称
cloud:
nacos:
server-addr: 123.57.241.172:8848 #Nacos地址
config:
file-extension: yaml # 文件后缀名
会根据server-addr的值来获取Nacos地址,然后通过服务名称-环境名称-文件后缀名来获取配置文件,也就是上述配置文件中的:userservice-pro.yaml
可以在Nacos中添加配置文件,并使用java代码进行读取配置
注:一般项目的核心配置或者需要热更新的配置可以放到Nacos管理的配置文件中,一般变动不太大或者属于微服务特有的配置还是放在微服务本地的配置文件中
在Nacos进行配置文件修改后,最理想的状态就是微服务不需要重启就能立即生效,也就是平常所说的配置热更新。Java中实现配置热更新,有两种方式
使用@ConfigurationProperties代替@Value注解
微服务启动时会去Nacos中读取多个配置文件,一般有两种格式:
而服务名称-文件后缀名不包含环境,因此可以被多个环境共享。当Nacos和本地出现相同属性配置时,有优先级之分:服务名称-环境名称-文件后缀名>服务名称-文件后缀名>本地配置