Spring Cloud Alibaba之服务发现组件 - Nacos作为配置中心+配置属性动态刷新(五)

通过之前文章的学习我们已经学会了使用Nacos完成服务的注册与发现。同时也介绍了Spring Cloud中不同风格的服务消费方式。接下来,我们再来学习下Nacos的另一个重要功能:配置管理

简介

Nacos除了可以实现服务的注册与发现之外,还将配置中心的功能整合在一起。通过Nacos的配置管理功能,我们可以将整个架构体系能的所有配置都集中到Nacos中存储。这样做的好处主要有以下几点:

  • 分离的多环境配置,可以灵活的管理权限,安全性更高
  • 应用程序的打包更为纯粹,已实现一次打包,多处运行的特点

Nacos的配置管理模型与淘宝开源的配置中心Diamond类似,基础层面通过DataIdGroup来定位配置内容,除此之外还增加了很多其他的管理功能。

快速入门

下面我们通过一个简单的例子来介绍如何使用Nacos来创建配置内容以及如何在Spring Cloud应用中加载Nacos的配置信息。

创建配置

第一步: 进入Nacos的控制页面,在配置列表功能页面中,单击右上角的+按钮,进入新建配置页面,如图填写配置信息:

其中:

  • Data ID: 填入 alibaba-nacos-config-client.properties
  • Group: 使用默认值 DEFAULT_GROUP
  • 描述:可不填
  • 配置格式: 选择 Properties
  • 配置内容: 应用要加载的配置内容,这里仅作为实例,做简单的配置,比如: username=wolf

创建应用

第一步:创建一个Spring Boot应用,命名为:alibaba-nacos-config-client

第二步:编辑pom.xml, 加入必要的依赖配置:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.5.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley.SR1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>0.2.2.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.2</version>
        <optional>true</optional>
    </dependency>
</dependencies>

上述内容主要三部分:

  • parent:定义spring boot的版本
  • dependencyManagement:spring cloud的版本以及spring cloud alibaba的版本
  • dependencies:当前应用要使用的依赖内容。这里主要加入Nacos的配置客户端依赖包:spring-cloud-stater-alibaba-nacos-config。由于 dependencyManagement已经指定过版本号,这里不需要指定具体版本号。

注意:这个例子中并没有引入nacos的服务注册与发现依赖,因为这两个功能内容是完全可以独立使用的。

第三步: 创建应用主类和测试Controller接口

@SpringBootApplication
public class NacosConfigClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosConfigClientApplication.class, args);
    }
}
@Slf4j
@RestController
@RefreshScope
public class TestController {

    @Value("${username}")
    private String username;

    @GetMapping("/test")
    public String hello() {
        return username;
    }
}

内容非常简单,唯一可能默认的注解 :@RefreshScope这个注解是spring cloud提供的一种特殊的scope实现,用来实现配置、实例热加载。

在类上添加该注解,用来让这个类的配置内容支持动态刷新,也就是当我们启动应用之后,修改Nacos的配置文件内容,这里就会马上生效。

第四步: 创建配置文件bootstrap.properties,并配置服务名称和Nacos地址

server.port=9004
spring.application.name=alibaba-nacos-config-client
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

注意:

  • 这里的配置必须使用bootstrap.properties 或 bootstrap.yml,不能写在application.properties / application.yml不然启动会报错。
  • 同时,spring.application.name值必须和Nacos配置中 Data ID(除了.yml或者.properties)

为什么必须写在bootstrap.properties 或 bootstrap.yml中?

SpringCloudConfigNacosConfig这种统一配置服务在springboot项目中初始化时,都是加载bootstrap.properties 或 bootstrap.yml配置文件去初始化上下文。
这是由spring boot的加载属性文件的优先级决定的,想要在加载属性之前去config server上取配置文件,那NacosConfig或SpringCloudConfig相关配置就是需要最先加载的,而bootstrap.properties的加载是先于application.properties的,所以config client要配置config的相关配置就只能写到bootstrap.properties里了

第五步: 启动应用

2019-07-10 15:57:19.003  INFO 5240 --- [           main] o.s.c.a.n.c.NacosPropertySourceBuilder   : Loading nacos data, dataId: 'alibaba-nacos-config-client.properties', group: 'DEFAULT_GROUP'
2019-07-10 15:57:19.004  INFO 5240 --- [           main] b.c.PropertySourceBootstrapConfiguration : Located property source: CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='alibaba-nacos-config-client.properties'}]}

在启动的时候,可以看到类似上面的日志信息,这里输出应用程序要从Nacos中获取配置的 dataidgroup。如果启动之后,发现配置信息没有获取到的时候,可以检测下这块配置是否正确。

第六步:验证配置获取和动态刷新
使用postman工具,访问接口:http://localhost:9004/test, 将返回Nacos配置中的 username 值。然后,再通过Nacos页面,修改 username=admin,单击发布,再访问这个接口看结果是否实时更新。

修改前:



修改中:


发布完毕后,不要启动应用,重新访问接口,会发现结果实时更新。


同时会发现我们在修改Nacos配置信息,发布后,客户端控制台会发现如下日志:

2019-07-10 16:11:09.369  INFO 5240 --- [-127.0.0.1_8848] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@7f1bcf03: startup date [Wed Jul 10 16:11:09 CST 2019]; root of context hierarchy
2019-07-10 16:11:09.406  INFO 5240 --- [-127.0.0.1_8848] trationDelegate$BeanPostProcessorChecker : Bean 'configurationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$1bdb25d3] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2019-07-10 16:11:09.506  INFO 5240 --- [-127.0.0.1_8848] o.s.c.a.n.c.NacosPropertySourceBuilder   : Loading nacos data, dataId: 'alibaba-nacos-config-client.properties', group: 'DEFAULT_GROUP'
2019-07-10 16:11:09.506  INFO 5240 --- [-127.0.0.1_8848] b.c.PropertySourceBootstrapConfiguration : Located property source: CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='alibaba-nacos-config-client.properties'}]}
2019-07-10 16:11:09.507  INFO 5240 --- [-127.0.0.1_8848] o.s.boot.SpringApplication               : No active profile set, falling back to default profiles: default
2019-07-10 16:11:09.508  INFO 5240 --- [-127.0.0.1_8848] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@5d68f73a: startup date [Wed Jul 10 16:11:09 CST 2019]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@7f1bcf03
2019-07-10 16:11:09.525  INFO 5240 --- [-127.0.0.1_8848] o.s.boot.SpringApplication               : Started application in 0.234 seconds (JVM running for 831.73)
2019-07-10 16:11:09.525  INFO 5240 --- [-127.0.0.1_8848] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@5d68f73a: startup date [Wed Jul 10 16:11:09 CST 2019]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@7f1bcf03
2019-07-10 16:11:09.525  INFO 5240 --- [-127.0.0.1_8848] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@7f1bcf03: startup date [Wed Jul 10 16:11:09 CST 2019]; root of context hierarchy
2019-07-10 16:11:09.528  INFO 5240 --- [-127.0.0.1_8848] o.s.c.e.event.RefreshEventListener       : Refresh keys changed: [username]

上面,我们已经学会了如何在Nacos中创建配置,以及如何使用Spring Cloud Alibaba的Nacos客户端模块来加载配置。我们的例子完成采用了默认配置完成。接下来我们详细了解下Nacos配置的加载规则。

加载规则

在Nacos Spring Cloud 中, dataID的完成格式如下:

${prefix}-${spring.profile.active}.${file-extension}
  • prefix:默认为 spring.application.name的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  • spring.profile.active:即当前环境对应的profile,详情开业参考 Spring Boot文档

注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId的拼接格式变成:${prefix}.${file-extension}

  • file-extension: 为配置文件的数据格式,可以通过设置项spring.cloud.nacos.config.file-extension来配置,默认值:properties。目前只支持 properties 和 yaml 类型。

  • Group的值默认 DEFAULT_GROUP: 可以通过设置项 spring.cloud.nacos.config.group来配置,默认值: DEFAULT_GROUP

思考

上面,我们具体介绍了在Nacos中添加各种配置与SpringCloud应用中客户端配置的对应关系。对于spring.cloud.nacos.config.prefixspring.cloud.nacos.config.file-extension来说,基本没有太多的花样,大部分都是采用默认配置。

但是对于 spring.cloud.nacos.config.group 的配置来说,还是可以派生出一些作用,比如:用来区分不同的产品组下的各个应用的配置内容(解决多个应用名称冲突问题)或者用来区分不同用途的配置内容,再或者用来区分不同环境(dev、test、prod)的配置。
后面我们也会专门针对如何使用Group完成多环境配置进行专门讲解。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339