03.Nacos配置中心

1.概述

在《SpringCloud极简入门》中我们通过Spring Cloud Config作为统一配置文件管理中心,其实我们总结一下发现Spring Cloud Config使用起来总归比较麻烦。Nacos作为Spring Cloud Alibaba的一个重要组件,它不仅可以用作服务注册与发现,也可以用来替代Spring Cloud Config作为统一配置文件管理,而且他的使用更为简单和人性化。

2.Nacos添加配置

打开Nacos监控面板 - 进入配置列表 -点击 “+” 图标添加配置 如下:

在这里插入图片描述
填写Data ID,选择YAML,编辑配置文件内容:
在这里插入图片描述
这里定义了一个名字为application-user-dev.yaml的配置,使用的是YAML格式。
Data ID : 非常重要,可以看做是配置的文件的名字,在程序中拉取配置文件的时候需要指定Data ID。
Group : 分组,默认是 DEFAULT_GROUP , 可以针对不同的项目指定不同的配置组。

3.客户端接入配置中心

3.1.导入依赖 pom.xml配置文件夹中加入配置中心依赖nacos-config;

    <!-- nacos配置中心客户端-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>

3.2.修改yml配置 ,将原来的配置文件application.yml修改成bootstrap.yml


注意,将原来的配置文件application.yml修改成bootstrap.yml,
application.propreties, application.yml,bootstrap.yml都是springboot的配置文件,优先级bootstrap.yml最高,启动时加载bootstrap.yml;
因为要获取nacos服务器的配置,所以使用bootstrap.yml配置;如果使用application.yml则报如下错误


2022-06-20 16:27:26.421 ERROR 11720 — [ restartedMain] c.a.cloud.nacos.NacosConfigProperties : create config service error!properties=NacosConfigProperties{serverAddr=‘null’, encode=‘null’, group=‘DEFAULT_GROUP’, prefix=‘null’, fileExtension=‘properties’, timeout=3000, endpoint=‘null’, namespace=‘null’, accessKey=‘null’, secretKey=‘null’, contextPath=‘null’, clusterName=‘null’, name=‘null’, sharedDataids=‘null’, refreshableDataids=‘null’, extConfig=null},e=,
com.alibaba.nacos.api.exception.NacosException: java.lang.reflect.InvocationTargetException
at com.alibaba.nacos.api.config.ConfigFactory.createConfigService(ConfigFactory.java:45) ~[nacos-api-1.1.1.jar:na]
at com.alibaba.nacos.api.NacosFactory.createConfigService(NacosFactory.java:43) ~[nacos-api-1.1.1.jar:na]
at com.alibaba.cloud.nacos.NacosConfigProperties.configServiceInstance(NacosConfigProperties.java:346) ~[spring-cloud-alibaba-nacos-config-2.1.0.RELEASE.jar:2.1.0.RELEASE]
at com.alibaba.cloud.nacos.client.NacosPropertySourceLocator.locate(NacosPropertySourceLocator.java:63) [spring-cloud-alibaba-nacos-config-2.1.0.RELEASE.jar:2.1.0.RELEASE]
at org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration.initialize(PropertySourceBootstrapConfiguration.java:97) [spring-cloud-context-2.1.2.RELEASE.jar:2.1.2.RELEASE]
at org.springframework.boot.SpringApplication.applyInitializers(SpringApplication.java:623) [spring-boot-2.1.13.RELEASE.jar:2.1.13.RELEASE]
at org.springframework.boot.SpringApplication.prepareContext(SpringApplication.java:367) [spring-boot-2.1.13.RELEASE.jar:2.1.13.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:311) [spring-boot-2.1.13.RELEASE.jar:2.1.13.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) [spring-boot-2.1.13.RELEASE.jar:2.1.13.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1204) [spring-boot-2.1.13.RELEASE.jar:2.1.13.RELEASE]
at com.itsource.UserServerApplication1010.main(UserServerApplication1010.java:21) [classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_333]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_333]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_333]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_333]
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) [spring-boot-devtools-2.1.13.RELEASE.jar:2.1.13.RELEASE]
Caused by: java.lang.reflect.InvocationTargetException: null
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_333]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_333]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_333]
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_333]
at com.alibaba.nacos.api.config.ConfigFactory.createConfigService(ConfigFactory.java:42) ~[nacos-api-1.1.1.jar:na]
… 15 common frames omitted
Caused by: com.alibaba.nacos.api.exception.NacosException: endpoint is blank
at com.alibaba.nacos.client.config.impl.ServerListManager.(ServerListManager.java:154) ~[nacos-client-1.1.1.jar:na]
at com.alibaba.nacos.client.config.http.ServerHttpAgent.(ServerHttpAgent.java:244) ~[nacos-client-1.1.1.jar:na]
at com.alibaba.nacos.client.config.NacosConfigService.(NacosConfigService.java:83) ~[nacos-client-1.1.1.jar:na]
… 20 common frames omitted

spring:
  profiles:
    active: dev
  application:
    name: user-server
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #注册中心
      config:
        server-addr: localhost:8848 #配置中心
        file-extension: yaml #配置文件格式
        prefix: application-user #配置前缀,默认使用sring.application.name
        group: DEFAULT_GROUP #默认分组
#如何查找配置文件:  application-user + dev + yaml = application-user-dev.yaml 正好和Nacos配置的DataId一致
提示:客户端是如何从Nacos中找到配置文件的呢?
spring.cloud.nacos.config.server-addr :配置了Nacos的地址
spring.cloud.nacos.config.file-extension:指定了配置文件的格式为YAML,默认是properties,
spring.cloud.nacos.config.prefix:配置前缀,如果不配置前缀默认会把 服务名即spring.application.name的值作为前缀
spring.cloud.nacos.config.group :分组名,默认是DEFAULT_GROUP对应了Nacos配置中的Group
spring.profiles.active:配置了环境为dev .该配置可以实现多配置多环境管理
根据如上配置,那么config客户端会将:前缀+环境+后缀 拼接成的文件名“application-user-dev.yaml” 去Nacos上查找是否有对应Data ID的配置文件。

3.3.编写Controller

下面的Controller用来做配置刷新测试, temp.notify对应了配置文件中的配置项目。
@RefreshScope注解是用来做配置自动刷新。 那么当我们修改了Nacos中的配置文件,
Controller中读取到的配置temp.notify将会自动变化。

@RefreshScope  //刷新配置
@RestController
public class UserController {

    @Value("${temp.notify}")
    private String notify;

    @GetMapping("/user/{id}")
    public User getById(@PathVariable Long id){
        System.out.println("测试配置notify="notify);
        return new User(id,"zs:"+id, "我是zs");
    }
}

3.4.测试

启动Nacos,启动 springcloudalibaba-user-server-1010 工程 , 修改Nacos中的配置文件内容,
然后访问 http://localhost:1010/user/11 ,观察控制台打印的 “notify”的值会发生变化。

3.5.注意细节

云端配置文件的后缀应该是 yaml而不是yml
客户端配置需要指定:spring.profiles.active=dev 环境名
客户端配置 :前缀 + 环境名 + 后缀应该和云端配置文件的DataId一致

4.命名空间

命名空间可以用来隔离不同项目的配置文件,在Nacos中配置了命名空间后,那么Java客户端需要指定命名空间后才能拉取到该命名空间下的配置文件。

4.1.创建命名空间

修改Nacos,添加命名空间如下:nacos控制面板 服务管理>命名空间 添加 命名空间
这里建立了一个名字为“test”的命名空间,点击确定,然后你需要关注一下命名空间的ID,这个是需要在Java客户端进行配置的。如下:

4.2.在命名空间创建配置

进入配置列表 ,切换到新建立的命名空间“test”,然后创建配置 application-user-dev.yaml。
这里的配置文件名也叫 application-user-dev.yaml,但是他是属于 “test”这个命名空间的 ,
我们之前在 默认的“public”命名空间中也有一个同名的配置。

4.3.客户端配置 yml配置文件配置命名空间

这里需要指定一下从哪个命名空间拉取配置:

spring:
  profiles:
    active: dev
  application:
    name: user-server
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #注册中心
      config:
        server-addr: localhost:8848 #配置中心
        file-extension: yaml #配置文件格式
        prefix: application-user #配置前缀,默认使用sring.application.name
        group: DEFAULT_GROUP #默认分组
        namespace: 9be3df9d-b40f-4d5b-a826-906f4523adc5 #命名空间的ID

注意:这里的namespace对应了 Nacos中“test”这个命名空间的ID,意思是从“test”这个命名空间去找 application-user-dev.yaml的配置文件。

4.4.启动测试

启动Nacos,启动 springcloudalibaba-user-server-1010 工程 , 修改Nacos中的配置文件内容,
然后访问 http://localhost:1010/user/11 ,观察控制台打印的 “notify”的值为

5.小结

4.4.启动测试
启动Nacos,启动 springcloudalibaba-user-server-1010 工程 , 修改Nacos中的配置文件内容,
然后访问 http://localhost:1010/user/11 ,观察控制台打印的 “notify”的值为

5.小结

这里根据几个简单的步骤就实现了配置文件的管理,相比Spring Cloud Config而言简单太多了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值