常見的實現信息配置的方法:
● 硬編碼(缺點:需要修改代碼,風險大)
● 放在xml等配置文件中,和應用一起打包(缺點:需要重新打包和重啓)
● 文件系統中(缺點:依賴操作系統等)
● 環境變量(缺點:有大量的配置需要人工設置到環境變量中,不便於管理,且依賴平臺)
● 雲端存儲(缺點:與其他應用耦合)Spring Cloud Config 就是雲端存儲配置信息的,它具有中心化,版本控制,支持動態更新,平臺獨立,語言獨立等特性.
// =================配置倉庫(git/svn/native)=================
<?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>
<artifactId>config-server</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<java.version>1.7</java.version>
<project.encoding>UTF-8</project.encoding>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>4.3.5.RELEASE</spring.version>
</properties>
<parent>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-parent</artifactId>
<version>Brixton.SR4</version>
<relativePath/>
</parent>
<dependencies>
<!--spring cloud config server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!-- SVN Repos -->
<dependency>
<groupId>org.tmatesoft.svnkit</groupId>
<artifactId>svnkit</artifactId>
<version>1.8.10</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<optimize>true</optimize>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<finalName>${project.artifactId}-${project.version}</finalName>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<configuration>
<finalName>${project.artifactId}-${project.version}</finalName>
</configuration>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<!--mvn spring-boot:run 命令-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
客戶端:
<?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-in-action</artifactId>
<groupId>com.nobodyiam</groupId>
<version>1.0-SNAPSHOT</version>
</parent> -->
<modelVersion>4.0.0</modelVersion>
<artifactId>config-client</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<java.version>1.7</java.version>
<project.encoding>UTF-8</project.encoding>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>4.3.5.RELEASE</spring.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.3.RELEASE</version>
<relativePath/>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Brixton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-parent</artifactId>
<version>Brixton.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config</artifactId>
<version>1.3.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency> -->
</dependencies>
</dependencyManagement>
<dependencies>
<!--spring cloud config server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</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-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<optimize>true</optimize>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<finalName>${project.artifactId}-${project.version}</finalName>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<configuration>
<finalName>${project.artifactId}-${project.version}</finalName>
</configuration>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<!--mvn spring-boot:run 命令-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
// =================編碼======================
package com.spring.cloud.config.server;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
import org.springframework.context.annotation.Configuration;
/**
* Created by Jason on 2/24/16.
*/
@Configuration
@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
配置文件可以採用yml或properties格式,遠程倉庫可以採用git/svn/native,遠程倉庫只支持Http協議,所以svn必須以HTTP協議開放,否則連接不上,客戶無法讀取配置文件進行初始化工作。
management.context_path= /admin server.port= 8086 #server.contextPath= /ConfigServer #Git or SVN(subversion) or native , by default git(value config default) spring.profiles.active= default #1.Git repos configuration spring.cloud.config.server.git.uri= https://github.com/yangyangmyself/config-repo #spring.cloud.config.server.git.username=oyyl #spring.cloud.config.server.git.password=oyyl #spring.cloud.config.server.git.cloneOnStart=true #spring.cloud.config.server.git.basedir=target/class/repos #2.SVN repos configuration #spring.cloud.config.server.svn.uri= https://192.168.110.44/svn/config-repos #spring.cloud.config.server.svn.username=oyyl #spring.cloud.config.server.svn.password=oyyl #spring.cloud.config.server.svn.default-label=branches #spring.cloud.config.server.svn.searchPaths=configs/test #spring.cloud.config.server.svn.cloneOnStart=true #2.1Multi sub repos configuration(Maven project is must add svnkit jar file) #Math name(or applicaion) #spring.cloud.config.server.svn.repos.r1.pattern=vs1* #spring.cloud.config.server.svn.repos.r1.uri=https://192.168.110.44/svn/config-repos #spring.cloud.config.server.svn.repos.r1.username=oyyl #spring.cloud.config.server.svn.repos.r1.password=oyyl #spring.cloud.config.server.svn.repos.r1.default-label=branches #spring.cloud.config.server.svn.repos.r1.searchPaths=configs/test #spring.cloud.config.server.svn.repos.r2.pattern=vs2* #spring.cloud.config.server.svn.repos.r2.uri=https://192.168.110.44/svn/config-repos #spring.cloud.config.server.svn.repos.r2.username=oyyl #spring.cloud.config.server.svn.repos.r2.password=oyyl #spring.cloud.config.server.svn.repos.r2.default-label=branches #spring.cloud.config.server.svn.repos.r2.searchPaths=configs/test #Math profile #spring.cloud.config.server.svn.repos.r3.pattern=vs2/* #spring.cloud.config.server.svn.repos.r3.uri=https://192.168.110.44/svn/config-repos #spring.cloud.config.server.svn.repos.r3.username=oyyl #spring.cloud.config.server.svn.repos.r3.password=oyyl #spring.cloud.config.server.svn.repos.r3.default-label=branches #spring.cloud.config.server.svn.repos.r3.searchPaths=configs/test #3.Read Native Config #3.1Load local system file #spring.profiles.active=native #spring.cloud.config.server.native.searchLocations=file://D:/etc/cas/config #3.2Load application classpath #spring.profiles.active=native #spring.cloud.config.server.native.searchLocations=classpath\:/repos
package com.spring.cloud.config.client;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.HttpClients;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Configuration
@EnableAutoConfiguration
@ComponentScan
@RefreshScope
@RestController
public class ConfigClientApplication {
@Value("${redis.server}")
private String paraName;
@RequestMapping(value = "/cf/redis")
public String showRedis() {
return "Reids IP: " + paraName;
}
private String getRequestStr(HttpServletRequest request){
String servletPath = request.getServletPath();
String requestURL = request.getRequestURL().toString();
return requestURL.substring(0, requestURL.indexOf(servletPath));
}
@RequestMapping(value = "/admin/config/refresh")
public String refresh(HttpServletRequest request) {
HttpClient client = HttpClients.createDefault();
HttpPost post = new HttpPost(getRequestStr(request) + "/admin/refresh");
try {
client.execute(post);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return "refresh";
}
@RequestMapping(value = "/admin/config/restart")
public String restart(HttpServletRequest request) {
HttpClient client = HttpClients.createDefault();
HttpPost post = new HttpPost(getRequestStr(request) + "/admin/restart");
try {
client.execute(post);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return "restart";
}
public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication.class, args);
}
}
bootstrap.properties配置文件,bootstrap優先application加載,配置連接spring cloud config server端及讀取屬性文件
management.context_path= /admin
server.contextPath= /vs
server.port= 8087
#Propertis name(name of name-profile-lable.yml)
spring.application.name= vs
#1.Read Remote Config
spring.cloud.config.uri= http://localhost:8086
#Profile(configed value to default or dev or test or prod and so on)
# is come from propertis name(profile of name-profile-lable.yml)
spring.cloud.config.profile: default
// ==============高可用多庫配置說明(服務端)==================
info:
component: Config Server
management:
context_path: /admin
server:
port: 8888
spring:
cloud:
config:
server:
svn:
password: oyyl
uri: https://192.168.110.44/svn/config-repos // 只支持HTTP、HTTPS其它協議測試未通過
username: oyyl
default-label: branches // 默認使用分支
searchPaths: configs/test //多級目錄表示
cloneOnStart: true // 啓動裏複製到本地服務器
repos:... //多庫配置
profiles:
active: subversion //表示使用SVN, 默認使用git
【注意】uri 指定repos根目錄即可,否則無法找到文件
SVN:
default-label: trunk/branches
GIT:
default-label: master/branches
YMLinfo:
component: Config Server
management:
context_path: /admin
server:
port: 8888
spring:
cloud:
config:
server:
svn:
password: oyyl
uri: https://192.168.110.44/svn/config-repos // 默認配置庫
username: oyyl
default-label: branches
searchPaths: configs
repos:
vs1:
pattern: vs1* // 此配置只匹配application, 如果爲 vs1/* ,則匹配profiles
uri: https://192.168.110.44/svn/config-repos // 配置庫1
password: oyyl
username: oyyl
default-label: branches
searchPaths: configs
vs2:
pattern: vs2*
uri: https://192.168.110.44/svn/config-repos // 配置庫2
password: oyyl
username: oyyl
default-label: branches
searchPaths: configs
profiles:
active: subversion
// 啓動管理接口,如refresh 等,需要spring-boot-starter-actuatorr
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
客戶端通過@Value({"key"})實現讀取屬性,只支持實例屬性,不支持類靜態屬性賦值