高可用HA(High Availability)是分佈式系統架構設計中必須考慮的因素之一,它一般是指,經過設計減小系統不能提供服務的時間.前端
1)假設系統一直可以提供服務,咱們說系統的可用性是100%.java
2)若是系統每運行100個時間單位,會有1個時間單位沒法提供服務,咱們說系統的可用性是99%.git
舉個例子,百度的搜索首頁是業界公認的高可用保障很是出色的系統
咱們一般會經過ping baidu.com來判斷網絡是否通暢,這也恰巧說明了百度首頁的可用性很是之高,值得信賴.github
1.主從複製: 主服務掛掉後,從服務升級爲主服務繼續工做.web
2.雙機熱備: 一臺工做,一臺備用,工做服務器掛掉後,備用服務器繼續工做.算法
3.分佈式集羣: 多臺實例同時工做,當其中一臺掛掉後,前端或者代理踢出這臺服務器,負載均衡算法將再也不調度它.spring
Config Server 的高可用方案,是藉助Eureka(註冊中心)實現的,也就是上面提到的分佈式集羣方案.
多個Config Server同時工做,任何一臺掛掉後,Eureka服務器都會通知客戶端, 客戶端後續將再也不從這裏請求配置信息.bootstrap
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency>
# 將配置中心註冊到eureka實現高可用 eureka: instance: hostname: fastjee-config.com # 更改eureka更新頻率, 關閉eureka的自我保護機制. leaseRenewalIntervalInSeconds: 10 # 租期更新時間間隔(默認30秒) leaseExpirationDurationInSeconds: 30 # 租期到期時間(默認90秒) client: serviceUrl: defaultZone: https://fastjee:123456@fastjee-registration.com:5000/eureka/ healthcheck: enabled: true # 開啓健康檢查(須要spring-boot-starter-actuator依賴)
這裏更改了eureka的自我保護機制, 爲了方便後面的測試, 即時剔除無效服務器.
添加@EnableDiscoveryClient註解, 標識該服務爲eureka客戶端.服務器
@EnableConfigServer @EnableDiscoveryClient @SpringBootApplication(scanBasePackages = {"com.fastjee.common.web","com.fastjee.config"}) public class ConfigApplication { public static void main(String[] args) { SpringApplication.run(ConfigApplication.class, args); } }
@EnableDiscoveryClient能夠替換爲@EnableEurekaClient,但後者使用場景比較單一,不兼容其它類型的註冊中心.
在測試前, 創建測試用的Config Clinet項目;網絡
將配置文件fastjee-config-server-test-dev.yml push到由configServer指定的github倉庫.
config-test: sayHello: HelloWorld!
pom.xml
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
bootstrap.yml
spring: profiles: active: dev application: name: fastjee-config-server-test # 從配置中心拉取配置, 其餘配置文件都在git倉庫上 cloud: config: fail-fast: true discovery: service-id: fastjee-config enabled: true label: master profile: ${spring.profiles.active} name: ${spring.application.name} # 註冊到註冊中心 eureka: instance: hostname: fastjee-config-server-test.com client: serviceUrl: defaultZone: https://fastjee:123456@fastjee-registration.com:5000/eureka/
測試RESTFul接口.
@Value("${config-test.sayHello}") private String sayHello; @GetMapping("/sayHello") public @ResponseBody ResponseEntity<String> sayHello() { return ResponseEntity.ok(sayHello); }
啓動後的效果圖以下:
這裏再也不寫文字性的描述, 看圖便可.