SpringCloud 学习笔记2(Nacos)
Nacos
Nacos 下载
Nacos Server 下载 | Nacos 官网
下载、解压、打开文件:
更改 Nacos 的启动方式
Nacos 的启动模式默认是集群模式。在学习时需要把他改为单机模式。

把 cluster
改为 standalone
,记得保存!

启动startup.cmd
Ubuntu 启动命令:bash startup.sh -m standalone
启动成功后进入 http://127.0.0.1:8848/nacos/

Nacos 使用
引入依赖
在父项目引入:
<properties>
<spring-cloud-alibaba.version>2022.0.0.0-RC2</spring-cloud-alibaba.version>
</properties>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<scope>import</scope>
表示这个依赖直接注入到父项目中。
子项目中引入:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
修改配置
子项目的 yml 文件:
spring:
application:
name: order-service
cloud:
nacos:
discovery:
# Nacos 的服务器地址
server-addr: 101.201.246.67:8848
更改代码
更改之前在项目中写死的 url。
// 更改之前写死的 url
// String url = "http://127.0.0.1:9090/product/" + orderInfo.getProductId();
String url = "http://product-service/product/" + orderInfo.getProductId();
加上 @LoadBalanced
注解
@Configuration
public class BeanConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
启动服务,打开 Nacos 页面。

服务下线
选择要进行管理的服务,点击详情
选择要进行下线的服务器,点击下线。
权重配置
选择要进行管理的服务,点击详情
选择要进行管理的服务器,点击编辑。
进行权重设置。
如果权重没有生效,可以查看:如何解决MSE Nacos上修改服务实例的权重不生效问题_微服务引擎(MSE)-阿里云帮助中心
因为我在项目中使用了 Loadbalance 所以设置的权重并没有生效。
要想让权重生效,需要在消费者应用的配置文件中添加:
# 开启 Nacos 的负载均衡策略
spring:
cloud:
loadbalancer:
nacos:
enabled: true
需要注意的是,服务配置权重是非严格的。
什么叫非严格呢?
举个例子:服务 A 占权重的 50%,服务 B 占权重的 50%,如果来了两个请求,不一定是 A 处理一个请求,B处理一个请求。 如果来了 2 千万次的请求,A、B 处理的请求数接近 1 千万,而不是严格的等于 1 千万。
同集群优先访问
修改配置文件:
spring:
cloud:
nacos:
discovery:
# 修改集群名称
cluster-name: BJ
效果:
修改同一个服务,不同端口号的配置:
复制配置(右键你要修改的配置,按下图顺序点击)
选择要修改的服务,点击 Edit
修改配置,如果要修改多个配置,中间使用空格分隔。
生产者服务有3个,分别是 9090、9091 和 9092,9090 在集群 BJ 中,而9091 和 9092 在 集群 SH 中 。

消费者服务有一个,它在集群 BJ 中。
此时,多次调用消费者服务,发现消费者服务会优先访问同集群下的生产者服务,也就是 9090。
这就是同集群优先访问。
如果同集群下的生产者服务都挂掉了,那么本集群下的消费者服务就会转而访问不同集群下的生产者服务。
比如说,上述的 9090 挂掉了,那么 8080 就会开始访问 9091 和 9092 。
Nacos 健康检查
Nacos 提供了两种健康检查机制。
- 客户端主动上报机制。
- 客户端通过心跳上报方式告知服务器健康状态,默认的心跳间隔为 5 秒。
- Nacos 会在超过 15 秒未收到心跳后将实例设置为不健康状态,超过 30 秒就会将实例删除。
- 服务器端反向探测机制。
- Nacos 主动探知客户端健康状态,默认间隔为 20 秒。
- 健康检查失败后实例会标记为不健康,不会被立即删除。
Nacos 服务实例类型介绍
Nacos 的服务实例类型分为临时实例和非临时实例。
- 临时实例(默认类型):实例处于不健康状态超过一定时长,会被从服务列表删除。临时实例采用的是客户端主动上报机制。
- 非临时实例(也叫做永久实例):实例哪怕一直处于不健康状态,也不会被删除。非临时实例采用的是服务器反向探测机制。

非临时实例设置方法:
在配置文件中添加
spring:
cloud:
nacos:
discovery:
# false 表示修改为非临时实例
ephemeral: false
由于 Nacos 会记录每一个实例的 IP,端口号以及实例类型,Nacos 不允许将临时实例修改为非临时实例,非临时实例也不能修改为临时实例。如果想修改,则需要停止 Nacos 并删除 Nacos 中的 raft 文件夹。
raft 文件夹在
nacos/data/protocol/
目录下。
删除后重启 Nacos,即可修改成功。
环境隔离
创建命名空间
起名字
将实例放在指定环境
查看命名空间 ID
修改 yml 配置
spring:
cloud:
nacos:
discovery:
# 设置服务管理的命名空间,后面跟命名空间的 ID
namespace: 031fd6a5-8ead-4999-bdeb-4733fb730182
不在同一命名空间下的服务不能互相访问,这就是 Nacos 的环境隔离。
Nacos 配置中心
配置中心的流程

- 服务启动时,从配置中心读取配置内容,进行初始化。
- 配置修改时,通知微服务,实现配置的更新功能。
Nacos 配置中心使用
添加配置
Data ID 介绍
当三个配置同时存在,且各不相同时,它们的优先级为:
1. ${prefix}-${spring.profiles.active}.${file-extension} 2. ${prefix}.${file-extension} 3. ${prefix}
例如有如下三个配置:
![]()
它们的优先级为:
在生产者服务中引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringCloud 2020.*之后版本需要引⼊bootstrap-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
修改配置文件
在生产者服务中创建 bootstrap.yml 或者 bootstrap.properties 文件。
在 bootstrap.yml 或者 bootstrap.properties 中添加以下配置。
spring:
application:
name: product-service
cloud:
nacos:
config:
# Nacos 的服务器地址(从哪里获取配置信息)
server-addr: 101.201.246.67:8848
从 nacos 读取配置文件
// @RefreshScope 这个注解的作用是当 nacos 中的配置发生更改,服务实例也同步更改配置。也就是配置热更新。
@RefreshScope
@RestController
public class NacosController {
@Value("${nacos.config}")
private String nacosConfig;
@RequestMapping("getConfig")
public String getConfig() {
return "从 Nacos 中获取配置项 nacos.config:" + nacosConfig;
}
}
Nacos 配置管理的命名空间和服务器列表的命名空间是分别设置的,默认是public。
Nacos 命名空间配置依然在 bootstrap.properties 中进行设置。
程序会先读取 bootstrap 中的配置,然后再读取 application 中的配置。
设置命名空间:
-
复制命名空间 ID
-
修改 bootstrap.properties 或 bootstrap.yml 文件
spring: cloud: nacos: config: namespace: 031fd6a5-8ead-4999-bdeb-4733fb730182 #配置中心的命名空间 ID
重启服务、访问接口,可以看到修改成功了!
部署到服务器
参考 博客系统笔记总结 2( Linux 相关) 中的部署 Web 项目到 Linux
有一点不同的是,由于程序会先读取 bootstrap 中的配置,然后再读取 application 中的配置。
为了方便管理,我们可以把 application.yml 删除,此时目录结构就变成了这样:
然后在 bootstrap 中添加:
spring:
profiles:
active: @profile.name@
但是因为 bootstrap 并不能识别 @ 符号,所以我们还需要在 pom 中添加:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/**</include>
</includes>
</resource>
</resources>
</build>
Eureka 和 Nacos 的区别
共同点:都支持服务注册和服务发现。
区别:
-
Nacos 除了服务注册和服务发现外,还提供了配置中心、流量管理和 DNS 服务等功能。
-
CAP 理论
Eureka 遵循 AP 原则,Nacos 可以切换 AP 模式和 CP 模式,默认为 AP模式。
Nacos 根据配置识别 AP 和 CP 模式,如果注册 Nacos 的 Client 的节点是临时节点,那么 Nacos 对这个 Client 节点的效果就是 AP,反之是 CP。AP 和 CP 可以同时混合存在。
-
服务发现
Eureka:基于拉模式。Eureka Client 会定期从 Server 拉取服务信息,有缓存,默认每 30s 拉取一次。
Nacos:基于推送模式。服务列表有变化时实时推送给订阅者,服务端和客户端保持心跳连接。
本文到这里就结束啦~