需先安装软件,官网:https://nacos.io/zh-cn/
在 conf/application.properties
文件中可以更改端口,默认为 8848
注册服务
父工程中添加管理依赖
1
2
3
4
5
6
7
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
注释掉 Eureka 的依赖,并添加 Nacos 客户端的依赖
1
2
3
4
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
修改 application.yml,添加 Nacos 地址,注释 Eureka 地址
1
2
3
4
spring:
cloud:
nacos:
server-addr: localhost:8848
启动 Nacos
1
2
startup.cmd -m standalone
# 参数为单机启动
访问 http://localhost:8848/nacos/ 登录账号密码都为 nacos
分级存储模型
服务分为多个集群,每个集群有多个实例,集群可以按地区分配,提供访问速度
相对的,Eureka 只有 服务-实例,无集群
服务调用尽可能选择本地集群的服务,跨集群调用延迟较高。本地集群不可访问时,再去访问其它集群
可以通过 application.yml 设置集群
1
2
3
4
5
6
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: Shanghai # 集群名称
然后设置 Ribbon 的策略为 Nacos 的
1
2
3
4
5
# 给某个微服务配置负载均衡规则,这里是userService服务
userService:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.Nac # 负载均衡规则
然后可以在 Nacos 设置实例的权重 (0-1),权重越大,访问频率越高
环境隔离
Nacos 中服务存储和数据存储的最外层都是一个名为 namespace 的东西,用来做最外层隔离
可以在 Nacos 中新建一个命名空间,如 dev
,然后修改 application.yml
1
2
3
4
5
6
7
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: Shanghai # 集群名称
namespace: UUID # 此处为命名空间的UUID
不同 namespace 下的服务互相不可见,无法访问
临时实例与非临时实例
对于临时实例,Nacos 的处理方法和 Eukera 一致
对于非临时实例,Nacos 会主动询问是否存活,服务不可用不会删除,在服务不可用时,Nacos 会主动通知 消费者
设置非临时实例
1
2
3
4
5
spring:
cloud:
nacos:
discovery:
ephemeral: false # 设置为非临时实例
Nacos 配置管理
当微服务部署的实例变多,逐个更改配置非常麻烦,可以使用 Nacos 将配置集中管理,并且可以热更新
简单使用
在 Nacos 控制台的配置管理,新建配置,其中 Data ID
为配置文件的 id,格式为 [服务名称]-[profile].[后缀名]
,例如 userService-dev.yaml
然后在配置内容书写配置即可,例如
1
2
pattern:
dateformat: yyyy-MM-dd HH:mm:ss
引入 Nacos 的配置管理客户端依赖
1
2
3
4
5
<!--nacos配置管理依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
配置获取的步骤
项目启动 -> bootstrap.yml -> Nacos 配置文件 -> 本地 application.yml -> 创建 Spring 容器 -> 加载 bean
添加 bootstrap.yml
1
2
3
4
5
6
7
8
9
10
spring:
application:
name: userService # 服务名称
profiles:
active: dev #开发环境,这里是dev
cloud:
nacos:
server-addr: localhost:8848 # Nacos地址
config:
file-extension: yaml # 文件后缀名
测试
1
2
3
4
5
6
7
8
9
10
11
12
@RestController
@RequestMapping("/user")
public class UserController{
@Value("${pattern.dateformat}")
private String dateformat;
@GetMapping("/now")
public String now(){
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat))
}
}
访问页面查看效果
热更新
可以通过两种方式实现
方式一:在 @Value 注入的变量所在类上添加注解 @RefreshScope
1
2
3
4
5
6
7
8
9
10
11
12
13
@RefreshScope // 配置自动刷新
@RestController
@RequestMapping("/user")
public class UserController{
@Value("${pattern.dateformat}")
private String dateformat;
@GetMapping("/now")
public String now(){
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat))
}
}
方式二:使用 @ConfigurationProperties
新建配置类
1
2
3
4
5
6
@Component
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
private String dateformat;
}
Controller 类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// @RefreshScope // 配置自动刷新
@RestController
@RequestMapping("/user")
public class UserController{
// @Value("${pattern.dateformat}")
// private String dateformat;
@Autowired
private PatternProperties properties;
@GetMapping("/now")
public String now(){
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(properties.getDateformat()))
}
}
配置共享
微服务启动时,会从 Nacos 读取多个配置文件
-
[spring.application.name]-[spring.profiles.active].yaml
,例如:userService-dev.yaml -
[spring.application.name].yaml
,例如:userService.yaml
而 第二个 [spring.application.name].yaml
不包含环境,可以被多个环境共享
配置优先级:[spring.application.name]-[spring.profiles.active].yaml
> [spring.application.name].yaml
> 本地配置