Nacos配置中心
什么是配置中心
在微服务架构中,当系统从一个单体应用,被拆分成分布式系统上一个个服务节点后,配置文件也必须跟着分割,这样导致配置分散、冗余,难以管理。如下图:
总得来说,配置中心就是一种统一管理各种应用配置的基础服务组件。
配置中心将配置从各应用中剥离出来,对配置进行统一管理,应用自身不需要自己去管理配置,让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
Nacos配置中心
Nacos是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
配置中心的服务流程如下:
- 用户在配置中心更新配置信息。
- 服务A和服务B及时得到配置更新通知,从配置中心获取配置。
整合Nacos Spring Cloud
首先下载并启动Nacos,详情参考:Nacos入门
然后通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更,关于 Nacos Spring Cloud 的详细文档请参看:Nacos Discovery。
- 添加依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${latest.version}</version>
</dependency>
- 添加Nacos配置(bootstrap.yml文件或者bootstrap.properties文件)
spring:
application:
# 应用名称
name: spring2go-upms
profiles:
# 环境配置
active: dev
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: 127.0.0.1:8848
config:
# 配置中心地址
server-addr: 127.0.0.1:8848
# 配置文件格式
file-extension: yml
# 共享配置
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
说明:之所以需要配置 spring.application.name ,是因为它是构成 Nacos 配置管理 dataId字段的一部分。
在 Nacos Spring Cloud 中,dataId 的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
- prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
- spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
- file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。
- 在Application添加注解@SpringBootApplication并启动
@SpringBootApplication
@EnableDiscoveryClient
public class Spring2goUpmsApplication {
public static void main(String[] args) {
SpringApplication.run(Spring2goUpmsApplication.class, args);
System.out.println("(♥◠‿◠)ノ゙ UPMS 启动成功 ლ(´ڡ`ლ)゙ \n");
}
}
- 启动Nacos,在配置管理中添加yml文件
详情
spring:
application:
# 应用名称
name: spring2go-upms
# mysql
datasource:
url: jdbc:mysql://127.0.0.1:3306/spring2go_upms?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
username: root
password: 123456
# mybatis配置
mybatis-plus:
mapper-locations: classpath:mapper/**/*.xml
configuration:
# 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# swagger配置
swagger:
enabled: true
title: UPMS 系统模块接口文档
groupName: upms
# feign配置
spring2go:
upms-service-endpoint: http://spring2go-upms
测试
package com.spring2go.upms.biz.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* @Description: Nacos示例代码
* @author: xiaobin
* @date: 2021-04-13 10:00
*/
@RestController
public class TestController {
@Value("${spring2go.upms-service-endpoint}")
private String endpoint;
@RequestMapping("/getEndpoint")
public String getEndpoint() {
return endpoint;
}
}
启动程序,访问http://localhost:4000/getEndpoint(端口请根据实际调整),返回"http://spring2go-upms"表示测试通过。
填坑日志
nacos 配置中心无法加载bootstrap.yml/properties配置文件
当项目完成了依赖引入和参数配置后,启动时仍报配置参数不存在的异常。
解决方案:
如果是spring cloud项目加入以下依赖
<!-- 若bootstrap配置不生效,加入以下依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>last version</version>
</dependency>
如果是spring boot项目则加入以下
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
</dependency>
因为bootstrap.yml 用于应用程序上下文的引导阶段。bootstrap.yml 由父Spring ApplicationContext加载。
默认情况下,bootstrap.yml配置只在spring cloud项目中加载使用,spring boot项目只会识别application.yml配置。所以如果需要读取bootstrap.yml,需要依赖spring-cloud-context。
拓展知识
- 加载顺序
若application.yml 和bootstrap.yml 在同一目录下:bootstrap.yml 先加载 application.yml后加载
bootstrap.yml 用于应用程序上下文的引导阶段。bootstrap.yml 由父Spring ApplicationContext加载。
- 配置区别
bootstrap.yml 和 application.yml 都可以用来配置参数。
bootstrap.yml 用来程序引导时执行,应用于更加早期配置信息读取。可以理解成系统级别的一些参数配置,这些参数一般是不会变动的。一旦bootStrap.yml 被加载,则内容不会被覆盖。
application.yml 可以用来定义应用级别的, 应用程序特有配置信息,可以用来配置后续各个模块中需使用的公共参数等。
- 属性覆盖问题
启动上下文时,Spring Cloud 会创建一个 Bootstrap Context,作为 Spring 应用的 Application Context 的父上下文。
初始化的时候,Bootstrap Context 负责从外部源加载配置属性并解析配置。这两个上下文共享一个从外部获取的 Environment。Bootstrap 属性有高优先级,默认情况下,它们不会被本地配置覆盖。
也就是说如果加载的 application.yml 的内容标签与 bootstrap 的标签一致,application 也不会覆盖 bootstrap,而 application.yml 里面的内容可以动态替换。
- bootstrap.yml典型的应用场景
- 当使用 Spring Cloud Config Server 配置中心时,这时需要在 bootstrap.yml 配置文件中指定 spring.application.name 和 spring.cloud.config.server.git.uri,添加连接到配置中心的配置属性来加载外部配置中心的配置信息
- 一些固定的不能被覆盖的属性
- 一些加密/解密的场景
参考资料
- 官网
- Github