随着微服务的增多,每个微服务有自己的配置文件,而且需要针对dev
prod
等环境进行单独的配置,修改配置的工作量越来越多了,所以,为了解决这个问题,nacos
本身就内置了配置中心,我们可以直接才nacos
的页面上新建配置、修改配置等操作,nacos
会为我们自动同步配置,我们通过单独的一个服务来尝试下从服务从nacos
拉取配置的流程.
创建一个服务cloud-alibaba-config-client-3000
此次的pom.xml
,在原来的基础上,我们增加对于nacos-config
的引入
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>cloudservice</artifactId>
<groupId>com.felix</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-alibaba-config-client-3000</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>com.felix</groupId>
<artifactId>cloud-mbg</artifactId>
</dependency>
<dependency>
<groupId>com.felix</groupId>
<artifactId>cloud-common</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
</project>
复制代码
在resources
下新增两个yml
文件
其实从图标上就可以看出来bootstrap.yml
是从云端动态加载的配置,与常见项目不同的是,配置文件优先从bootstrap.yml
中加载,然后加载application.yml
的配置,但是假如两个配置文件有冲突,那么一定是由bootstrap.yml
中的配置来决定的,其拥有最高的优先级
这里bootstrap.yml
的配置文件如下
spring:
application:
name: cloud-alibaba-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848
file-extension: yaml
server:
port: 3000
management:
endpoints:
web:
exposure:
include: '*'
复制代码
我们定义nacons
的配置文件从localhost:8848
进行加载,配置文件的类型为yaml
application.yml
的配置如下
spring:
profiles:
active: dev
复制代码
为了验证是否能从云端加载配置,我们创建一个简单的 ConfigController
来读取本地不存在的配置文件
package com.felix.cloudconfig.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RefreshScope
@RequestMapping("/config")
public class ConfigController {
@Value("${config.info}")
private String configInfo;
@GetMapping(value = "/info")
@ResponseBody
public String getConfigInfo(){
return configInfo;
}
}
复制代码
当我们访问`/config/info`的时候,会读取config.info
的配置,但是这个配置在两个配置文件中并不存在,稍后我们会在nacos
的web
管理页面创建一个云端配置,来让其自动进行配置同步.注意,这里添加了@RefreshScope
的注解,这个注解作用是当我们修改了云端的配置的时候,为我们更新应用新的配置
接下来,我们需要在nacos
的web
管理页面创建一个配置文件,配置文件的命名规则为
spring.application.name + spring.profiles.active + .yaml
在当前的项目中,配置文件的名字为cloud-alibaba-config-client-dev.yaml
请注意,这里的后缀需要为.yaml,因为截止目前.yml 并不能被识别到,后期阿里可能会修复这个问题
在云端创建了一个cloud-alibaba-config-client-dev.yaml
配置文件,并且定义了config.info
的配置,启动此服务器,访问接口http://localhost:3000/config/info,看是否能够读取到配置文件
然后,修改配置文件中的version
为 2,再尝试访问接口
当然,对于一些特殊的操作,还是需要重启服务后才能够进行配置更新的,比如我将端口改为3002
直接访问http://localhost:3002/config/info是不通的
必须重启服务后,才会更新端口
当然,使用cloud-alibaba-config-client-dev.yaml
可以写开发环境的配置,cloud-alibaba-config-client-prod.yaml
可以写生产环境的配置,但是进行分类管理往往更好一些,所以我们需要知道namespace
和group
的概念,我们先创建两个namespace
新建dev
和prod
两个命名空间,然后回到配置列表页,可一看到多出了两个命名空间
我们在每个命名空间下新增cloud-alibaba-config-client.yaml
的配置文件,dev
命名空间的配置文件内容为
config:
info: dev namespace, dev group,cloud-alibaba-config-client.yaml
复制代码
prod
命名空间配置文件为
config:
info: prod namespace,prod group,cloud-alibaba-config-client.yaml
复制代码
然后,修改项目的bootstrap.yml
文件为
spring:
application:
name: cloud-alibaba-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848
file-extension: yaml
group: PROD_GROUP
namespace: e351a232-3e13-49e9-8453-f95f15384048
# group: DEV_GROUP
# namespace: 44dfd0e6-e3df-435b-848c-0ba064304419
server:
port: 3000
management:
endpoints:
web:
exposure:
include: '*'
复制代码
我们添加了group
和namespace
两个配置,分别于web
端的对应
那么项目启动后,就会去查找prod
命名空间下的PROD_GROUP
中的cloud-alibaba-config-client.yaml
的配置文件,访问http://localhost:3000/config/info可以看到,配置已经正常加载了
评论