引言:
SpringCloud Alibaba 系列目录
一、搭建SpringCloud工程,请前往:保姆级教程构建SpringCloud工程(图文结合)
二、集成服务注册配置管理中心Nacos,请前往:SpringCloud集成服务注册配置管理中心Nacos
三、集成HTTP客户端工具OpenFeign,请前往:SpringCloud集成HTTP客户端工具OpenFeign
四、集成统一网关SpringCloud Gateway,请前往:SpringCloud集成微服务API网关Gateway(详解)
一、选择Nacos版本
我的项目中的SpringcloudAlibaba 版本为SpringCloudAlibaba 2021.0.4.0
根据SpringCloudAlibaba版本选择合适的Nacos版本
从 " https://github.com/alibaba/spring-cloud-alibaba/wiki/版本说明 " 中找到 组件版本关系。
如下图: 找到到SpringCloudAlibaba 2021.0.4.0 版本所对应的 Nacos 组件版本为 2.0.4
二、引入Nacos服务注册与发现客户端依赖
在payment和order服务的pom文件中增加
<!-- nacos客户端依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
修改 Payment和Order服务的yml配置文件
server-addr 可以直接配置在nacos下 代表注册中心和配置中心地址。
配置在discovery 下 表示注册中心地址 ,单独配置时优先级大于配置nacos下的
配置的集群为 HZ
spring:
cloud:
nacos:
# Nacos服务地址
server-addr: localhost:8848
# Nacos的服务注册与发现
discovery:
# Nacos服务地址
#server-addr: localhost:8848
# 配置集群名称,也就是机房位置,例如:HZ 杭州
cluster-name: HZ
# Nacos可视化命名空间ID
# namespace:
三、启动Nacos
进入Nacos的bin目录下
在cmd 窗口下执行 startup.cmd -m standalone 使Nacos以单机的形式启动
启动Order和Paymen服务,进入Nacos可视化查看 服务管理 --> 服务列表
查看paymentservice详情 ,所属集群为 HZ
四、环境隔离 - namespace
在Nacos控制台 - 命名空间 -> 新建命名空间 可以创建namespace,用来隔离不同环境
保存后,可以看到刚创建的命名空间.
配置命名空间ID,配置的是Id不是名称
cloud:
nacos:
# Nacos服务地址
server-addr: localhost:8848
# Nacos的服务注册与发现
discovery:
# Nacos服务地址
server-addr: localhost:8848
# 配置集群名称,也就是机房位置,例如:HZ 杭州
cluster-name: HZ
# Nacos可视化命名空间ID
namespace: cdd2a801-3280-4476-8362-d46318aac1a3
五、临时实例和非临时实例
- 非临时实例:
- 非临时实例是常驻的服务实例,它们注册到服务注册中心后会持续存在,直到手动注销或因其他原因被删除。
- 当一个非临时实例注册到服务注册中心时,它会在注册表中保持活动状态,直到主动注销。
- 非临时实例通常用于长期运行的服务,例如应用程序、数据库等。
- 临时实例:
- 临时实例是一种临时性的服务实例,它们注册到服务注册中心后会自动删除,在一定时间内没有续约时会被认为失效并被自动注销。
- 当一个临时实例注册到服务注册中心时,它需要定期发送心跳包来告知注册中心它仍然存活,如果一段时间内没有收到心跳包,注册中心会将该实例标记为失效并将其删除。
- 临时实例通常用于临时性任务或短期运行的服务,例如定时任务、临时节点等。
区别:
- 生命周期:非临时实例是长期存在的,而临时实例是临时性的,会在一定时间内失效并被删除。
- 注册行为:非临时实例需要手动注销,而临时实例会在一定时间内没有续约时被自动注销。
- 使用场景:非临时实例适用于长期运行的服务,而临时实例适用于临时性任务或短期运行的服务。
一般使用临时实例,非临时实例会一直占用服务器资源,即使实例并不活跃也会一直占用,导致资源浪费
cloud:
nacos:
discovery:
ephemeral: false # 设置为非临时实例
六、集成Nacos统一配置管理中心
在Payment和Order服务的pom文件中增加 统一配置管理中心客户端依赖
<!-- nacos 统一配置管理中心客户端依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
在orderservice中的resource目录添加一个bootstrap.yml,这个文件是引导文件,优先级高于application.yml
spring:
application:
# 服务名称
name: orderservice
profiles:
active: dev
cloud:
nacos:
# Nacos服务地址
server-addr: localhost:8848
# Nacos的服务注册与发现
discovery:
# Nacos服务地址
server-addr: localhost:8848
# 配置集群名称,也就是机房位置,例如:HZ 杭州
cluster-name: HZ
# Nacos可视化命名空间ID
namespace: cdd2a801-3280-4476-8362-d46318aac1a3
# Nacos的统一配置管理中心
config:
# 在 Nacos Spring Cloud 中,dataId 的完整格式如下:
# ${prefix}-${spring.profiles.active}.${file-extension}
# prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
# spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
# file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。
file-extension: yaml #配置文件后缀名
prefix: orderservice
namespace: cdd2a801-3280-4476-8362-d46318aac1a3
1.在Nacos控制台添加配置
在控制台 配置管理-> 配置列表 中新增 orderservice-dev.yaml 配置文件
配置填写完成后点击发布
在 Nacos Spring Cloud 中,dataId
的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
prefix
默认为spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来配置。spring.profiles.active
即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当spring.profiles.active
为空时,对应的连接符-
也将不存在,dataId 的拼接格式变成${prefix}.${file-extension}
file-exetension
为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension
来配置。目前只支持properties
和yaml
类型。
Nacos配置内容获取步骤:
2. 测试获取配置的属性和热更新
热更新:Nacos控制太改变配置内容,项目中能够实时感知并进行更新
Nacos配置更改后,微服务可以实现热更新,方式:
①通过@Value注解注入,结合@RefreshScope来刷新
②通过@ConfigurationProperties注入,自动刷新
注意事项:
•不是所有的配置都适合放到配置中心,维护起来比较麻烦
•建议将一些关键参数,需要运行时调整的参数放到nacos配置中心,一般都是自定义配置
/**
* @author waves
* @date 2024/5/20 15:37
*/
@RestController
@RequestMapping("/system/order")
@RefreshScope//在@Value注入的变量所在类加上这个注解,可以监听Nacos配置变更,实现热刷新,无需自动重启 第一种方式 ,方式二在PatternProperties.java
public class SysOrderController {
@Value("${pattern.dateformat}")
private String dateFormat;
@GetMapping("/now")
public String getNowTime(){
return LocalDateTime.now().format(
DateTimeFormatter.ofPattern(dateFormat, Locale.CHINA)
);
}
}
http://localhost:18088/orderservice/system/order/now
//测试结果:
2024-05-22 19:23:39
//更改nacos配置文件
pattern:
dateformat: yyyy年MM月dd日 HH:mm:ss
//发布之后在进行接口调用,不需要重启项目
//测试结果:
2024年05月22日 19:24:26
//按照上述配置就能获取到Nacos控制台配置的内容了
//第二种获取Nacos控制台配置文件内容
/**
* @author waves
* @date 2024/5/22 11:26
*/
@Component
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
private String dateformat;
}
七、多环境配置共享
微服务启动时会从nacos读取多个配置文件:
l[spring.application.name]-[spring.profiles.active].yaml,例如:orderservice-dev.yaml
l[spring.application.name].yaml,例如:orderservice.yaml
无论profile如何变化,[spring.application.name].yaml这个文件一定会加载,因此多环境共享配置可以写入这个文件
多种配置的优先级:
多服务配置共享有两种方式:
spring:
application:
# 服务名称
name: orderservice
profiles:
#环境
active: dev
cloud:
nacos:
# Nacos服务地址
server-addr: localhost:8848
# Nacos的服务注册与发现
discovery:
# Nacos服务地址
server-addr: localhost:8848
# 配置集群名称,机房位置,例如:HZ 杭州
cluster-name: HZ
# Nacos可视化命名空间ID
namespace: cdd2a801-3280-4476-8362-d46318aac1a3
# Nacos的统一配置管理中心
config:
# 方式一 多微服务之间共享的配置列表
shared-configs:
#要共享的配置文件Id
-dataId: common.yaml
# 方式二 多微服务之间共享的配置列表
# extension-configs:
#要共享的配置文件Id
# -dataId: common.yaml
多种配置的优先级:
服务名-profile.yaml >服务名称.yaml > extension-config > shared-config > 本地配置