天天看点

Spring Cloud:Nacos配置中心Nacos配置中心参考资料

Nacos配置中心

什么是配置中心

在微服务架构中,当系统从一个单体应用,被拆分成分布式系统上一个个服务节点后,配置文件也必须跟着分割,这样导致配置分散、冗余,难以管理。如下图:

Spring Cloud:Nacos配置中心Nacos配置中心参考资料

总得来说,配置中心就是一种统一管理各种应用配置的基础服务组件。

配置中心将配置从各应用中剥离出来,对配置进行统一管理,应用自身不需要自己去管理配置,让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。

Nacos配置中心

Nacos是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

Spring Cloud:Nacos配置中心Nacos配置中心参考资料

配置中心的服务流程如下:

  1. 用户在配置中心更新配置信息。
  2. 服务A和服务B及时得到配置更新通知,从配置中心获取配置。

整合Nacos Spring Cloud

首先下载并启动Nacos,详情参考:Nacos入门

然后通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更,关于 Nacos Spring Cloud 的详细文档请参看:Nacos Discovery。

  1. 添加依赖:
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>${latest.version}</version>
</dependency>
           
  1. 添加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 类型。
  1. 在Application添加注解@SpringBootApplication并启动
@SpringBootApplication
@EnableDiscoveryClient
public class Spring2goUpmsApplication {
  public static void main(String[] args) {
    SpringApplication.run(Spring2goUpmsApplication.class, args);
    System.out.println("(♥◠‿◠)ノ゙  UPMS 启动成功   ლ(´ڡ`ლ)゙  \n");
  }
}
           
  1. 启动Nacos,在配置管理中添加yml文件
Spring Cloud:Nacos配置中心Nacos配置中心参考资料

详情

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

继续阅读