Spring Cloud Alibaba系列(二)nacos作为服务配置中心

简介:

Spring Cloud Alibaba系列(二)nacos作为服务配置中心

Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos Config,您可以在 Nacos Server 集中管理你 Spring Cloud 应用的外部属性配置。

首先我们来看一下,微服务架构下关于配置文件的一些问题:

配置文件相对分散,在一个微服务架构中,配置文件会随着微服务的增多变得越来越多,而且分散在各个微服务中,不好统一管理和配置。
配置文件无法区分环境,微服务项目可能会有多个环境,例如:开发环境、预发布环境、生成环境。每个环境所使用的配置理论上都是不同的,一旦需要修改,就需要我们去各个微服务下手动维护,这比较困难。
配置文件无法实时更新,我们修改好了配置文件之后,必须重新启动微服务才能使配置文件生效,这对一个正在运行的项目来说是非常不友好的。
基于上面这些问题,我们就需要引入配置中心来解决。

创建一个config服务
新建一个config服务,在pom文件中添加必要依赖

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


<dependencies>
  <!--Spring cloud Hoxton.SR3-->
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>Hoxton.SR3</version>
    <type>pom</type>
    <scope>import</scope>
  </dependency>
  <!--Spring cloud alibaba 2.1.0.RELEASE-->
  <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.2.1.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
  </dependency>
</dependencies>


<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>


在配置文件指定config地址等信息
注意:不能使用原来的application.yml作为配置文件,而是新建一个bootstrap.yml作为配置文件
配置文件加载的优先级(由高到低)

bootstrap.properties ->bootstrap.yml -> application.properties -> application.yml

server:
port: 9002
spring:
profiles:

active: dev

application:

name: nacos-config-server

cloud:

nacos:
  config:
    server-addr: 127.0.0.1:8848 # 配置中心
    file-extension: yaml # 这里指定的文件格式需要和nacos上新建的配置文件后缀相同,否则读不到

在nacos客户端配置管理新建一个配置

Data ID:默认为 ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension} 或 ${spring.application.name}.${spring.cloud.nacos.config.file-extension}
Group:对应配置文件中的${spring.cloud.nacos.config.group},默认为DEFAULT_GROUP
配置格式:对应配置文件中的${spring.cloud.nacos.config.file-extension},
配置内容:根据你的配置格式按对应的格式填写即可。
在config服务中获取配置信息
@SpringBootApplication
public class NacosConfigServerApplication {

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

    @Value("${config.info}")
    private String config;

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

}

}
我们通过@Value注解可以获取到配置中心的值。

@RefreshScope动态刷新配置
在TestController上加个@RefreshScope注解,然后我们去nacos客户端手动修改config.info的信息,然后重新调用这个/test接口,会发现响应的是修改后的内容。

配置自定义的命名空间
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

在没有明确指定命名空间配置的情况下, 默认使用的是 Nacos 上 Public 这个namespae。

首先我们在nacos客户端新建一个命名空间,

然后我们在配置文件中新增下面这个属性,具体的值填写我们新增命名空间的ID,这样启动config服务后,就会自动去这个命名空间下寻找对应的配置文件了。

spring:
cloud:

nacos:
  config:
    namespace: 

多环境配置的三种方式
最开始的时候我们也说过微服务项目会有多个环境,我们如何实现和管理这些环境呢?

1.通过Data ID 和profiles实现
我们可以在配置文件中指定spring.profiles.active = **,然后在nocas客户端新建对应的${spring.cloud.nacos.config.prefix}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}配置来区分不同的环境。

2.通过Group实现
我们可以为不同的环境新建不同的分组,然后的配置文件中指定spring.cloud.nacos.config.group=组名,这样也可以实现不同环境的区分。

3.通过Namespace实现
这种方式是官方建议的方式,在nacos客户端中新建不同的分组,然后再配置文件中指定namespace就可以区分不同的环境了。

自定义扩展的Data ID
大多数时候我们可能更加倾向于将不同的配置分开写到不同的配置文件中,比如我想把文件类和日志类的配置拆分开写到两个配置中,nacos也是支持这种写法的。

我们在nacos中新建两个Data ID 分别是log.yaml 和 file.yaml 的文件。
我们在配置文件中分别加入以下内容:log:level: 2,file:url: "http://123.com"。

如何配置呢
spring:
cloud:

nacos:
  config:
    extension-configs[0]:
      data-id: log.yaml
      group: DEFAULT_GROUP   # 默认为DEFAULT_GROUP
      refresh: true   # 是否动态刷新,默认为false
    extension-configs[1]:
      data-id: file.yaml
      group: DEFAULT_GROUP
      refresh: true

为了更加清晰的在多个应用间配置共享的 Data Id,官方推荐使用如下配置:

spring:
cloud:

nacos:
  config:
    shared-configs[0]:
      data-id: log.yaml
      group: DEFAULT_GROUP   # 默认为DEFAULT_GROUP
      refresh: true   # 是否动态刷新,默认为false
    shared-configs[1]:
      data-id: file.yaml
      group: DEFAULT_GROUP
      refresh: true

深入思考,既然我们有两个配置文件,假如两个配置文件中出现一样的key值,这样我们程序中会加载哪个配置呢,其实nacos在设计的时候也考虑到了优先级问题,下面我们一起来看看。
我们将file.yaml中的配置改成log:level: 22。这时候我们加载写个接口取一下配置。看看它取到的是哪个文件的内容。

RestController
@RefreshScope
class TestController {
    
    @Value("${log.level}")
    private String log;

    @GetMapping("/test")
    public String hello() {
        return "log.lelve="+log;
    }

}

结果取到的是file.yaml中的配置,这是因为多个 Data Id 同时配置时,他的优先级关系是 spring.cloud.nacos.config.extension-configs[n].data-id 其中 n 的值越大,优先级越高。

注意:spring.cloud.nacos.config.extension-configs[n].data-id 的值必须带文件扩展名,文件扩展名既可支持 properties,又可以支持 yaml/yml。 此时 spring.cloud.nacos.config.file-extension 的配置对自定义扩展配置的 Data Id 文件扩展名没有影响。

扩展:不同方式配置加载优先级
Spring Cloud Alibaba Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置。

A: 通过 spring.cloud.nacos.config.shared-configs[n].data-id 支持多个共享 Data Id 的配置
B: 通过 spring.cloud.nacos.config.extension-configs[n].data-id 的方式支持多个扩展 Data Id 的配置
C: 通过内部相关规则(spring.cloud.nacos.config.prefix、spring.cloud.nacos.config.file-extension、spring.cloud.nacos.config.group)自动生成相关的 Data Id 配置
当三种方式共同使用时,他们的一个优先级关系是:A < B < C

代码示例
github:https://github.com/binzh303/spring-cloud-alibaba-learning
gitee:https://gitee.com/zhixie/spring-cloud-alibaba-learning
原文地址https://www.cnblogs.com/zhixie/p/12854737.html

相关文章
|
3天前
|
人工智能 安全 Java
AI 时代:从 Spring Cloud Alibaba 到 Spring AI Alibaba
本次分享由阿里云智能集团云原生微服务技术负责人李艳林主讲,主题为“AI时代:从Spring Cloud Alibaba到Spring AI Alibaba”。内容涵盖应用架构演进、AI agent框架发展趋势及Spring AI Alibaba的重磅发布。分享介绍了AI原生架构与传统架构的融合,强调了API优先、事件驱动和AI运维的重要性。同时,详细解析了Spring AI Alibaba的三层抽象设计,包括模型支持、工作流智能体编排及生产可用性构建能力,确保安全合规、高效部署与可观测性。最后,结合实际案例展示了如何利用私域数据优化AI应用,提升业务价值。
|
27天前
|
存储 SpringCloudAlibaba Java
【SpringCloud Alibaba系列】一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论
一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论。
【SpringCloud Alibaba系列】一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论
|
14天前
|
人工智能 自然语言处理 Java
Spring Cloud Alibaba AI 入门与实践
本文将介绍 Spring Cloud Alibaba AI 的基本概念、主要特性和功能,并演示如何完成一个在线聊天和在线画图的 AI 应用。
189 7
|
23天前
|
存储 网络协议 Nacos
高效搭建Nacos:实现微服务的服务注册与配置中心
Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的一款动态服务发现、配置管理和服务管理平台。它旨在帮助开发者更轻松地构建、部署和管理分布式系统,特别是在微服务架构中。
260 81
高效搭建Nacos:实现微服务的服务注册与配置中心
|
1月前
|
JSON Java Nacos
SpringCloud 应用 Nacos 配置中心注解
在 Spring Cloud 应用中可以非常低成本地集成 Nacos 实现配置动态刷新,在应用程序代码中通过 Spring 官方的注解 @Value 和 @ConfigurationProperties,引用 Spring enviroment 上下文中的属性值,这种用法的最大优点是无代码层面侵入性,但也存在诸多限制,为了解决问题,提升应用接入 Nacos 配置中心的易用性,Spring Cloud Alibaba 发布一套全新的 Nacos 配置中心的注解。
208 12
|
2月前
|
负载均衡 应用服务中间件 Nacos
Nacos配置中心
Nacos配置中心
154 1
Nacos配置中心
|
2月前
|
监控 Java 测试技术
Nacos 配置中心变更利器:自定义标签灰度
本文是对 MSE Nacos 应用自定义标签灰度的功能介绍,欢迎大家升级版本进行试用。
202 13
|
2月前
|
Java 网络安全 Nacos
Nacos作为流行的微服务注册与配置中心,其稳定性与易用性广受好评
Nacos作为流行的微服务注册与配置中心,其稳定性与易用性广受好评。然而,“客户端不发送心跳检测”是使用中常见的问题之一。本文详细探讨了该问题的原因及解决方法,包括检查客户端配置、网络连接、日志、版本兼容性、心跳检测策略、服务实例注册状态、重启应用及环境变量等步骤,旨在帮助开发者快速定位并解决问题,确保服务正常运行。
60 5
|
2月前
|
网络安全 Nacos 开发者
Nacos作为流行的微服务注册与配置中心,“节点提示暂时不可用”是常见的问题之一
Nacos作为流行的微服务注册与配置中心,其稳定性和易用性备受青睐。然而,“节点提示暂时不可用”是常见的问题之一。本文将探讨该问题的原因及解决方案,帮助开发者快速定位并解决问题,确保服务的正常运行。通过检查服务实例状态、网络连接、Nacos配置、调整健康检查策略等步骤,可以有效解决这一问题。
47 4
|
2月前
|
Java 网络安全 Nacos
Nacos作为流行的微服务注册与配置中心,其稳定性和易用性备受青睐。
Nacos作为流行的微服务注册与配置中心,其稳定性和易用性备受青睐。然而,实际使用中常遇到“客户端不发送心跳检测”的问题。本文深入探讨该问题的原因及解决方案,帮助开发者快速定位并解决问题,确保服务正常运行。通过检查客户端配置、网络连接、日志、版本兼容性、心跳策略、注册状态、重启应用和环境变量等步骤,系统地排查和解决这一问题。
62 3