Spring Cloud Config & HA

何爲高可用?

高可用HA(High Availability)是分佈式系統架構設計中必須考慮的因素之一,它一般是指,經過設計減小系統不能提供服務的時間.前端

1)假設系統一直可以提供服務,咱們說系統的可用性是100%.java

2)若是系統每運行100個時間單位,會有1個時間單位沒法提供服務,咱們說系統的可用性是99%.git

舉個例子,百度的搜索首頁是業界公認的高可用保障很是出色的系統
咱們一般會經過ping baidu.com來判斷網絡是否通暢,這也恰巧說明了百度首頁的可用性很是之高,值得信賴.github

高可用的實現方式

1.主從複製: 主服務掛掉後,從服務升級爲主服務繼續工做.web

2.雙機熱備: 一臺工做,一臺備用,工做服務器掛掉後,備用服務器繼續工做.算法

3.分佈式集羣: 多臺實例同時工做,當其中一臺掛掉後,前端或者代理踢出這臺服務器,負載均衡算法將再也不調度它.spring

Config Server高可用的實現

Config Server 的高可用方案,是藉助Eureka(註冊中心)實現的,也就是上面提到的分佈式集羣方案.
多個Config Server同時工做,任何一臺掛掉後,Eureka服務器都會通知客戶端, 客戶端後續將再也不從這裏請求配置信息.bootstrap

1. 將Config Server註冊到Eureka

pom.xml

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

application.yml

# 將配置中心註冊到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的自我保護機制, 爲了方便後面的測試, 即時剔除無效服務器.

ConfigApplication.java

添加@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,但後者使用場景比較單一,不兼容其它類型的註冊中心.

2. 測試

在測試前, 創建測試用的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);
}

開始測試

啓動相關服務:

  1. Eureka Server
  2. Config Server (同時啓動兩個 => port: 5001, port: 5009)
  3. 測試客戶端

啓動後的效果圖以下:

測試步驟:

  1. 當configServer:5001,configServer:5009同時正常工做時,測試客戶端能夠啓動並拉取配置.
  2. 屢次啓動測試客戶端,觀察拉取配置的服務器是否在5001/5009之間負載均衡.
  3. 將configServer:5009實例下線, 測試客戶端依然能夠正常啓動,且接口訪問正常.
  4. 將configServer所有下線, 測試客戶端啓動失敗.

測試效果

這裏再也不寫文字性的描述, 看圖便可.

相關文章
相關標籤/搜索