Spring Cloud之Configuration Server

爲什麼用spring cloud config 寫道
一個Application中不只是代碼,還需要連接資源和其它應用,經常有很多需要外部設置的項去調整Application行爲,如切換不同的數據庫,i18n國際化 等.應用中的會經常見到的xml,properties,yaml等就是配置信息.
常見的實現信息配置的方法:
● 硬編碼(缺點:需要修改代碼,風險大)
● 放在xml等配置文件中,和應用一起打包(缺點:需要重新打包和重啓)
● 文件系統中(缺點:依賴操作系統等)
● 環境變量(缺點:有大量的配置需要人工設置到環境變量中,不便於管理,且依賴平臺)
● 雲端存儲(缺點:與其他應用耦合)Spring Cloud Config 就是雲端存儲配置信息的,它具有中心化,版本控制,支持動態更新,平臺獨立,語言獨立等特性.
真正的數據存在Git等repository中,Config Server去獲取相應的信息,然後開發給Client Application,相互間的通信基於HTTP,TCP,UDP等協議.微服務框架落地雲平臺,如果配置文本地化,將來多實例化後,極難維護。

 // =================配置倉庫(git/svn/native)=================

 
屬性文件屬名
格式:name-profile.properties/yml,例如:
vs-dev.properties
vs-test.properties
vs-prod.properties
 
倉庫創建
// =================MAVEN(項目構建)=================
服務端
<?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
 
 驗證
 
http://localhost:8086/name/profiles/label
http://localhost:8086/name-profiles.properties/http://localhost:8086/name-profiles.yml,如下:
http://localhost:8086/vs-dev.yml
 
 客戶端
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端及讀取屬性文件
如:讀取環境文件有:
vs.properties
vs-dev.properties
vs-test.properties
配置說明:
spring.application.name 爲屬性文件name片段
spring.cloud.config.profile 爲屬性文件profile片段
spring.cloud.config.uri 爲config server端
如讀取開發環境配置文件vs-dev.properties,則按如下配置:
spring.application.name=vs
spring.cloud.config.profile=dev
如果profile=default,則讀取vs.properties屬性文件
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
 YML
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  // 默認配置庫
          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
 
  目前實現遠程倉庫配置文件修改後,需要調用客戶的Endpoint接口,進行手動刷新屬性值,下面就是啓動Endpoint管理接口
// 啓動管理接口,如refresh 等,需要spring-boot-starter-actuatorr
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
 
 
客戶端通過@Value({"key"})實現讀取屬性,只支持實例屬性,不支持類靜態屬性賦值
 
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章