赞
踩
目录
微服务架构下关于配置文件的一些问题:
配置文件相对分散。在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散
在各个微服务中,不好统一配置和管理。
配置文件无法区分环境。微服务项目可能会有多个环境,例如:测试环境、预发布环境、生产环
境。每一个环境所使用的配置理论上都是不同的,一旦需要修改,就需要我们去各个微服务下手动
维护,这比较困难。
配置文件无法实时更新。我们修改了配置文件之后,必须重新启动微服务才能使配置生效,这对一
个正在运行的项目来说是非常不友好的。
基于上面这些问题,我们就需要配置中心的加入来解决这些问题。
配置中心的思路是:
总结:
服务管理平台:服务注册、配置和路由
配置管理:统一的配置管理
Nacos的学习资源主要有以下两个
Nacos官网: Nacos官网
Nacos GitHub: NacosGitHub
快速下载 nacos 的地址 :快速下载地址
本项目使用版本一览,测试两个版本都ok
Spring Boot | Spring Cloud | Spring Cloud Alibaba | Nocos | JDK |
---|---|---|---|---|
2.7.7 | 2021.0.5 | 2021.0.5.0 | 2.2.9.RELEASE | 1.8 |
2.3.12.RELEASE | 2.2.9.RELEASE | 1.8 |
注意:SpringBoot3.0开始不支持jdk8
参考博客:Nacos安装(二)
单机模式启动Nocos服务后,访问登录
地址:http://127.0.0.1:8848
用户名/密码:nacos/nocos
1)配置中心简介
2)创建命名空间
如果想指定不同开发环境配置,如开发环境,测试环境等,我们就需要配置我们刚刚在上面讲的namespace。创建命名空间如下图所示:
命名空间ID:测试环境、生产环境
描述:对环境的描述
创建命名空间后,我们就可以在配置列表中看到我们创建的命名空间
3)创建配置文件
选择对应的命名空间,点击右边加号创建配置文件
dataId 的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
prefix:默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置
spring.profiles.active:即为当前环境对应的 profile。 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变
file-exetension:为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。
比如说我们现在要获取应用名称为
nacos-config-client
的应用在dev
环境下的yaml
配置,dataid如下:nacos-config-client-dev.yaml
使用nacos作为配置中心,Nacos读取的是bootstrap.yml,而我们项目中的配置文件名称是application.properties/application.yml,所以我们要修改我们项目中的配置文件名为bootstrap.yml。
首先,我们还是要引入 Maven 依赖,在maven仓库使用最新版本:
- <!--注册中心的依赖-->
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
- <version>2.2.9.RELEASE</version>
- </dependency>
- <!-- 配置中心的依赖 -->
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
- <version>2.2.9.RELEASE</version>
- </dependency>
注意:注册中心和配置中心的依赖版本要根据 SpringBoot 版本来选择。
具体版本对应关系;版本说明 · alibaba/spring-cloud-alibaba Wiki (github.com)
在微服务resources中创建bootstrap.yml文件,添加如下nacos配置信息:
- spring:
- application:
- name: nacos-test
- profiles:
- #指定启动环境
- active: dev
- cloud:
- nacos:
- discovery:
- # Nacos服务注册中心地址
- server-addr: 127.0.0.1:8848
- # 分组,不同分组之间不能调用,用于微服务之间的隔离
- group: DEFAULT_GROUP
- # 生产环境
- namespace: 534c904d-7f24-4086-acbd-daf628cb1446
- config:
- # 是否开启配置中心 默认true
- enabled: true
- # 指定Nacos配置中心的地址
- server-addr: 127.0.0.1:8848
- # 区分环境:开发环境、测试环境、预发布环境、⽣产环境
- namespace: 91d34e57-55b0-4182-b881-ab0b5aefabe9
- # 区分不同应⽤:同⼀个环境内,不同应⽤的配置,通过group来区分。
- group: ${spring.profiles.active}
- #指定yaml格式的配置 默认properties
- file-extension: yaml
- # 自动刷新配置文件,默认true
- refresh-enabled: true
- # Nacos 认证用户
- username: nacos
- # Nacos 认证密码
- password: nacos
- # 配置文件prefix
- prefix: ${spring.application.name}
-
增加一个 Nacos 的配置文件,通过这个类可以拉取nacos中配置:
-
- import com.alibaba.cloud.nacos.NacosConfigProperties;
- import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
- import com.alibaba.nacos.api.exception.NacosException;
- import com.alibaba.nacos.api.naming.NamingService;
- import lombok.Data;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.cloud.context.config.annotation.RefreshScope;
- import org.springframework.stereotype.Component;
- import javax.annotation.PostConstruct;
-
- /**
- * @program: NacosConfig
- * @description: NacosConfig
- * @author: dyt
- * @create: 2022-07-29 16:39
- **/
- // 刷新配置
- @RefreshScope
- @Data
- @Component
- public class NacosConfig {
-
- @Value("${server.port}")
- private Integer serverPort;
-
- @Value("${spring.application.name}")
- private String applicationName;
-
- // @NacosInjected
- // private NamingService namingService;
-
- @Autowired
- NacosConfigProperties nacosConfigProperties;
-
- @Autowired
- NacosDiscoveryProperties nacosDiscoveryProperties;
- /**
- * 通过Naming服务注册实例到注册中心
- *
- * @throws NacosException
- */
- @PostConstruct
- public void registerInstance() throws NacosException {
-
- NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();
-
- namingService.registerInstance(applicationName, "127.0.0.1", serverPort);
-
- }
- }
- @NacosValue注解是Spring Cloud Alibaba Nacos提供的注解,用于获取Nacos配置中心的配置值。它可以自动监听配置变化并动态更新
@Value注解是Spring框架提供的注解,用于获取配置文件中的值,可以用于获取任意配置文件(如application.properties、application.yml)中的配置项。使用@Value注解时,需要指定配置项的完整路径,例如:@Value("${config.key}")。
我这里NamingService 始终报空指针异常,只能自己初始化
在Spring Boot的启动类上添加@EnableDiscoveryClient注解,启用Nacos的服务注册和发现功能。
- //启用Nacos作为服务发现的功能
- @EnableDiscoveryClient
- //引入了spring-cloud-starter-alibaba-nacos-discovery依赖时,默认情况下会自动启用Nacos的服务注册和发现功能
- @SpringBootApplication
- public class NacosTestApplication {
-
- public static void main(String[] args) {
- SpringApplication.run(NacosTestApplication.class, args);
- }
-
- }
- 如果想要配置项的值自动刷新,仅在
@NacosPropertySource
加autoRefreshed = true
是不够的,在@NacosValue
上面也得加autoRefreshed = true
- @EnableDiscoveryClient 注解,开启 Spring Cloud 的注册发现功能。不过从 Spring Cloud Edgware 版本开始,实际上已经不需要添加
@EnableDiscoveryClient
注解,只需要引入 Spring Cloud 注册发现组件,就会自动开启注册发现的功能。例如说,我们这里已经引入了spring-cloud-starter-alibaba-nacos-discovery
依赖,就不用再添加@EnableDiscoveryClient
注解了
最后我们写一个模拟获取配置参数的 Controller 类
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。