在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。在Spring Cloud中,有分布式配置中心组件spring cloud config ,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中。在spring cloud config 组件中,分两个角色,一是config server,二是config client。server提供配置文件的存储、以接口的形式将配置文件的内容提供出去,client通过接口获取数据、并依据此数据初始化自己的应用。
目前SpringCloud Config的使用主要是通过Git/SVN方式做一个配置中心,然后每个服务从其中获取自身配置所需的参数。SpringCloud Config也支持本地参数配置的获取。如果使用本地存储的方式,在 application.properties 或 application.yml 文件添加 spring.profiles.active=native 配置即可,它会从项目的 resources路径下读取配置文件。如果是读取指定的配置文件,那么可以使用 spring.cloud.config.server.native.searchLocations = file:E:/properties/ 来读取。 本文中使用git文件配置作为演示
启动上篇中Eureka演示工程中Eureka Server
新建一个maven工程,取名为:spring-cloud-config-server,添加如下依赖pom.xml中
<?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>spring-cloud-demo</artifactId> <groupId>com.hxmec</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>spring-cloud-config-server</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- config server依赖包--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> 复制代码
新建application.yml,增加下面的配置
server: port: 9005 spring: application: name: config-server cloud: config: label: master server: git: #github配置地址 #如果Git仓库为公开仓库,可以不填写用户名和密码,如果是私有仓库需要填写,本例子是公开仓库,放心使用。 uri: https://github.com/ty1972873004/spring-cloud-config.git #配置文件路径 search-paths: appconfig #username: #password: #git分支 default-label: master logging: pattern: console: '%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} - %msg%n' eureka: client: service-url: defaultZone: http://localhost:8888/eureka/ 复制代码
创建一个启动类 ConfigServerApplication,并加上@EnableConfigServer注解开启配置服务器的功能。
@SpringBootApplication @EnableConfigServer @EnableDiscoveryClient public class ConfigServerApplication { public static void main(String[] args) { SpringApplication.run(ConfigServerApplication.class, args); } } 复制代码
远程仓库https://github.com/ty1972873004/spring-cloud-config.git 中有个文件config-client-dev.yml 文件中有一个属性: 启动程序可通过访问http://localhost:9005/config-client/dev 验证是否成功获取配置
springcloud config 的URL与配置文件的映射关系如下:
新建一个maven工程,取名为:spring-cloud-config-client,添加如下依赖pom.xml中
<?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>spring-cloud-demo</artifactId> <groupId>com.hxmec</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>spring-cloud-config-client</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- config client依赖包--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> 复制代码
新建bootstrap.yml,增加下面的配置 config相关配置一定要配置在boostrap.yml中
spring: application: name: config-client cloud: config: uri: http://127.0.0.1:9005/ label: master profile: dev name: ${spring.application.name} discovery: enabled: true service-id: config-server server: port: 9006 logging: pattern: console: '%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} - %msg%n' eureka: client: service-url: defaultZone: http://localhost:8888/eureka/ 复制代码
创建一个启动类 ConfigClientApplication
@SpringBootApplication @EnableDiscoveryClient public class ConfigClientApplication { public static void main(String[] args) { SpringApplication.run(ConfigClientApplication.class, args); } } 复制代码
编写DemoController添加一个演示接口从配置中心获取配置
@RestController @RequestMapping("/demo") @Slf4j public class DemoController { @Value("${hx.name:#{null}}") private String name; @GetMapping(value = "/test1") public String test1(){ return "Hello " + name; } } 复制代码
访问http://localhost:9006/demo/test1 验证是否从配置中心获取