走進Spring Cloud之九 高可用配置中心(Greenwich版本)
走進Spring Cloud之九 高可用配置中心(Greenwich版本)
Config假如Eureka服務治理
前面我們演示的案例是我們有一個Config Server 和一個 Config Client ,我們的Config Client直接從Config Server讀取配置,這裡九存在一個比較嚴重的耦合問題,假如我們的單一的Config Server掛掉了的IP或者埠變化了,我們Config Client將無法讀取配置。這裡我們也可以將Config Server作為一個普通的微服務應用,納入Eureka的服務治理體系中。這樣我們的微服務應用就可以通過配置中心的服務名來獲取配置資訊,這種方式比起傳統的實現模式來說更加有利於維護,因為對於服務端的負載均衡配置和客戶端的配置中心指定都通過服務治理機制一併解決了,既實現了高可用,也實現了自維護。
註冊config-server
pom.xml
新增spring-cloud-starter-netflix-eureka-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" >
<parent>
<artifactId>scexample</artifactId>
<groupId>com.pubutech</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>config-server</artifactId>
<packaging>jar</packaging>
<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-client</artifactId>
</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
修改application.yml增加eureka註冊中心資訊
server:
port: 8888
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://github.com/Jaysong2012/scexample # 配置git倉庫的地址
search-paths: springcloud-config-repo # git倉庫地址下的相對地址,可以配置多個,用,分割。
username: # git倉庫的賬號(私有庫必填)
password: # git倉庫的密碼(私有庫必填)
label: master #配置倉庫的分支
eureka:
client:
service-url:
#設定與Eureka Server互動的地址,查詢服務和註冊服務都需要依賴這個地址。預設是http://localhost:8761/eureka ;多個地址可使用 , 分隔。
defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/,http://localhost:8763/eureka/
ConfigServerApplication.java
修改ConfigServerApplication啟用註冊
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableConfigServer
//啟用註冊發現
@EnableDiscoveryClient
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
啟動測試
訪問http://localhost:8761/
config-client發現
pom.xml
修改pom.xml增加spring-cloud-starter-netflix-eureka-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">
<parent>
<artifactId>scexample</artifactId>
<groupId>com.pubutech</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>config-client</artifactId>
<packaging>jar</packaging>
<dependencies>
<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>
<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>
bootstrap.yml
修改bootstrap.yml去掉spring.cloud.config.uri遠端server的地址,並且添加註冊中心的配置。
spring:
cloud:
config:
name: springcloud-config #對應{application}部分
profile: pro #對應{profile}部分
#uri: http://localhost:8888/ #配置中心的具體地址
label: master #對應git的分支。如果配置中心使用的是本地儲存,則該引數無用
discovery:
service-id: config-server #指定配置中心的service-id,便於擴充套件為高可用配置叢集。
enabled: true #開啟Config服務發現支援
eureka:
client:
service-url:
#設定與Eureka Server互動的地址,查詢服務和註冊服務都需要依賴這個地址。預設是http://localhost:8761/eureka ;多個地址可使用 , 分隔。
defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/,http://localhost:8763/eureka/
ConfigClientApplication.java
修改ConfigClientApplication.java啟用註冊發現
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
//啟用註冊發現
@EnableDiscoveryClient
public class ConfigClientApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication.class, args);
}
}
啟動測試
訪問http://localhost:8761/
此時訪問http://localhost:8889/writer
訪問成功,讀取遠端配置。
高可用與負載均衡
同zuul的負載均衡一樣,單個config-server容易出現故障,我們可以建立啟動多個config-server來避免這個問題。
application-bakcup.yml
案例演示,我們可以在config-server的resources的目錄下新建application-bakcup.yml
server:
port: 8887
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://github.com/Jaysong2012/scexample # 配置git倉庫的地址
search-paths: springcloud-config-repo # git倉庫地址下的相對地址,可以配置多個,用,分割。
username: # git倉庫的賬號(私有庫必填)
password: # git倉庫的密碼(私有庫必填)
label: master #配置倉庫的分支
eureka:
client:
service-url:
#設定與Eureka Server互動的地址,查詢服務和註冊服務都需要依賴這個地址。預設是http://localhost:8761/eureka ;多個地址可使用 , 分隔。
defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/,http://localhost:8763/eureka/
啟動測試
java -jar config-server-0.0.1-SNAPSHOT.jar
java -jar config-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=backup
訪問http://localhost:8761/
此時 我們關閉8888 config-server
訪問http://localhost:8761/
此時訪問http://localhost:8889/writer