三、配置中心
原本我们是写在每个配置文件中的,若是我们要修改配置文件,那么就需要去重新打包然后部署,对于在微服务时代,可能会有大量的重复实例,难道要重新去一个个重启部署吗?
3.1、配置文件持久化介绍
在nacos配置中心中我们可以根据不同的分组来进行管理我们的配置文件,并且对应的服务也能够进行动态去读取配置文件的最新内容,在nacos配置中心里其配置是进行持久化存储的,其是存储在mysql数据库当中。
3.2、实战四:nacos-config服务读取配置中心文件
nacos控制台添加配置文件
注意了,配置格式一定要选择yaml,因为之后我们配置文件配置的文件类型就是yaml,否则会一直读取不到的!
接着点击发布即可:
nacos-config服务构建读取配置文件
引入依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>
1、开启服务注册注解:
@EnableDiscoveryClient
2、配置类User:
package com.changlu.nacosconfig.config; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; /** * @Description: * @Author: changlu * @Date: 10:58 PM */ @Component @Data @AllArgsConstructor @NoArgsConstructor public class User { @Value("${user.username}") private String username; @Value("${user.age}") private Integer age; @Value("${user.sex}") private String sex; @Value("${user.hobby}") private String hobby; @Value("${user.height}") private Integer height; }
3、添加一个控制器,在控制器中会去返回读取配置信息的内容
package com.changlu.nacosconfig.controller; import com.changlu.nacosconfig.config.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @Description: * @Author: changlu * @Date: 11:06 PM */ @RestController @RequestMapping("/user") public class UserController { @Autowired private User user; @GetMapping("/info") public String getUserInfo() { System.out.println(user); String res = this.user.toString(); //注意:添加了@RefreshScope注解不能在mvc的方法中直接返回,因为该user是代理类,进行序列化会进行报错! return res; } }
4、关键的来了,配置文件的参数设置
bootstrap.yml:该配置会先于application.yaml读取 server: port: 8081 spring: application: name: nacos-config profiles: active: dev cloud: nacos: config: server-addr: localhost:8848 # 指定命名空间和组名(默认是去public空间及DEFAULT_GROUP组中去找) # namespace: 477245fa-d5e1-47e0-9580-4a8e268c3f58 # 若是不指定,默认就是public # group: B_GROUP # 若是不指定,默认是DEFAULT_GROUP # 关键两个读取配置的信息 # prefix: nacos-config # 配置文件的前缀 file-extension: yml # 文件类型
可以看到在这里配置中并没有去指定命名空间以及组名,那么此时就表示默认是去public空间以及DEFAULT_GROUP组去查找。
对于配置文件的名字会如下进行搜索:当前是在public空间、`DEFAULT_GROUP组``
注意:一旦我们指定指定的命名空间与组时,那么就会去该组中查找是否有该配置,若是没有项目会在启动过程中就会报错!
我尝试了下,报错内容如下:
测试
还是依据上面的配置来进行启动,接着去访问接口:http://localhost:8081/user/info
成功读取到配置!
3.3、动态刷新配置类信息(两种方案)
注意:添加了@RefreshScope注解不能在mvc的方法中直接返回,因为该user是代理类,进行序列化会进行报错!
方式一:读取某个属性使用@Value注解,并在对应的配置类上添加@RefreshScope
import org.springframework.cloud.context.config.annotation.RefreshScope; @RefreshScope //刷新配置注解 public class Config { @Value("${config.name}") private String name; @Value("${config.type}") private String type;
方式二:直接使用@ConfigurationProperties 读取配置,如下
@ConfigurationProperties(prefix = "config") public class Config { private String name; private String type; }
3.4、实战五:多环境读取配置、共享多组配置变量以及扩展多组配置文件
nacos读取配置中心流程补充
下面图例来自:Nacos实现配置管理及集群搭建,觉得讲的很清晰直接拿来了,如有侵权,联系我删除。
在没加入 Nacos 配置之前,获取配置是这样:
加入 Nacos 配置,它去读取远程nacos的配置文件是在 application.yml 之前的:
所以我们此时不能够在application.yml中来去配置远程nacos的配置中心地址,应当在更高优先级的bootstrap.yml文件中来进行配置:
这就是我们为什么要再bootstrap配置文件中进行书写配置的原因了!
实操测试
在nacos中提供了多环境读取配置、共享多组配置变量以及扩展多组配置文件。
多环境读取配置:只需要你进行添加spring.application.active变量来进行指定即可。
共享多组配置变量:nacos中提供了shared-configs配置参数,你可以来配置多条相同命名空间不同组的配置文件。
扩展多组配置文件:nacos中提供了extension-configs配置参数,你可以来配置多条相同命名空间不同组的配置文件。
下面就来尝试下:
准备好我们的配置类以及一个控制器来进行输出配置类信息:
package com.changlu.nacosconfig.config; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; /** * @Description: * @Author: changlu * @Date: 10:12 AM */ @Data @AllArgsConstructor @NoArgsConstructor @Component //@RefreshScope @ConfigurationProperties(prefix = "config") public class Config { // @Value("${config.name}") private String name; // @Value("${config.type}") private String type; private String envSharedValue; private String a; private String b; }
控制器类:
package com.changlu.nacosconfig.controller; import com.changlu.nacosconfig.config.Config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @Description: * @Author: changlu * @Date: 11:06 PM */ @RestController @RequestMapping("/user") public class UserController { @Autowired private Config config; @GetMapping("/config") public String getUserInfo() { String res = config.toString(); return res; } }
配置类:
server: port: 8088 spring: application: name: nacos-config profiles: active: pro cloud: nacos: username: nacos password: nacos config: server-addr: localhost:8848 # 注册到nacos的注册中心的服务地址 namespace: 477245fa-d5e1-47e0-9580-4a8e268c3f58 # 若是不指定,默认就是public group: A_GROUP # 若是不 指定,默认是DEFAULT_GROUP file-extension: yaml # 文件类型 shared-configs: # 共享变量 - data-id: nacos-config.yaml group: DEFAULT_GROUP refresh: true # 是否支持刷新 extension-configs: # 扩展配置文件 - data-id: nacos-config-a.yaml group: A_GROUP refresh: true # 是否支持刷新 - data-id: nacos-config-b.yaml group: B_GROUP refresh: true # 是否支持刷新
首先是多环境变量的解释:
接下来是多组共享变量的解释:
最后则是多组扩展配置文件的解释:
之后我们来进行测试一下:
①设置成dev来进行启动:
调用接口测试一下:
②接着设置成pro来测试一下:
没得问题!
3.5、配置文件中心总结(包含不同位置文件写什么、优先级、示例)
一般nacos项目的话,会在本地配有一个bootstrap配置文件,然后远端配置好多环境配置文件,以及一些公共的配置项,这就可能用到共享配置以及扩展配置了!
那么在不同文件中具体写什么呢?
1、boostrap.yml:应用名称,nacos的注册中心配置以及配置文件读取指定。
2、远端配置:
多环境:端口、测试环境、生产环境的密码等。
公共:redis配置、mysql配置等等。
扩展:项目自定义的一些配置项。
配置项优先级介绍:
1、针对于多组配置如公共、扩展的。
上述两类配置都是数组,对同种配置,数组元素对应的下标越⼤,优先级越⾼。也就是排在后⾯的相同配置,将覆盖排在前⾯的同名配置。
例如:同为扩展配置(公共配置同样如此),存在如下优先级关系:extension-configs[3] > extension-configs[2] > extension-configs[1] > extension-configs[0。
2、不同种类配置的优先级:主配置 > 扩展配置(extension-configs) > 共享配置(shared-configs)。
看下我在阅读其他博文中给出的配置示例: