Nacos = Spring Cloud Eureka + Spring Cloud Config 通过Nacos Server和spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更 通过Nacos Server 和 spring-cloud-starter-alibaba-nacos-discovery实现服务的注册与发现 Nacos===注册中心+配置 Nacos可以用来作为配置中心
1、配置文件太多了,太分散啦,需要一个统一配置和管理 2、配置文件无法区分环境 通常我们开发要dev服、测试服、生产服等等 3、配置文件无法实时更新
====》配置中心来解决
服务配置中心
我们使用阿里巴巴的Nacos,除此之外还有springcloud自带的SpringCloud Config(没有可视化界面,全球用户)、携程的Apollo、百度的Disonf
1、服务发现和服务健康监测 2、动态配置服务 3、动态DNS服务 4、服务及其元数据管理
${latest.version}是最新版本,也可以使用你熟悉的版本。
<dependency> <groupId>com.alibaba.boot</groupId> <artifactId>nacos-config-spring-boot-starter</artifactId> <version>${latest.version}</version> </dependency>
nacos.config.server-addr=127.0.0.1:8848
@NacosPropertySource(dataId = "dataId_test", autoRefreshed = true) autoRefreshed = true即代表开启
@SpringBootApplication @NacosPropertySource(dataId = "dataId_test", autoRefreshed = true) public class NacosConfigApplication { public static void main(String[] args) { SpringApplication.run(NacosConfigApplication.class, args); } }
@Controller @RequestMapping("config") public class ConfigController { @NacosValue(value = "${useLocalCache:false}", autoRefreshed = true) private boolean useLocalCache; @RequestMapping(value = "/get", method = GET) @ResponseBody public boolean get() { return useLocalCache; } }
访问 http://localhost:8080/config/get,此时返回内容为true,说明程序中的useLocalCache值已经被动态更新了,测试成功
SpringCloud搭建nacos config前提最好了解一下SpringBoot怎么搭建的,应该很多东西是互通的。
其实就是把它当成服务端
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
配置文件优先级(由高到低): bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml
spring: application: name: service-product cloud: nacos: config: server-addr: 127.0.0.1:8848 #中心地址 file-extension: yaml # 配置文件格式 profiles: active: dev
程序正常启动即可
业界开源配置中心举例 Apollo Disconf SpringCloud Config Nacos
整个nacos结构nacos作为配置中心,Nacos Config 主要通过 dataId 和 group 来唯一确定一条配置.
Namespace 的常用场景之一是不同环境的配置的区分隔离,如dev、test、prod(分别对应开发环境、测试环境、生产环境(有些还有预发布环境)) 一般一个环境划分一个命名空间,如dev,test,prod
Group是项目,或者组的意思,它可以包括多个微服务,即这个项目下所有的微服务。 当您在 Nacos 上创建一个配置时(可以通过 spring.cloud.nacos.config.group 配置
),如果未填写配置分组的名称,则配置分组的名称默认采用DEFAULT_GROUP。
Nacos 中的某个配置集的 ID,也是某一个环境下项目下的具体微服务,这里是唯一的,如...-dev.yml,...-test.yml,....-prod.yml
在系统中,一个配置文件通常就是一个配置集。一般微服务的配置就是一个配置集
在 Nacos Config Starter 中,dataId 的拼接格式如下
${prefix} - ${spring.profiles.active} . ${file-extension}
(1)prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
在 bootstrap.yml中配置 Nacos server 的地址和应用名 spring: cloud: nacos: config: server-addr: 127.0.0.1:8848 spring: application: name: example
(2)spring.profiles.active 即为当前环境对应的 profile
(3)file-extension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension来配置。目前只支持 properties 和 yaml 类型。
注意,当 activeprofile 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 {prefix}.{file-extension} (4)file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。图来着https://blog.csdn.net/yilvqingtai/article/details/115427043
如果改了配置文件,我们可以通过程序的方式去刷新;当然没有写程序,我们云上重启服务实例也可以更新配置文件。 两种方法 1、只需要在需要动态读取配置的类上添加此注解就可以 @RefreshScope
@RestController @RequestMapping("/config") @RefreshScope public class ConfigController { @Value("${useLocalCache:false}") private boolean useLocalCache; @RequestMapping("/get") public boolean get() { return useLocalCache; } }
2、硬代码,applicationContext.getEnvironment().getProperty( "config.appName" )