1.服务配置中心介绍
⾸先我们来看⼀下,微服务架构下关于配置⽂件的⼀些问题:
-
配置⽂件相对分散 。在⼀个微服务架构下,配置⽂件会随着微服务的增多变的越来越多 ,⽽且分散在各个微服务中,不好统⼀配置和管理。
-
配置⽂件**⽆法区分环境** 。微服务项目可能会有多个环境。例如:测试环境、预发布环境、⽣产环境。每⼀个 环境所使⽤的配置理论上都是不同的,⼀旦需要修改,就需要我们去各个微服务下⼿动维护,这⽐较困难。
-
配置⽂件**⽆法实时更新** 。我们修改了配置⽂件之后,必须重新启动微服务才能使配置⽣效,这对⼀个正在运 ⾏的项⽬来说是⾮常不友好的。
需要配置中心来解决这些问题
配置中⼼的思路是:
- ⾸先把项⽬中各种配置全部都放到⼀个集中的地⽅进⾏统⼀管理 ,并提供⼀套标准的接⼝。
- 当各个服务需要获取配置的时候,就来配置中⼼的接⼝拉取⾃⼰的配置。
- 当配置中⼼中的各种参数有更新的时候,也能通知到各个服务实时的过来同步最新的信息,使之动态更新。(将这些放入云端 )
当加⼊了服务配置中⼼之后,我们的系统架构图会变成下⾯这样:

微服务项目主要使用nacos
这是 SpingCloud alibaba 技术栈中的⼀个组件,前⾯我们已经使⽤它做过服务注册中⼼。其实它也集成了服务 配置的功能,我们可以直接使⽤它作为服务配置中⼼。
2.Nacos Config入门案例
使⽤ nacos 作为配置中⼼,其实就是将 nacos 当做⼀个服务端,将各个微服务看成是客户端,我们将各个微服 务的配置⽂件统⼀存放在 nacos 上,然后各个微服务从 nacos 上拉取配置即可。
创建一个java项目,来进行一个入门案例。
2.1打开nacos
首先打开nacos,在哪里下载的在哪里打开。
例如:我实在Linux中下载的,在Linux中的**/nacos/bin目录** 下输入sh startup.sh打开即可

在浏览器中输入192.168.xx.xx:8848,出现下面图片中的内容即成功打开
注:192.168.xx.xx为Linux的IP地址

2.2配置nacos
按照下列图片进行操作



在上图中依次进行填写
例如:

注:要选择命名空间
2.2引入依赖
XML
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
2.3编写启动项
java
package com.jiazhong.mingxing.project.cloud.nacos.config;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
@SpringBootApplication
@Slf4j
public class CloudNacosConfigApplication {
@SneakyThrows
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(CloudNacosConfigApplication.class, args);
}
}
2.4配置application.yml文件
java
server:
port: 8010
spring:
application:
name: cloud-nacos-config
2.4.1读取application.yml文件中的内容

2.5读取云端中的配置
2.5.1在resources目录下创建bootstrap.properties(bootstrap必须是这个名字)
配置bootstrap.properties
java
# 加载云端的配置内容
spring.cloud.nacos.config.namespace=5dde225c-61e0-4015-8a2f-5eabe8407195
spring.cloud.nacos.config.server-addr=192.168.11.88:8848
2.5.2读取云端的内容
application.yml文件中name必须与在nacos中配置的文件名字一致。
在启动文件中编写代码获取配置信息

3.Nacos配置深入
3.1配置一个yaml文件

3.2将properties文件修改成ymal文件
java
spring:
cloud:
nacos:
config:
namespace: 5dde225c-61e0-4015-8a2f-5eabe8407195
server-addr: 192.168.11.88:8848
file-extension: yaml
3.3重新启动即可获取远端配置的ymal文件的内容
3.4配置动态刷新
在⼊⻔案例中,我们实现了配置的远程存放,但是此时如果修改了配置,我们的程序是⽆法读取到的,因此,我们 需要开启配置的动态刷新功能。
java
refresh-enabled: true
3.4.1修改启动类
将其改为循环即可输出,将云端的配置修改后下一个循环会改变输出的内容

3.4.2通过配置文件输出
新建controller包,在该包下写ConfigController文件
java
@RefreshScope
@RestController
@RequestMapping("/config")
public class ConfigController {
@Value("${student.id}")
private String stuId;
@Value("${student.name}")
private String stuName;
@Value("${student.gender}")
private String stuGender;
@GetMapping
public JsonResult a() {
return ResultTool.success("The Name is " + stuName + " and Gender is " + stuGender + ",userId is " + userId + ",schoolId is " + schoolId + ",userName is " + userName + ",userAge is " + userAge + ",schoolName is " + schoolName);
}
}
启动后在浏览器中输入http://localhost:8010/config即可获取到,如果改变云端配置文件的内容,刷新即可获取到改变的内容。
3.5可支持profile粒度的配置
3.5.1新建三个配置文件



3.5.2加载
在bootstrap.yml文件中加入下述代码
java
profiles:
active: test/dev/priduct
在浏览器中输入相应地址即可出现相应内容。
4.⽀持⾃定义Group的配置
在没有明确指定 ${spring.cloud.nacos.config.group} 配置的情况下, 默认使⽤的是 DEFAULT_GROUP 。如 果需要⾃定义⾃⼰的 Group ,可以通过以下配置来实现:
需要注意的是:该配置必须放在 bootstrap.properties|yaml ⽂件中。并且在添加配置时 Group 的值⼀
定要和 spring.cloud.nacos.config.group 的配置值⼀致。
5.支持自定义扩展的Date Id配置(重点)
当配置越来越多的时候,我们就发现有很多配置是重复的,这时候就考虑可不可以将公共配置⽂件提取出来,然后 实现共享呢?当然是可以的。接下来我们就来探讨如何实现这⼀功能。⼀般我们通过两种⽅式实现:
- 拓展配置
- 共享配置
5.1共享方式(shared-configs)
5.1.1新建两个配置



5.1.2在bootstrap.yml文件中写入下述代码
java
#读取云端的三个配置文件
shared-configs:
- data-id: abc.yaml
group: DEFAULT_GROUP # 默认是DEFAULT_GROUP
refresh: true
- data-id: wsgfhin.yaml
- data-id: uw.yaml
group: BBBB_GROUP
5.1.3ConfigConroller.java文件
java
// 另外两个文件中的内容
@Value("${user.id}")
private String userId;
@Value("${user.name}")
private String userName;
@Value("${user.age}")
private String userAge;
@Value("${school.id}")
private String schoolId;
@Value("${school.name}")
private String schoolName;
@GetMapping
public JsonResult a() {
return ResultTool.success("The Name is " + stuName + " and Gender is " + stuGender + ",userId is " + userId + ",schoolId is " + schoolId + ",userName is " + userName + ",userAge is " + userAge + ",schoolName is " + schoolName);
}
5.1.4在浏览器中输入相应地址查看即可
5.2拓展方式(extension-configs)
和上述的共享方式相同,只需将bootstrap.yml文件中的shared-configs修改为extension-configs
注:自己写的优先级>拓展方式>共享方式