本文共 1591字,閱讀大約需要 6分鐘 !
概述
業務微服務化以後,我們要求服務高可用,於是我們可以部署多個相同的服務實例,並引入負載均衡機制。而微服務註冊中心作爲微服務化系統的重要單元,其高可用也是非常必要的,因此在生產中我們可能需要多個微服務註冊中心實例來保證服務註冊中心的穩定性。本文就以 Eureka微服務註冊中心爲例,來實踐一下如何 在線擴充 Eureka Server實例來保證 微服務註冊中心的高可用性!
注: 本文首發於 My Personal Blog,歡迎光臨 小站
本文內容腦圖如下:
原理與實驗流程介紹
我們欲模擬如下過程:
首先啓動一個 eureka-server實例(eureka-server-1)
再啓動一個 eureka-client實例(eureka-client-1)並註冊到 eureka-server-1中
接下來我們啓動第二個 eureka-server實例:eureka-server-2,並且讓已啓動的 eureka-server-1 和 eureka-client-1在不重啓的情況下來感知到 eureka-server-2的加入
同理我們可以在啓動第三個 eureka-server實例:eureka-server-3,並且讓已啓動的 eureka-server-1 、eureka-server-2 和 eureka-client-1 在不重啓的情況下來感知到 eureka-server-3的加入
更多 eureka-server實例的加入原理完全相同,不再贅述
這樣一來我們便實現了微服務註冊中心的動態在線擴容!
而如何才能讓已啓動的服務能夠在不重啓的情況下來感知到新的 eureka-server 的加入呢?
爲此我們引入 Spring Cloud Config 配置中心 config-server,並將 eureka-server和 eureka-client服務的配置文件由 config-server進行統一管理,這樣一來對配置文件的修改如果可以通過某種機制來通知已啓動的服務,那麼問題便迎刃而解了!
我們給出整個過程的原理圖如下:
接下來我們來實踐這整個過程!
基礎工程搭建
- 創建一個 config-server工程
pom中關鍵依賴如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
主類添加相應註解:
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
...
}
bootstrap.yml配置文件如下:
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://github.com/hansonwang99/xxxx
username: xxxx
password: xxxx
server:
port: 1115
該 yml配置很重要,其連接了預先準備好的 git倉庫,後續 eureka-server 和 eureka-client 的配置文件都是存於該git倉庫中的!
- 創建一個 eureka-server工程
pom中關鍵依賴如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
主類添加相應註解:
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
...
}
bootstrap.yml重要配置如下:
spring:
application:
name: eureka-server
cloud:
config:
uri: http://localhost:1115
注意該 yml中關於 spring cloud config 的配置同樣非常重要,因爲此 eureka-server需要從 config-server中拉取配置!
最後我們還需要添加一個 controller便於測試:
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
EurekaClientConfigBean eurekaClientConfigBean;
@GetMapping("/eureka-service-info")
public Object getEurekaServerUrl(){
return eurekaClientConfigBean.getServiceUrl();
}
}
這個 Rest Controller 接口的意圖很簡單:打印出當前到底有多少個 eureka-server實例在提供服務(從而可以直觀的判斷出 eureka-server的擴容是否已經成功)
- 創建一個 eureka-client工程
pom中關鍵依賴如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
主類添加相應註解:
@SpringBootApplication
@EnableDiscoveryClient
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
bootstrap.yml 重要配置如下:
spring:
application:
name: eureka-client
cloud:
config:
uri: http://localhost:1115
這裏基本同上面 eureka-server的配置,不再贅述
同樣,我們也在 eureka-client中添加一個 controller便於測試:
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
EurekaClientConfigBean eurekaClientConfigBean;
@GetMapping("/eureka-service-info")
public Object getEurekaServerUrl(){
return eurekaClientConfigBean.getServiceUrl();
}
}
三個工程的創建到此完畢!下來我們來依次啓動各個工程
首先啓動 config-server工程
然後用 peer1配置文件來啓動 第一個eureka server,指令如下:
mvn spring-boot:run -Dspring.profiles.active=peer1
啓動過程的開始打印出如下信息,一目瞭然:
當然這個 peer1配置文件實際物理存在於git倉庫之上:
- 接下來我們啓動 eureka_client工程,指令如下:
mvn spring-boot:run -Dspring.profiles.active=peer1
其依然需要通過 spring cloud config 去git倉庫拉取 eureka-client的 peer1配置文件,這一點從 eureka-client的啓動過程中也能看到:
- 接下來我們用瀏覽器訪問僅存在的一個 eureka-server微服務註冊中心,可以看到有服務已經註冊上去了:
既然 config-server / eureka-server / eureka-client 三個服務已經啓動了,那麼接下來我們來測試一下:
瀏覽器訪問 eureka-client的 Rest接口:localhost:1114/test/eureka-service-info
:
同理,瀏覽器訪問 eureka-server的 Rest接口:localhost:1111/test/eureka-service-info
:
OK,一切正常,但目前微服務註冊中心僅一個 eureka-server實例,下來我們來 在線動態擴容微服務註冊中心實例。
擴充一次 Eureka Server
接下來我們再用 peer2配置文件來 啓動第二個 eureka server,指令如下:
mvn spring-boot:run -Dspring.profiles.active=peer2
啓動完畢後,瀏覽器訪問微服務註冊中心第一個實例 eureka-server-1:localhost:1111/
發現第二個微服務註冊中心實例 eureka-server-2已經成功啓動並加入
爲了讓已啓動的 eureka-client和 eureka-server-1能在線感知到 eureka-server-2的加入,此時我們需要修改兩個地方:
- 修改 Git上eureka-client的配置文件:
server:
port: 1114
spring:
application:
name: eureka-client
eureka:
client:
serviceUrl:
defaultZone: http://localhost:1111/eureka/,http://localhost:1112/eureka/ # 此處改爲包含兩個eureka-server
- 修改 Git上第一個eureka-server(eureka-server-1)的配置文件:
server:
port: 1111
spring:
application:
name: eureka-server
eureka:
instance:
hostname: localhost
preferIpAddress: true
client:
registerWithEureka: true
fetchRegistry: true
serviceUrl:
defaultZone: http://localhost:1112/eureka/ # 此處改爲第二個eureka-server地址
server:
waitTimeInMsWhenSyncEmpty: 0
enableSelfPreservation: false
Git倉庫裏配置文件的修改完畢並不能觸發已啓動的 eureka-client和 eureka-server-1 在線更新,我們還需要向 eureka-client服務和 eureka-server-1服務來 POST兩個請求來激活剛纔所修改的配置:
POST localhost:1111/actuator/refresh // 激活 eureka-client服務的配置
POST localhost:1114/actuator/refresh // 激活 eureka-server-1 服務的配置
POST請求一旦發出,我們從控制檯裏能直觀看到更新配置文件的詳情:
配置文件更新完畢,瀏覽器再次訪問 eureka-client的 Rest接口:localhost:1114/test/eureka-service-info
:
再擴充一次 Eureka Server
接下來還可以再用 peer3配置文件來啓動第三個 eureka server加入高可用微服務註冊中心集羣,過程和上面類似,此處不再贅述!當然更多 eureka-server實例的擴充原理也相同。
後記
由於能力有限,若有錯誤或者不當之處,還請大家批評指正,一起學習交流!
- My Personal Blog:CodeSheep 程序羊
- 我的半年技術博客之路