第三章Spring cloud configuration server 控制配置
在云环境上中,可能要部署上百套实例,这时候怎么做到所有实例都是一样的额呢?而且上百个实例的配置文件的运维是很麻烦的(一旦配置文件代码进行了修改,就需要重新配置上百个实例的配置文件)。
基于云的微服务开发强调:
- 将应用程序的配置完全从正在部署的实际代码分离
- 创建服务器和应用程序以及一个不可变的镜像,它在你的环境升级的时候不会改变。
- 将任何应用程序的配置信息在服务器启动的时候通过环境变量注入或者在启动的时候应用程序的微服务从中央仓库读取。
3.1 简单搭建分布式配置中心
- 需要两个角色,一个Config server 一个是Config client
- Config server获取配置的方式可以是git或者数据库
3.1.1 基于git 的Config server
3.1.1.1 构建一个基于model,依赖选择 config server
最终pom如下:
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.learn</groupId>
<artifactId>config-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>config-server</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.RC2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-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>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
</project>
3.1.1.2 启动应用中添加@EnableConfigServer
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
3.1.1.3 修改application.peroperties文件
spring.application.name=config-server
server.port=8889
spring.cloud.config.server.git.uri=https://github.com/liucc0413/MyProject
spring.cloud.config.server.git.searchPaths=config
spring.cloud.config.label=master
spring.cloud.config.server.git.username=your username
spring.cloud.config.server.git.password=your password
- 因为本示例的配置服务是 基于git 拉取配置的所以需要配置git 项目地址,目录,分支,用户名和密码。
- https://github.com/liucc0413/MyProject是我构建的一个公共的git 库,所以不需要用户名和密码。
- 当前目录下一个service-hi-dev.properties属性文件(文件名要记住啊,后面会用到),内容如下
foo = lccTest *******************8899999&&&&&&&&&&&&&&&&&&&&&fdsfas
3.1.1.4 启动服务
启动服务后,可以执行http://localhost:8889/service-hi/dev,来确认是否成功
3.1.2 搭建 config client
3.1.2.1 创一个modle,依赖引入web,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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.learn</groupId>
<artifactId>config-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>config-client</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.RC2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--spring cloud config client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</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>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
</project>
3.1.2.2 创建bootstrap.properties属性文件
注意:
如果有关于config 的相关信息,一定要写到这里,因为config 启动的时候默认加载bootstrap.properties(.yml)文件。
我刚搭建的时候,将config service的端口号等写入到application.yml里了,启动的时候一直去localhost://8888拉配置。因为默认的是config service是localhost://8888。
spring.application.name=service-hi
spring.cloud.config.label=master
spring.cloud.config.profile=dev
spring.cloud.config.uri= http://localhost:8889/
server.port=8881
- 注释1
spring.application.name:服务的名称
spring.cloud.config.label:标记版本的标志
spring.cloud.config.{profile}映射到客户端上的“spring.profiles.active“
- 注释2
Config client向Config server拉取配置,Config server 向git 库拉取配置文件,问题是应该拉取那个配置文件呢?这时候就用到name,profile,label了。
会到git 库找{spring.application.name}-{spring.cloud.config.profile}.properties
3.1.2.3 编写测试Rest
@RestController
@RequestMapping("/client")
public class ConfigClientController {
@Value("${foo}")
String foo;
@RequestMapping(value = "/hi")
public String hi(){
return foo;
}
}
结果:
3.1.3 构建基于数据库配置信息的config server
构建基于数据库的config server只需要在3.1.2上做一定的修改,config client的配置不需要修改
3.1.3.1 创建lccTest2数据库和properties 表
- 创建表
CREATE TABLE `properties` (`id` int(11) NOT NULL,`key` varchar(50) NOT NULL, `value` varchar(500) NOT NULL, `application` varchar(50) NOT NULL,`profile` varchar(50) NOT NULL,`label` varchar(50) NOT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- 表中插入数据
3.1.3.2 添加数据库依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
<scope>compile</scope>
</dependency>
3.1.3.3 application.properties如下
spring.application.name=config-server
server.port=8889
spring.profiles.active=jdbc //一定要改为jdbc
spring.cloud.config.server.jdbc.sql=SELECT `KEY`,`VALUE` from properties where APPLICATION=? and PROFILE=? and LABEL=?
spring.datasource.url=jdbc:mysql://localhost:3306/lccTest2
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
注释:spring.cloud.config.server.jdbc.sql默认是SELECT `KEY`,`VALUE` from PROPERTIES where APPLICATION=? and PROFILE=? and LABEL=?(即表大写),我的数据库版本执行的时候报错,所以改为小写。
启动测试结果
源码:https://github.com/liucc0413/SpringCloudConfig