配置中心
配置主要有以下几个特点:
- 配置是独立于程序的只读变量
- 配置对于程序是只读的,程序通过读取配置来改变自己的行为,但是程序不应该去改变配置
- 配置伴随应用的整个生命周期
- 配置贯穿于应用的整个生命周期,应用在启动时通过读取配置来初始化,在运行时根据配置调整行为。
比如:启动时需要读取服务的端口号、系统在运行过程中需要读取定时策略执行定时任务等。
- 配置贯穿于应用的整个生命周期,应用在启动时通过读取配置来初始化,在运行时根据配置调整行为。
- 配置可以有多种加载方式
- 常见的有程序内部hard code,配置文件,环境变量,启动参数,基于数据库等
- 配置需要管理
- 同一份程序在不同的环境(开发,测试,生产)、不同的集群(如不同的数据中心)经常需要有不同的配置,所以需要有完善的环境、集群配置管理
应用程序在启动和运行的时候往往需要读取一些配置信息,配置基本上伴随着应用程序的整个生命周期,比如:数据库连接参数、启动参数等。
配置中心的功能:配置中心将配置从各应用中剥离出来,对配置进行统一管理,应用自身不需要自己去管理配置。
主流配置中心
nacos配置中心
在 配置管理 ,配置列表 页面,新建配置,并发布
在nacos-restful-consumerf服务,获取配置
增加配置坐标
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring‐cloud‐starter‐alibaba‐nacos‐config</artifactId>
</dependency>
- bootstrap.yml
要使用配置中心就要在bootstrap.yml中来配置,bootstrap.yml配置文件的加载顺序要比application.yml要优先。
server:
port: 56020
spring:
application:
name: nacos-restful-consumer #服务名
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #服务发现中心地址
config:
server-addr: 127.0.0.1:8848 #指定配置中心地址
file-extension: yml #指定配置文件的扩展名,配置文件美名称根据 application.name 名称 加扩展名进行拼装 nacos-restful-consumer.yml
# 负载均衡随机策略
nacos-restful-provider:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
- controller获取配置中心配置文件数据
package li.chen.com.nacos.controller;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.net.URI;
@RestController
@RequestMapping("/RestConsumerController")
public class RestConsumerController {
// 注入配置文件上下文;动态获取配置数据,即在nacos中修改发布后,自动获取最新的数据
@Autowired
private ConfigurableApplicationContext applicationContext;
@GetMapping(value = "/configs")
public String getConfigs(){
return applicationContext.getEnvironment().getProperty("common.name");
}
/*
@Value("${common.name}")
private String name;
@GetMapping("/configs")
public String getName(){
return name;
*/
}
nacos配置管理模型
对于Nacos配置管理,通过Namespace、group、Data ID能够定位到一个配置集。
配置集(Data ID)
在系统中,一个配置文件通常就是一个配置集,一个配置集可以包含了系统的各种配置信息,例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。每个配置集都可以定义一个有意义的名称,就是配置集的ID即Data ID。
配置项
配置集中包含的一个个配置内容就是配置项。它代表一个具体的可配置的参数与其值域,通常以 key=value 的形式存在。例如我们常配置系统的日志输出级别(logLevel=INFO|WARN|ERROR) 就是一个配置项。
配置分组(Group)
配置分组是对配置集进行分组,通过一个有意义的字符串(如 Buy 或 Trade )来表示,不同的配置分组下可以有相同的配置集(Data ID)。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:可用于区分不同的项目或应用,例如:学生管理系统的配置集可以定义一个group为:STUDENT_GROUP。
命名空间(Namespace)
命名空间(namespace)可用于进行不同环境的配置隔离。例如可以隔离开发环境、测试环境和生产环境,因为它们的配置可能各不相同,或者是隔离不同的用户,不同的开发人员使用同一个nacos管理各自的配置,可通过namespace隔离。不同的命名空间下,可以存在相同名称的配置分组(Group) 或 配置集。
Namespace:代表不同环境,如开发、测试、生产环境。
Group:代表某项目,如XX医疗项目、XX电商项目
DataId:每个项目下往往有若干个工程,每个配置集(DataId)是一个工程的主配置文件
config:
server‐addr: 127.0.0.1:8848 # 配置中心地址
file‐extension: yaml
namespace: a1f8e863‐3117‐48c4‐9dd3‐e9ddc2af90a8 # 开发环境
group: DEFAULT_GROUP # xx业务组
1、nacos服务地址,必须指定
2、namespace,如不指定默认public ,在config中指定namespace,例子如上:
3、group,如不指定默认 DEFAULT_GROUP 例子如上。
4、dataId,必须指定,名称为应用名称+配置文件扩展名
自定义扩展的Data Id 配置
新增 自定义扩展 ext-config-common01.yaml
新增 自定义扩展 ext-config-common02.yaml
在nacos-restful-consumerf服务,获取配置
增加配置坐标
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring‐cloud‐starter‐alibaba‐nacos‐config</artifactId>
</dependency>
- bootstrap.yml
要使用配置中心就要在bootstrap.yml中来配置,bootstrap.yml配置文件的加载顺序要比application.yml要优先。
server:
port: 56020
spring:
application:
name: nacos-restful-consumer #服务名
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #服务发现中心地址
config:
server-addr: 127.0.0.1:8848 #指定配置中心地址
file-extension: yml #指定配置文件的扩展名,配置文件美名称根据 application.name 名称 加扩展名进行拼装 nacos-restful-consumer.yml
# 自定义 Data Id 的配置
# 1、Data Id group:组名,refresh:动态刷新
ext‐config[0]:
data‐id: ext‐config‐common01.yaml
group: COMMON_GROUP
refresh: true
ext‐config[1]:
data‐id: ext‐config‐common02.yaml
group: COMMON_GROUP
refresh: true
# 负载均衡随机策略
nacos-restful-provider:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
- 通过 spring.cloud.nacos.config.ext-config[n].data-id 的配置方式来支持多个 Data Id 的配置。
- 通过 spring.cloud.nacos.config.ext-config[n].group 的配置方式自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。
- 通过 spring.cloud.nacos.config.ext-config[n].refresh 的配置方式来控制该 Data Id 在配置变更时,是
否支持应用中可动态刷新, 感知到最新的配置值。默认是不支持的。
- Note : spring.cloud.nacos.config.ext-config[n].data-id 的值必须带文件扩展名,文件扩展名既可支持properties,又可以支持 yaml/yml。 此时 spring.cloud.nacos.config.file-extension 的配置对自定义扩展配置的 Data Id 文件扩展名没有影响
- controller获取配置中心配置文件数据
package li.chen.com.nacos.controller;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.net.URI;
@RestController
@RequestMapping("/RestConsumerController")
public class RestConsumerController {
// 注入配置文件上下文;动态获取配置数据,即在nacos中修改发布后,自动获取最新的数据
@Autowired
private ConfigurableApplicationContext applicationContext;
@GetMapping(value = "/configs")
public String getConfigs(){
String name = applicationContext.getEnvironment().getProperty("common.name");
String address = applicationContext.getEnvironment().getProperty("common.addr");
return name+address;
}
}
http://127.0.0.1:56020/configs
nacos config | hainan
nacos config 为nacos-restful-consumer.yml 主配置优先级大于自定义扩展配置,取主配置属性值
hainan 为 ext-config-common02.yaml 中的,原因为ext‐config[1] 下标越大,优先级越高,会替换之前的。
tomcat路径配置
在配置文件增加此配置,访问路径如下
http://127.0.0.1:56020/a/configs
#tomcat头信息和访问路径配置
server:
tomcat:
remote_ip_header: x‐forwarded‐for
protocol_header: x‐forwarded‐proto
servlet:
context‐path: /a
use‐forward‐headers: true
若在主配置文件中配置,访问路径如下
http://127.0.0.1:56020/configs
#tomcat头信息和访问路径配置
server:
servlet:
context‐path: /*
use‐forward‐headers: true