spring cloud config
spring cloud config是spring cloud团队创建的一个全新的项目,用来为分布式系统中的基础设施和微服务应用提供集中化的配置支持。他分为服务端和客户端两部分。其中服务端也称为分布式式配置中心,它是一个独立的微服务应用,用来连接配置仓库的并为客户端提供获取配置信息,加密、解密等访问接口。而客户端则是微服务架构中的各个微服务应用和基础设施。
入门实例
这里我们会创建一个基于Git存储的分布式配置中心,并且在客户端演示如何通过配置指定的微服务应用所属的配置中心,以及让其能够通过配置中心获取配置信息并绑定到代码中。
说先我们在github上面先创建一个配置文件存储的仓库"config-repo",创建完成后新建spring_cloud_in_action/config-repo的目录。
在config-repo目录下面新建"didispace.properties"、
"didispace-dev.properties"、"didispace-prod.properties"、"didispace-test.properties";
然后在这4个文件中均设置一个from属性,并且为每个配置文件设置不同的值:
from=git-default-2.0
from=git-dev-2.0
from=git-prod-2.0
from=git-test-2.0
对应对应github上面的目录:
到这里,我们配置文件的仓库就已经配置好了。我们继续回到spring cloud的项目中;
建一个spring boot的module,并且命名为"";创建的过程中,我们选择eureka-server和config的组件依赖。
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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>eureka-config-git</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eureka-config-git</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<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-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yml配置:
spring:
application:
name: config-server-git
cloud:
config:
server:
git:
uri: https://github.com/ChinPangLung/config-repo #git仓库的地址;file://${user.name}/config-repo这是本地文件路径配置的方式,只限于用于开发使用
searchPaths: spring_cloud_in_action/config-repo
username: XXXXXXX #这里对应仓库地址的账号密码
password: XXXXXXX
discovery:
enabled: true
server:
port: 7001
eureka:
client:
serviceUrl:
defaultZone: http://peer1:8762/eureka/,http://peer2:8763/eureka/
spring.cloud.config.server.git.uri 表示我们上面再GitHub上创建的config-repo仓库地址
spring.cloud.config.server.git.searchPaths 表示配置文件存放查询的地址
spring.cloud.config.server.git.username 表示我们的github的账号 (大家修改成自己对应的账号密码就行了)
spring.cloud.config.server.git.password 表示我们github的密码
项目的主类添加@EnableConfigServer注解
@SpringBootApplication
@EnableConfigServer
public class EurekaConfigGitApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaConfigGitApplication.class, args);
}
}
到这里我们的配置服务中心就已经基本的搭建完成,在eureka注册中心,启动的情况下,我们运行该项目,如果没有报错,那就说明我们的配置是没有问题的。
完成了这些准备工作之后,我们就可以通过浏览器、POSTMAN或CURL等工具直接来访问到我们的配置内容了。访问配置信息的URL与配置文件的映射关系如下:
- /{application}/{profile}[/{label}]
- /{application}-{profile}.yml
- /{label}/{application}-{profile}.yml
- /{application}-{profile}.properties
- /{label}/{application}-{profile}.properties
上面的url会映射{application}-{profile}.properties对应的配置文件,其中{label}对应Git上不同的分支,默认为master。我们可以尝试构造不同的url来访问不同的配置内容,比如,要访问master分支,didisapce应用的dev环境,就可以访问这个url:http://localhost:7001/didispace/dev/master
可以得到以下的返回:
完成了上述的验证后,我们就可以创建一个客户端来映射服务配置中心的配置了。
创建一个spring boot的module,命名为"eureka-config-client"
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>eureka-config-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eureka-config-client</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yml配置:
spring:
application:
name: config-client
server:
port: 7002
创建一个"bootstrap.yml"文件,配置如下:
spring:
cloud:
config:
profile: dev #dev开发环境配置文件,test测试环境配置文件,pro正式环境文件
label: master #git仓库对应的分支名称 config-label-test
# uri: http://localhost:7001/ #config-server
name: didispace
discovery:
serviceId: config-server-git #基于服务注册发现的方式查找
enabled: true
eureka:
client:
serviceUrl:
defaultZone: http://peer1:8762/eureka/,http://peer2:8763/eureka/
#注册中心eureka.client.service-url.defaultZone = 一定要放在boostrap文件中,不然启动会报错
在项目的中类中写一个from接口:
@SpringBootApplication
@RestController
@RefreshScope
public class EurekaConfigClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaConfigClientApplication.class, args);
}
@Value("${from}")
private String from;
@RequestMapping(value = "from")
public String getFrom() {
return this.from;
}
}
启动项目,然后访问http://localhost:7002/from可以得到以下的返回:
这个数据就是config-client项目获取服务配置中心里对应指向的GitHub仓库配置文件的值。
而且我们观察"eureka-config-git"项目控制台的输出
我们可以知道,服务配置中心在获取GitHub上面的配置文件返回config-client时,同时会缓存一分数据在本地的。这样就算因为其他的问题导致配置服务中心获取不到GitHub仓库的数据时,config-client也能有缓存的数据返回。
这样我们就完成了分布式配置中心的搭建了。其实上面的config-client我们在实际的开发中,就是相当于一个具体的微服务实例应用了。
下面一篇我们将搭建spring cloud bus 服务总线。