Nacos
约 3270 字大约 11 分钟
2025-02-27
1、认识Nacos
Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。
GitHub主页: https://github.com/alibaba/nacos
GitHub的Release下载页: https://github.com/alibaba/nacos/releases
安装Nacos: http://www.xydream.cn/articles/71
文档:https://nacos.io/docs/latest/what-is-nacos/
下载: GitHub的Release下载页: https://github.com/alibaba/nacos/releases
startup.cmd -m standalone
默认是没有开启鉴权的,也就是不需要用户名和密码。如果有密码,默认用户名是nacos,密码也是nacos。
4、鉴权设置
https://nacos.io/docs/latest/guide/user/auth/
5,服务注册
1,在微服务中添加nacos服务发现的依赖
<!-- nacos客户端依赖包 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2,修改yml配置文件
server:
port: 8090 # 服务端口
spring:
application:
name: oms-service # 服务名,必须设置
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
3,启动查看
心跳机制
当一个服务注册到Nacos注册中心时,它会向Nacos发送一个心跳包,告诉Nacos它仍然处于活动状态。服务提供者定期发送心跳包,以保证其状态信息是最新的。如果一个服务提供者在指定的时间段内没有发送心跳包,Nacos就会将该服务提供者的状态设置为不可用,并将其从可用服务列表中移除。
对于超过15s没有发送客户端心跳的实例会将它的healthy属性置为false(客户端服务发现时不会发现),如果某个实例超过30秒没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送心跳则会重新注册)。
临时实例和永久实例
public class Instance implements Serializable {
/**
* If instance is ephemeral.
*/
private boolean ephemeral = true;
# false为永久实例,true表示临时实例
spring.cloud.nacos.discovery.ephemeral=false
6,环境隔离(命名空间)
- 添加命名空间
在服务列表上可见
将服务注册到不同的命名空间下,修改配置文件
spring:
application:
name: oms-service
cloud:
nacos:
discovery:
server-addr: 47.120.37.156:8848
namespace: 05a5d2c3-b562-4184-a2d7-6618aecb84a3 # 命名空间ID
7,配置中心
1,为什么需要配置中心
首先我们来看一下,微服务架构下关于配置文件的一些问题:
配置文件相对分散。在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不好统一配置和管理。
配置文件无法区分环境。微服务项目可能会有多个环境,例如:测试环境、预发布环境、生产环境。每一个环境所使用的配置理论上都是不同的,一旦需要修改,就需要我们去各个微服务下手动维护,这比较困难。
配置文件无法实时更新。我们修改了配置文件之后,必须重新启动微服务才能使配置生效,这对一个正在运行的项目来说是非常不友好的。基于上面这些问题,我们就需要配置中心的加入来解决这些问题。
配置中心的思路是:
首先把项目中各种配置全部都放到一个集中的地方进行统一管理,并提供一套标准的接口。
当各个服务需要获取配置的时候,就来配置中心的接口拉取自己的配置。
当配置中心中的各种参数有更新的时候,也能通知到各个服务实时的过来同步最新的信息,使之动态更新。
当加入了服务配置中心之后,我们的系统架构图会变成下面这样:
2,使用nacos配置中心
添加配置
在弹出框中填写
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
在项目中添加bootstrap.yml配置文件
spring:
application:
name: oms-service # 服务名
profiles:
active: dev # 开发环境
cloud:
nacos: # Nacos配置
config: # 配置中心配置
server-addr: 127.0.0.1:8848 # Nacos地址
file-extension: yaml # 配置文件格式
namespace: 05a5d2c3-b562-4184-a2d7-6618aecb84a3 # 命名空间ID
group: DEFAULT_GROUP # 组名
username: nacos # 用户名
password: nacos # 密码
discovery: # 注册中心配置
server-addr: 127.0.0.1:8848 # Nacos地址
namespace: 05a5d2c3-b562-4184-a2d7-6618aecb84a3 # 命名空间ID
group: DEFAULT_GROUP # 组名
username: nacos # 用户名
password: nacos # 密码
组装成 oms-service-dev.yaml 读取配置中心的配置信息
8,
我们最终的目的,是修改 nacos 中的配置后,微服务中无需重启即可让配置生效,也就是配置热更新。
有两种方式:
- 用
@value
读取配置时,搭配@RefreshScope
- 直接用
@ConfigurationProperties
读取配置
@RestController
@RequestMapping("/oms")
@RequiredArgsConstructor
@Tag(name = "订单服务", description = "订单相关操作")
@RefreshScope
public class OmsController {
@Value("${springdoc.info.title}")
public String name;
@Operation(summary = "获取订单", description = "根据订单ID获取订单信息")
@Schema(name = "订单ID", type = "integer", required = true)
@GetMapping("/get/{id}")
public String getOrder(@PathVariable("id") Long id){
// 调用商品服务获取商品信息
System.out.println(apiDocInfoProperties.getTitle());
return "订单服务获取商品信息111:"+ pmsFeignClient.getPms(id)+"\t"+name+"\t"+apiDocInfoProperties.getTitle();
// return "订单服务获取商品信息:"+ restTemplate.getForObject("http://pms-service/pms/get/"+id, String.class);
// return "Order-"+id;
}
}
@ConfigurationProperties(prefix = "springdoc.info")
public class ApiDocInfoProperties {
...
}
9,配置共享
spring:
application:
name: oms-service # 服务名
profiles:
active: dev # 开发环境
cloud:
nacos: # Nacos配置
config: # 配置中心配置
server-addr: 47.120.37.156:8848 # Nacos地址
file-extension: yaml # 配置文件格式
namespace: 05a5d2c3-b562-4184-a2d7-6618aecb84a3 # 命名空间ID
refresh-enabled: true # 是否刷新配置
# shared-configs: # 共享配置
# - syh-common.yaml
#或者
shared-configs[0]:
data-id: syh-common.yaml
refresh: true # 是否刷新配置
discovery: # 注册中心配置
server-addr: 47.120.37.156:8848 # Nacos地址
namespace: 05a5d2c3-b562-4184-a2d7-6618aecb84a3 # 命名空间ID
# ephemeral: false # true表示注册时不持久化,false表示注册时持久化
spring:
cloud:
nacos:
config:
server-addr: localhost:8848
file-extension: yaml
extension-configs[0]:
data_id: common-redis.yaml
group: DEFAULT_GROUP
# 动态刷新
refresh: true
extension-configs[1]:
data_id: common-mysql.yaml
refresh: true
在Nacos中创建配置
其中:oms-service-dev.yaml 是订单模块开发环境的配置信息
oms-service-test.yaml是订单模块测试环境的配置信息
oms-service.yaml 是两个环境共享的配置信息
syh-common.yaml 是订单模块读取的第三方共享配置