微服务系列:nacos配置中心实战

本文涉及的产品
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 微服务系列:nacos配置中心实战

前言


上一篇文章对nacos的功能和安装部署做了些简单介绍,今天介绍下nacos作为配置中心,如何在spring cloud中使用。


一、官方文档


官方文档:https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html


二、nacos环境说明


安装的nacos版本为NACOS2.0.0-BETA

没有采用默认的public命名空间。

新建命名空间bank1,并新建用户nacos_bank1,新建角色bank1_admin,在权限管理界面中,给角色bank1_admin绑定bank1命名空间的读写权限。

15.png

16.png


三、作为配置中心使用


新建spring boot工程bank1,测试Nacos作为配置中心的使用。

通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更。


1.添加依赖:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>${latest.version}</version>
</dependency>


注意:版本 2.1.x.RELEASE 对应的是 Spring Boot 2.1.x 版本。版本 2.0.x.RELEASE 对应的是 Spring Boot 2.0.x 版本,版本 1.5.x.RELEASE 对应的是 Spring Boot 1.5.x 版本。


更多版本对应关系参考:版本说明 Wiki


spring-cloud-starter-alibaba-nacos-config和spring boot的版本对应关系,我更推荐直接通过maven仓库查看,更加直接明了。

maven仓库官网搜索spring-cloud-starter-alibaba-nacos-config。

这里我选择了下载次数最多的版本2.2.1.RELEASE。然后查看下面的依赖。

14.png

spring-cloud-starter-alibaba-nacos-config 2.2.1.RELEASE的版本依赖。

13.png

所以spring-boot-starter-parent版本,我选择了2.2.5.RELEASE。

完整的依赖为:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.laowan</groupId>
    <artifactId>spring-cloud</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>bank1</name>
    <description>实战spring cloud</description>
    <properties>
        <java.version>1.8</java.version>
        <skipTests>true</skipTests>
    </properties>
    <dependencies>
        <!--nacos配置中心-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>


注意:这里的版本依赖关系非常重要,不然项目启动会直接出现jar包冲突的异常,导致启动失败。


2、bootstrap.properties配置

在 bootstrap.properties 中配置 Nacos server 的地址和应用名

spring.application.name=bank1
server.port=8010
spring.profiles.active=dev
spring.cloud.nacos.username=nacos_bank1
spring.cloud.nacos.password=123456
spring.cloud.nacos.config.server-addr=localhost:8848
spring.cloud.nacos.config.namespace=a284481e-b623-4c7d-a65a-e9009cba5f57


说明:之所以需要配置 spring.application.name ,是因为它是构成 Nacos 配置管理 dataId字段的一部分。

这里的spring.cloud.nacos.config.namespace指定的属性就是对应Nacos 配置管理 中的命名空间bank1的id值:a284481e-b623-4c7d-a65a-e9009cba5f57。


注意:

这里一定要在bootstrap.properties中配置配置中心的相关属性,而不能直接在application.properties中配置。原因是bootstrap.properties会在application.properties之前加载。具体bootstrap和application的区别自己可以网上找资料查看下。


这里用户命和密码需要配置在bootstrap.properties中才能生效,如果配置在application.properties中,启动时读取不到对应的属性。

这样因为这里的认证类SecurityProxy中读取的属性是BootstrapPropertySource 。根据名称就知道,这里加载的是Bootstrap中的属性。

spring.cloud.nacos.username
spring.cloud.nacos.password


11.png

12.png


3、在命名空间bank1下添加配置文件

在 Nacos Spring Cloud 中,dataId 的完整格式如下:

${prefix}-${spring.profiles.active}.${file-extension}


说明:

1、prefix 默认为 spring.application.name 的值,也可以通过配置项spring.cloud.nacos.config.prefix来配置。

2、spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 p r e f i x . {prefix}.prefix.{file-extension}

3、file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。


选择bank1命名空间,点击加号➕

10.png


新建配置文件:

其中Data ID为bank1-dev.properties 需要注意Data ID的命名规则。

Group一般都是采用默认值。

配置格式采用Properties。个人习惯,不是太喜欢使用YAML,格式比较难调整,格式错误难发现,属性搜索也不是很方便。

配置内容:bank.name=bank1 dev

9.png


4、通过@Value使用属性

@RestController
@RequestMapping("/config")
public class ConfigController {
    @Value("${bank.name}")
    private String bankName;
    @RequestMapping("/get")
    public String get() {
        return bankName;
    }
}


5、添加@RefreshScope注解

@Slf4j
@SpringBootApplication
@RefreshScope
public class Bank1Application {
  public static void main(String[] args) {
  SpringApplication.run(Bank1Application.class, args);
  log.info("bank1服务启动成功");
  }
}


四、效果测试


1、项目启动

2021-03-19 17:31:29.285  INFO 45872 --- [           main] b.c.PropertySourceBootstrapConfiguration : Located property source: [BootstrapPropertySource {name='bootstrapProperties-bank1-dev.properties,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-bank1.properties,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-bank1,DEFAULT_GROUP'}]
2021-03-19 17:31:29.305  INFO 45872 --- [           main] com.laowan.bank1.Bank1Application        : The following profiles are active: dev


8.png

在启动日志中发现,同时加载了bootstrapProperties-bank1-dev.properties和bootstrapProperties-bank1.properties的文件。


注意:

bank1.properties会先于bank1-dev.properties被程序加载,后加载的属性会覆盖先加载的属性。所以2个文件中如果有相同的属性,最终bank1-dev.properties中的才会生效。

利用这个特性,我们一般会存放一些通用的公共属性放在bank1.properties文件中。


示例:

7.png

bank1.properties 公共属性

bank1-dev.properties 开发环境属性

bank1-test.properties 测试环境属性

bank1-pro.properties 生产环境属性


2、获取配置

请求链接:http://localhost:8010/config/get

6.png

成功获取到配置。


3、刷新配置

在nacos中修改配置:

5.png


五、思考


1、多环境如何共用一个nacos服务?


相同命名空间:

简单的使用,只需在相同命名空间下利用Data ID中的spring.profiles.active属性来区分即可。

缺点主要是访问权限不能放开控制。多个环境的文件在同一个命名空间,容易出现误操作。


不同命名空间:

可以如下,分别建立名称为dev,test,pro的命名空间。这种情况下,可以忽略spring.profiles.active属性的作用,利用命名空间来区分不同的属性环境。

4.png

项目中bootstrap.properties的配置文件对应关系:

公共属性配置:

3.png

dev属性配置:

2.png

bootstrap-dev.properties的配置说明:

spring.cloud.nacos.username=nacos-dev(dev环境对应的用户)
spring.cloud.nacos.password=123456
spring.cloud.nacos.config.server-addr=localhost:8848(dev对应访问地址)
spring.cloud.nacos.config.namespace=dev对应命名空间id


2、多环境下怎么独立使用各自的nacos服务?

实际项目中,开发环境,测试环境,生产环境一般都有比较严格的网络隔离和访问权限控制,同时为了避免属性误操作,不可能共用同一个nacos服务。

可以参考上面不同命名空间的处理:

1.png

3、nacos的命名空间是以项目为纬度,还是以开发环境、测试环境等环境为纬度控制好?

由于考虑到真实环境下,开发环境,生产环境等不同配置环境一般不会使用同一套nacos服务,往往都是各自独立部署。

所以同一个项目,利用命名空间来分环境控制配置属性这样的使用场景非常有限,意义不是很大。所以建议命名空间以项目为纬度就可以了。


总结


本文主要介绍了Nacos作为配置中心在Spring boot项目中的使用。

主要需要注意一下几点:

1、spring-cloud-starter-alibaba-nacos-config和Spring boot的版本依赖关系。如果版本对应出错,会出现依赖冲突问题。

2、注意在Nacos控制台添加配置时,Data ID的命名规则:p r e f i x − {prefix}-prefix−{spring.profiles.active}.${file-extension}

3、Nacos的权限管理的粒度是命名空间级别。一定要注意配置的用户具有对应命名空间的读写权限。

4、在拓展思考中,说明了多环境下Nacos作为配置中心的使用方式。

目录
相关文章
|
23天前
|
存储 网络协议 Nacos
高效搭建Nacos:实现微服务的服务注册与配置中心
Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的一款动态服务发现、配置管理和服务管理平台。它旨在帮助开发者更轻松地构建、部署和管理分布式系统,特别是在微服务架构中。
263 81
高效搭建Nacos:实现微服务的服务注册与配置中心
|
2月前
|
监控 网络协议 Nacos
Nacos:构建微服务架构的基石
Nacos:构建微服务架构的基石
142 2
|
1月前
|
JSON Java Nacos
SpringCloud 应用 Nacos 配置中心注解
在 Spring Cloud 应用中可以非常低成本地集成 Nacos 实现配置动态刷新,在应用程序代码中通过 Spring 官方的注解 @Value 和 @ConfigurationProperties,引用 Spring enviroment 上下文中的属性值,这种用法的最大优点是无代码层面侵入性,但也存在诸多限制,为了解决问题,提升应用接入 Nacos 配置中心的易用性,Spring Cloud Alibaba 发布一套全新的 Nacos 配置中心的注解。
208 12
|
2月前
|
监控 Java 测试技术
Nacos 配置中心变更利器:自定义标签灰度
本文是对 MSE Nacos 应用自定义标签灰度的功能介绍,欢迎大家升级版本进行试用。
202 13
|
2月前
|
Java 网络安全 Nacos
Nacos作为流行的微服务注册与配置中心,其稳定性与易用性广受好评
Nacos作为流行的微服务注册与配置中心,其稳定性与易用性广受好评。然而,“客户端不发送心跳检测”是使用中常见的问题之一。本文详细探讨了该问题的原因及解决方法,包括检查客户端配置、网络连接、日志、版本兼容性、心跳检测策略、服务实例注册状态、重启应用及环境变量等步骤,旨在帮助开发者快速定位并解决问题,确保服务正常运行。
60 5
|
1月前
|
存储 监控 供应链
微服务拆分的 “坑”:实战复盘与避坑指南
本文回顾了从2~3人初创团队到百人技术团队的成长历程,重点讨论了从传统JSP到前后端分离+SpringCloud微服务架构的演变。通过实际案例,总结了微服务拆分过程中常见的两个问题:服务拆分边界不清晰和拆分粒度过细,并提出了优化方案,将11个微服务优化为6个,提高了系统的可维护性和扩展性。
52 0
|
2月前
|
Dubbo Cloud Native 应用服务中间件
阿里云的 Dubbo 和 Nacos 深度整合,提供了高效的服务注册与发现、配置管理等关键功能,简化了微服务治理,提升了系统的灵活性和可靠性。
在云原生时代,微服务架构成为主流。阿里云的 Dubbo 和 Nacos 深度整合,提供了高效的服务注册与发现、配置管理等关键功能,简化了微服务治理,提升了系统的灵活性和可靠性。示例代码展示了如何在项目中实现两者的整合,通过 Nacos 动态调整服务状态和配置,适应多变的业务需求。
77 2
|
2月前
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
167 6
|
2月前
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
64 1
|
1月前
|
Java 开发者 微服务
从单体到微服务:如何借助 Spring Cloud 实现架构转型
**Spring Cloud** 是一套基于 Spring 框架的**微服务架构解决方案**,它提供了一系列的工具和组件,帮助开发者快速构建分布式系统,尤其是微服务架构。
212 69
从单体到微服务:如何借助 Spring Cloud 实现架构转型