前言:
1 系统默认的配置文件一般命名为application,也常命名为bootstrap引导应用程序名称,当同时存在application和bootstrap
两种配置文件时,系统会优先读取application配置文件的信息。
2 spring cloud 读取配置文件,一般采取服务端和客户端微服务集群方式,服务端配置资源来源类型(profile),默认从git读取,还有从SVN和native(本地文件系统读取)与vault(一款资源控制工具)的读取类型,服务端还有主要配置资源来源的地址、用户名、密码、资源文件所在文件夹目录名称;客户端配置服务端地址,文件的前缀名称,文件所属仓库(git为例),文件所属环境,环境一般分为四种,test测试环境,外部用户无法访问,专门给测试人员使用的,版本相对稳定;dev开发环境,外部用户无法访问,开发人员使用,版本变动很大;pre灰度环境,外部用户可以访问,但是服务器配置相对低,其它和生产一样;pro生产环境,面向外部用户的环境,连接上互联网即可访问的正式环境。客户端可以通过添加actuator端点的依赖使用httpclient对配置文件的更新进行动态刷新,以免每一次对配置文件的修改就要重启服务,造成比较大的代价!
本例的git文件结构:
服务端实例:
服务端主要做添加依赖和服务配置工作,其他不需要添加任何功能,代码如下
pom.xml 依赖:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
</dependencies>
yml 配置:
server:
port: 8888
management:
security:
enabled: false
spring:
application:
name: configserver
cloud:
config:
server:
git:
uri: https://github.com/higherzjm/mynew2019 # 配置文件所在git地址
search-paths: myconfig # 配置文件所在文件夹目录名称
username: higherzjm
password: ****
启动类:
@SpringBootApplication
@EnableConfigServer //启动配置服务
public class ConfigApp {
public static void main(String[] args) {
new SpringApplicationBuilder(ConfigApp.class).run(args);
}
}
服务端启动之后可以通过在浏览器验证是否可以读取到配置文件,如访问 http://localhost:8888/zjm-config/dev 验证是否可以在配置目录下读取zjm-config-dev配置文件,如可以会返回如下类似结果
客户端实例:
客户端配置较为复杂,需要配置服务端地址或服务id,文件所属git仓库,文件名称(前缀),文件所属环境,添加的依赖除了基本的spring cloud依赖外,还可以添加spring-boot-starter-actuator端点依赖,对配置文件的修改进行动态刷新,可通过httpclient访问refresh端点进行刷新操作,详细代码如下:
pom.xml 依赖:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.5.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>1.5.4.RELEASE</version><!--进行端口操作的依赖-->
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
</dependencies>
yml 配置:
management:
security:
enabled: false
spring:
#application:
#name: zjm-config
cloud:
config:
#url: http://localhost:8888/ #读取配置文件服务端的地址
profile: dev # 文件所属环境
name: zjm-config #文件名称(前缀),跟profile结合在一起就是zjm-config-dev.yml 或zjm-config-dev.properties
# 没有 cloud.config.name,也没有 application.name,则读取 application-dev.yml 或application-dev.properties
# 如果没有cloud.config.name,也没有 application.name,也没有 cloud.config.profile 则读取 application.yml 或application.properties
# 如果存在一样前缀名称的properties和yml文件,会优先读取properties为后缀的文件
label: master #所属仓库
discovery:
service-id: configserver #服务端应用id,如果没有配置服务端的URL地址,直接读取服务端id也行
控制器代码:
@RestController
public class ClientController {
@Autowired
private Environment env;
@RequestMapping(value = "/gp", method = RequestMethod.GET)
public String getProp() {
System.out.println("获取参数值");
String value=env.getProperty("springcloud.username");
if (value==null){
value=env.getProperty("springcloud.config.username");
}
System.out.println("value:"+value);
return value;
}
/**
* 调用刷新git配置的端点,当git配置文件有更改时,
* 只要调用该方法就可以刷新,不要重启客户端和服务端程序
* @return
*/
@RequestMapping(value = "/refreshConfig", method = RequestMethod.GET)
public String refreshConfig() {
String value="";
try {
CloseableHttpClient client = HttpClients.createDefault();
HttpPost post = new HttpPost("http://localhost:8080/refresh");
HttpResponse response = client.execute(post);
value="刷新成功:"+EntityUtils.toString(response.getEntity());
}catch (Exception e){
e.printStackTrace();
value="刷新异常";
}
System.out.println("value:"+value);
return value;
}
}
客户端在浏览器调用刷新配置文件端点的示例: