文章实例使用的Spring Cloud版本为Finchley.SR1,Spring Boot版本为2.0.4。
1 Spring Cloud Config
Spring Cloud Config是Spring Cloud团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端与客户端两个部分。其中服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置仓库并为客户端提供获取配置信息、加密/解密信息等访问接口;而客户端则是微服务架构中的各个微服务应用或基础设施,它们通过指定的配置中心来管理应用资源与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。
在本节,我们演示了一个基于SVN仓库的分布式配置中心的创建过程。
2 构建配置中心
2.1 创建Spring Boot项目config-server,引入相关依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.tmatesoft.svnkit</groupId>
<artifactId>svnkit</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.2 添加@EnableConfigServer,开启Spring Cloud Config的服务端功能
@EnableConfigServer
@SpringCloudApplication
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
2.3 application.properties配置
application.properties:
spring.application.name=config-server
server.port=4001
#指定注册中心地址
eureka.client.serviceUrl.defaultZone=http://localhost:1002/eureka/,http://localhost:1003/eureka/
#实例默认通过使用域名形式注册到注册中心:false
eureka.instance.prefer-ip-address=true
#实例名
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
#使用svn作为配置仓库,必须显示声明profiles.active=subversion
spring.profiles.active=subversion
#SVN仓库地址
spring.cloud.config.server.svn.uri=svn://193.112.95.176/
#SVN用户名
spring.cloud.config.server.svn.username=xiaolai
#SVN用户密码
spring.cloud.config.server.svn.password=xxx
#配置仓库的分支
spring.cloud.config.server.default-label=spring-cloud-config
#配置仓库路径下的相对搜索位置
spring.cloud.config.server.svn.search-paths={application}
SVN目录结构如下:
2.4 启动配置中心
访问 http://localhost:4001/config-client/dev ,可以看到返回了匹配到的配置文件:
其中访问配置信息的URL与配置文件的映射关系如下:
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
3 客户端实例
3.1 创建Spring Boot应用config-client,引入依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3.2 Spring Boot应用入口类
@SpringCloudApplication
public class ConfigClientApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication.class, args);
}
}
3.3 添加配置文件bootstrap.properties
spring.profiles.active=${profiles:dev}
server.port=3003
spring.application.name=config-client
eureka.client.serviceUrl.defaultZone=http://localhost:1002/eureka/,http://localhost:1003/eureka/
#实例默认通过使用域名形式注册到注册中心:false
eureka.instance.prefer-ip-address=true
#实例名
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
#高可用配置中心通过服务Id去自动发现config-server服务组
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.service-id=config-server
spring.cloud.config.profile=${spring.profiles.active}
#暴露配置刷新端点
management.endpoints.web.exposure.include=refresh
3.4 创建接口,读取配置中心配置
@RefreshScope
@RestController
public class FromController {
@Value("${from}")
private String from;
@Value("${from-profile}")
private String fromProfile;
@RequestMapping("/from")
public String from() {
return this.from + ":" + this.fromProfile;
}
}
3.5 启动运用
打开 http://localhost:3003/from ,可以看到读取到的配置信息输出
配置更改时,可通过访问端点 http://localhost:3003/actuator/refresh ,刷新配置