使用 Nacos 作为配置中心 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dyc87112
V2EX    Java

使用 Nacos 作为配置中心

  •  
  •   dyc87112
    dyc87112 2019-07-22 17:08:51 +08:00 3522 次点击
    这是一个创建于 2271 天前的主题,其中的信息可能已经有所发展或是发生改变。

    通过本教程的前两篇《使用 Nacos 实现服务注册与发现》《支持的几种服务消费方式( RestTemplate、WebClient、Feign )》,我们已经学会了,如何利用 Nacos 实现服务的注册与发现。同时,也介绍了在 Spring Cloud 中,我们可以使用的几种不同编码风格的服务消费方式。接下来,我们再来学习一下 Nacos 的另外一个重要能力:配置管理。

    简介

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

    • 分离的多环境配置,可以更灵活的管理权限,安全性更高
    • 应用程序的打包更为纯粹,以实现一次打包,多处运行的特点(《云原声应用的 12 要素》之一

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

    快速入门

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

    创建配置

    第一步:进入 Nacos 的控制页面,在配置列表功能页面中,点击右上角的“+”按钮,进入“新建配置”页面,如下图填写内容:

    img

    其中:

    • Data ID:填入alibaba-nacos-config-client.properties
    • Group:不修改,使用默认值DEFAULT_GROUP
    • 配置格式:选择Properties
    • 配置内容:应用要加载的配置内容,这里仅作为示例,做简单配置,比如:didispace.title=spring-cloud-alibaba-learning

    创建应用

    第一步:创建一个 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 的版本,由于 spring cloud alibaba 还未纳入 spring cloud 的主版本管理中,所以需要自己加入
    • dependencies:当前应用要使用的依赖内容。这里主要新加入了 Nacos 的配置客户端模块:spring-cloud-starter-alibaba-nacos-config。由于在dependencyManagement中已经引入了版本,所以这里就不用指定具体版本了。

    可以看到,这个例子中并没有加入 nacos 的服务发现模块,所以这两个内容是完全可以独立使用的

    第三步:创建应用主类,并实现一个 HTTP 接口:

    @SpringBootApplication public class TestApplication { public static void main(String[] args) { SpringApplication.run(TestApplication.class, args); } @Slf4j @RestController @RefreshScope static class TestController { @Value("${didispace.title:}") private String title; @GetMapping("/test") public String hello() { return title; } } } 

    内容非常简单,@SpringBootApplication定义是个 Spring Boot 应用;还定义了一个 Controller,其中通过@Value注解,注入了 key 为didispace.title的配置(默认为空字符串),这个配置会通过/test接口返回,后续我们会通过这个接口来验证 Nacos 中配置的加载。另外,这里还有一个比较重要的注解@RefreshScope,主要用来让这个类下的配置内容支持动态刷新,也就是当我们的应用启动之后,修改了 Nacos 中的配置内容之后,这里也会马上生效。

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

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

    注意:这里必须使用bootstrap.properties。同时,spring.application.name值必须与上一阶段 Nacos 中创建的配置 Data Id 匹配(除了.properties 或者.yaml 后缀)。

    第五步:启动上面创建的应用。

    2019-01-27 18:29:43.497 INFO 93597 --- [ main] o.s.c.a.n.c.NacosPropertySourceBuilder : Loading nacos data, dataId: 'alibaba-nacos-config-client.properties', group: 'DEFAULT_GROUP' 2019-01-27 18:29:43.498 INFO 93597 --- [ main] b.c.PropertySourceBootstrapConfiguration : Located property source: CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='alibaba-nacos-config-client.properties'}]} 

    在启动的时候,我们可以看到类似上面的日志信息,这里会输出应用程序要从 Nacos 中获取配置的 dataId 和 group。如果在启动之后,发现配置信息没有获取到的时候,可以先从这里着手,看看配置加载的目标是否正确。

    第六步:验证配置获取和验证动态刷新

    用 curl 或者 postman 等工具,访问接口: localhost:8001/test,一切正常的话,将返回 Nacos 中配置的spring-cloud-alibaba-learning。然后,再通过 Nacos 页面,修改这个内容,点击发布之后,再访问接口,可以看到返回结果变了。

    同时,在应用的客户端,我们还能看到如下日志:

    2019-01-27 18:39:14.162 INFO 93597 --- [-127.0.0.1_8848] o.s.c.e.event.RefreshEventListener : Refresh keys changed: [didispace.title] 

    在 Nacos 中修改了 Key,在用到这个配置的应用中,也自动刷新了这个配置信息。

    代码示例

    本文示例读者可以通过查看下面仓库的中的alibaba-nacos-config-client项目:

    如果您对这些感兴趣,欢迎 star、follow、收藏、转发给予支持!

    以下专题教程也许您会有兴趣

    1 条回复    2019-07-23 10:07:07 +08:00
    brust
        1
    brust  
       2019-07-23 10:07:07 +08:00
    翟永超?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5648 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 06:31 PVG 14:31 LAX 23:31 JFK 02:31
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86