Spring Cloud 阿里巴巴 Nacos 配置

Spring Cloud 阿里巴巴 Nacos 配置

Nacos 是一个易于使用的动态服务发现、配置和服务管理平台,用于构建云原生应用程序。

使用 Spring Cloud Alibaba Nacos Config 基于 Spring Cloud 的编程模型快速接入 Nacos 配置管理能力。

如何引入 Nacos Config 进行配置

请使用组 ID 为com.alibaba.cloud和工件 ID 为的启动器spring-cloud-starter-alibaba-nacos-config

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

快速开始

Nacos Config 使用 DataId 和 GROUP 来确定配置。

下图是DataId使用myDataid,GROUP使用DEFAULT_GROUP,配置了一个Properties格式的配置项:

TB1N2nxbRr0gK0jSZFnXXbRRXXa 2448 1194

图 2. Nacos 配置项

初始化 Nacos 服务器

具体的启动方式可以参考Spring Cloud Alibaba Nacos Discovery部分的“Nacos服务器启动”部分。

Nacos Server启动后,添加如何配置:

Data ID:    nacos-config.properties

Group  :    DEFAULT_GROUP

Configuration format:    Properties

Configuration content:   user.name=nacos-config-properties
            user.age=90
客户端上的使用

如果您想使用 Nacos 来管理您的应用程序的外部化配置,请使用组 ID 为 ascom.alibaba.cloud和工件 ID 为的 starter spring-cloud-starter-alibaba-nacos-config

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

现在我们可以创建一个标准的 Spring Boot 应用程序。

@SpringBootApplication
public class NacosConfigApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(NacosConfigApplication.class, args);
        String userName = applicationContext.getEnvironment().getProperty("user.name");
        String userAge = applicationContext.getEnvironment().getProperty("user.age");
        System.err.println("user name :" +userName+"; age: "+userAge);
    }
}

在运行这个例子之前,我们需要在 bootstrap.properties 中配置 Nacos 服务器的地址。例如:

引导程序属性

# DataId By default, the `spring.application.name` configuration is combined with the file extension (the configuration format uses properties by default), and the GROUP is not configured to use DEFAULT_GROUP by default. Therefore, the Nacos Config configuration corresponding to the configuration file has a DataId of nacos-config.properties and a GROUP of DEFAULT_GROUP
spring.application.name=nacos-config
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

如果使用域名访问 Nacos,格式spring.cloud.nacos.config.server-addr应为Domain name:port. 例如,如果 Nacos 域名是 abc.com.nacos,listerner 端口是 80,那么配置应该是spring.cloud.nacos.config.server-addr=abc.com.nacos:80. 80 端口不能省略。

运行此示例,您可以看到以下输出:

2018-11-02 14:24:51.638  INFO 32700 --- [main] c.a.demo.provider.NacosConfigApplication    : Started NacosConfigApplication in 14.645 seconds (JVM running for 15.139)
user name :nacos-config-properties; age: 90
2018-11-02 14:24:51.688  INFO 32700 --- [-127.0.0.1:8848] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@a8c5e74: startup date [Fri Nov 02 14:24:51 CST 2018]; root of context hierarchy

使用 YAML 格式的 DataId 添加配置

Nacos Config 也支持 yaml 格式。您只需完成以下 2 个步骤。

1、在bootstrap.properties文件中添加如下行声明DataId的格式为yaml。如下:

引导程序属性

spring.cloud.nacos.config.file-extension=yaml

2、在Nacos控制台添加DataId为yaml格式的配置,如下图:

Data ID:        nacos-config.yaml

Group  :        DEFAULT_GROUP

Configuration format:        YAML

Configuration content:        user.name: nacos-config-yaml
                              user.age: 68

完成前两步后,重新启动测试程序,您将看到如下结果。

2018-11-02 14:59:00.484  INFO 32928 --- [main] c.a.demo.provider.NacosConfigApplication:Started NacosConfigApplication in 14.183 seconds (JVM running for 14.671)
user name :nacos-config-yaml; age: 68
2018-11-02 14:59:00.529  INFO 32928 --- [-127.0.0.1:8848] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@265a478e: startup date [Fri Nov 02 14:59:00 CST 2018]; root of context hierarchy

支持动态配置更新

Nacos Config 还支持动态配置更新。启动Spring Boot应用测试的代码如下:

@SpringBootApplication
public class NacosConfigApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(NacosConfigApplication.class, args);
        while(true) {
            //When configurations are refreshed dynamically, they will be updated in the Enviroment, therefore here we retrieve configurations from Environment every other second.
            String userName = applicationContext.getEnvironment().getProperty("user.name");
            String userAge = applicationContext.getEnvironment().getProperty("user.age");
            System.err.println("user name :" + userName + "; age: " + userAge);
            TimeUnit.SECONDS.sleep(1);
        }
    }
}

当 user.name 改变时,可以从应用程序中检索到最新的值,如下所示:

user name :nacos-config-yaml; age: 68
user name :nacos-config-yaml; age: 68
user name :nacos-config-yaml; age: 68
2018-11-02 15:04:25.069  INFO 32957 --- [-127.0.0.1:8848] o.s.boot.SpringApplication               : Started application in 0.144 seconds (JVM running for 71.752)
2018-11-02 15:04:25.070  INFO 32957 --- [-127.0.0.1:8848] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@10c89124: startup date [Fri Nov 02 15:04:25 CST 2018]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@6520af7
2018-11-02 15:04:25.071  INFO 32957 --- [-127.0.0.1:8848] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@6520af7: startup date [Fri Nov 02 15:04:24 CST 2018]; root of context hierarchy
//Read the updated value from Enviroment
user name :nacos-config-yaml-update; age: 68
user name :nacos-config-yaml-update; age: 68

您可以使用此设置spring.cloud.nacos.config.refresh.enabled=false禁用自动刷新。

支持profile级别的配置

当 Nacos Config 加载配置时,也会加载DataId 为${spring.application.name}. ${file-extension:properties}、 DataId 为 的基本配置${spring.application.name}-${profile}. ${file-extension:properties}。如果需要使用来自不同环境的不同配置,可以使用${spring.profiles.active}Spring 提供的配置。

spring.profiles.active=develop

在配置文件中指定时,${spring.profiles.active} 必须放在 bootstrap.properties 中。

在Nacos中添加一个基础配置,DataId为nacos-config-develop.yaml,如下图:

Data ID:        nacos-config-develop.yaml

Group  :        DEFAULT_GROUP

Configuration format:        YAML

Configuration content:        current.env: develop-env

运行以下 Spring Boot 应用程序测试代码:

@SpringBootApplication
public class NacosConfigApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(NacosConfigApplication.class, args);
        while(true) {
            String userName = applicationContext.getEnvironment().getProperty("user.name");
            String userAge = applicationContext.getEnvironment().getProperty("user.age");
            //Get the current deployment environment
            String currentEnv = applicationContext.getEnvironment().getProperty("current.env");
            System.err.println("in "+currentEnv+" enviroment; "+"user name :" + userName + "; age: " + userAge);
            TimeUnit.SECONDS.sleep(1);
        }
    }
}

启动后,可以在控制台看到如下输出:

in develop-env enviroment; user name :nacos-config-yaml-update; age: 68
2018-11-02 15:34:25.013  INFO 33014 --- [ Thread-11] ConfigServletWebServerApplicationContext : Closing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@6f1c29b7: startup date [Fri Nov 02 15:33:57 CST 2018]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@63355449

要切换到生产环境,只需要更改${spring.profiles.active}. 如下图所示:

spring.profiles.active=product

同时,在你的生产环境的 Nacos 中添加带有 DataId 的基本配置。例如,您可以在生产环境的 Nacos 中添加 DataId 为 nacos-config-product.yaml 的配置:

Data ID:        nacos-config-product.yaml

Group  :        DEFAULT_GROUP

Configuration format:        YAML

Configuration content:        current.env: product-env

启动测试程序,您将看到以下结果:

in product-env enviroment; user name :nacos-config-yaml-update; age: 68
2018-11-02 15:42:14.628  INFO 33024 --- [Thread-11] ConfigServletWebServerApplicationContext : Closing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@6aa8e115: startup date [Fri Nov 02 15:42:03 CST 2018]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@19bb07ed

在本例中,我们使用spring.profiles.active=<profilename>方法将配置编码到配置文件中。在实际场景中,这个变量需要在不同的环境中有所不同。您可以使用该-Dspring.profiles.active=<profile>参数指定配置,以便您可以轻松地在不同环境之间切换。

支持自定义命名空间

关于 Nacos 中的命名空间的详细信息,请参阅Nacos 概念

命名空间用于隔离不同租户的配置。组和数据 ID 在不同的命名空间中可以相同。命名空间的典型场景是不同环境的配置隔离,例如开发/测试环境和生产环境(配置和服务等)的隔离。

如果没有指定命名空间,则使用 Nacos 的“公共”命名空间${spring.cloud.nacos.config.namespace}。您还可以通过以下方式指定自定义命名空间:

spring.cloud.nacos.config.namespace=b3404bc0-d7dc-4855-b519-570ed34b62d7

此配置必须在 bootstrap.properties 文件中。的值spring.cloud.nacos.config.namespace是命名空间的id,id的值可以从Nacos控制台获取。添加配置时不要选择其他命名空间。否则无法正确检索配置。

支持自定义组

{spring.cloud.nacos.config.group}未定义配置时,默认使用 DEFAULT_GROUP 。如果需要定义自己的组,可以在以下属性中定义:

spring.cloud.nacos.config.group=DEVELOP_GROUP

此配置必须在 bootstrap.properties 文件中,且 Group 的值必须与spring.cloud.nacos.config.group.

支持自定义数据 ID

从 Spring Cloud Alibaba Nacos Config 开始,data id 可以自定义。这部分的详细设计可以参考Github issue。以下是一个完整的示例:

spring.application.name=opensource-service-provider
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

# config external configuration
# 1. Data Id is in the default group of DEFAULT_GROUP, and dynamic refresh of configurations is not supported.
spring.cloud.nacos.config.ext-config[0].data-id=ext-config-common01.properties

# 2. Data Id is not in the default group, and dynamic refresh of configurations is not supported.
spring.cloud.nacos.config.ext-config[1].data-id=ext-config-common02.properties
spring.cloud.nacos.config.ext-config[1].group=GLOBALE_GROUP

# 3. Data Id is not in the default group and dynamic referesh of configurations is supported.
spring.cloud.nacos.config.ext-config[2].data-id=ext-config-common03.properties
spring.cloud.nacos.config.ext-config[2].group=REFRESH_GROUP
spring.cloud.nacos.config.ext-config[2].refresh=true

我们可以看到:

  • 通过配置支持多个数据ID spring.cloud.nacos.config.ext-config[n].data-id
  • 通过配置自定义数据组spring.cloud.nacos.config.ext-config[n].group。如果未指定,则使用 DEFAULT_GROUP。
  • 通过配置更改配置时,控制此数据id是否支持动态刷新配置spring.cloud.nacos.config.ext-config[n].refresh。默认情况下不支持。

当同时配置多个 Data Id 时,优先级由 中的“n”值定义spring.cloud.nacos.config.ext-config[n].data-id。值越大,优先级越高。

的值spring.cloud.nacos.config.ext-config[n].data-id必须有一个文件扩展名,它可以是属性或 yaml/yml。中的设置spring.cloud.nacos.config.file-extension对自定义 Data Id 文件扩展名没有任何影响。

自定义 Data Id 的配置允许在多个应用程序之间共享配置,也可以支持一个应用程序的多个配置。

为了更清晰地在多个应用程序之间共享数据id,还可以使用以下方法:

spring.cloud.nacos.config.shared-dataids=bootstrap-common.properties,all-common.properties
spring.cloud.nacos.config.refreshable-dataids=bootstrap-common.properties

我们可以看到:

  • 可以使用 配置多个共享数据 id spring.cloud.nacos.config.shared-dataids,数据 id 用逗号分隔。
  • spring.cloud.nacos.config.refreshable-dataids用于控制在更新配置时动态刷新哪些数据id,以及应用程序可以检索到最新的配置值。数据 ID 用逗号分隔。如果未指定,所有共享数据 id 将不会被动态刷新。

Nacos 配置端点

Nacos Config 在内部提供了一个 Endpoint,对应的端点 id 为nacos-config.

端点暴露的 json 包含三个属性:

  1. 来源:当前应用程序配置数据信息
  2. RefreshHistory:配置刷新历史
  3. NacosConfigProperties:显示当前服务的当前基本 Nacos 配置

以下显示了服务实例如何访问 Endpoint:

{
	"NacosConfigProperties": {
		"serverAddr": "127.0.0.1:8848",
		"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": "base-common.properties,common.properties",
		"refreshableDataids": "common.properties",
		"extConfig": null
	},
	"RefreshHistory": [{
		"timestamp": "2019-07-29 11:20:04",
		"dataId": "nacos-config-example.properties",
		"md5": "7d5d7f1051ff6571e2ec9f90887d9d91"
	}],
	"Sources": [{
		"lastSynced": "2019-07-29 11:19:04",
		"dataId": "common.properties"
	}, {
		"lastSynced": "2019-07-29 11:19:04",
		"dataId": "base-common.properties"
	}, {
		"lastSynced": "2019-07-29 11:19:04",
		"dataId": "nacos-config-example.properties"
	}]
}

禁用 Nacos 配置自动配置

设置 spring.cloud.nacos.config.enabled = false 以禁用 Spring Cloud Nacos Config AutoConfiguration。

关于 Nacos Config Starter 配置的更多信息

下面是 Nacos Config 的 starter 的其他配置:

配置钥匙默认值描述
服务器地址spring.cloud.nacos.config.server-addrNacos Server监听的IP和端口
来自 nacos 配置的 Dataidspring.cloud.nacos.config.name先取前缀,再取名字,最后取spring.application.name
来自 nacos 配置的 Dataidspring.cloud.nacos.config.prefix先取前缀,再取名字,最后取spring.application.name
nacos 配置内容的编码spring.cloud.nacos.config.encodenacos 配置内容的编码
用于 nacos 配置的 GROUPspring.cloud.nacos.config.groupDEFAULT_GROUP用于 nacos 配置的 GROUP
nacos config dataId 的后缀,也是配置内容的文件扩展名。spring.cloud.nacos.config.fileExtensionpropertiesnacos config dataId的后缀,也是config内容的文件扩展名(现在支持properties或者yaml(yml))
从 nacos 获取配置超时spring.cloud.nacos.config.timeout3000从 nacos 获取配置超时
端点spring.cloud.nacos.config.endpoint端点
命名空间spring.cloud.nacos.config.namespace命名空间
访问密钥spring.cloud.nacos.config.accessKey阿里云账号accesskey
密钥spring.cloud.nacos.config.secretKey阿里云账号秘钥
Nacos Server的上下文路径spring.cloud.nacos.config.contextPathNacos Server的上下文路径
集群名称spring.cloud.nacos.config.clusterName集群名称
共享配置的Dataidspring.cloud.nacos.config.sharedDataids共享配置的Dataid,用“,”分隔
共享配置的动态刷新 dataidspring.cloud.nacos.config.refreshableDataids共享配置的动态刷新dataid,用“,”分割
自定义数据标识spring.cloud.nacos.config.extConfig这是一个列表,由ConfigPOJO构建。Config有 3 个属性dataIdgrouprefresh
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring CloudSpring Cloud Alibaba都是基于Spring Framework的开源框架,用于构建分布式系统和微服务架构。它们都提供了一系列的组件和工具来简化微服务开发和管理。 Spring Cloud是一个由Pivotal团队维护的项目,它集成了Netflix开源的一些组件,如Eureka作为注册中心、Ribbon作为负载均衡器、Feign作为服务调用工具等。同时,Spring Cloud还提供了其他功能,如Config Server用于动态管理配置、Gateway用于构建API网关等。 而Spring Cloud Alibaba则是阿里巴巴开源的项目,它在Spring Cloud的基础上进行了扩展和定制,增加了一些阿里巴巴自己的组件和工具。比如,它使用Nacos作为注册中心和配置中心,使用Sentinel作为熔断降级工具。 总的来说,Spring CloudSpring Cloud Alibaba都是用于构建微服务架构的框架,它们的区别在于Spring Cloud集成了Netflix组件,而Spring Cloud Alibaba集成了阿里巴巴的一些组件。根据具体的需求和技术栈选择使用哪个框架可以更好地满足开发和管理微服务的需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Spring Cloud AlibabaSpring Cloud的区别](https://blog.csdn.net/weixin_43888891/article/details/126653270)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吕布辕门

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值