本篇來實現一個高可用版的服務註冊中心。在線上環境中,使用高可用是最基本的要求,如果有單點故障的時候,不至於整個服務都無響應。
這裡的高可用包括註冊中心的高可用,服務提供者註冊到服務中心集群上,這樣服務消費者發現服務的時候就通過集群來實現,不會出現註冊中心不可用,造成整個系統崩潰。
還包括服務提供者的高可用,一個服務提供者註冊多個實例到註冊中心,這樣,即時有其中某個實例 down 掉,其他實例依然可以提供服務。
高可用服務註冊發現中心
下圖是 Eureka 官方提供的高可用架構圖。
![Spring Cloud Eureka 實現高可用服務發現註冊中心](http://p2.ttnews.xyz/loading.gif)
![eureka 架構圖]
1、創建註冊中心,重點在於配置文件
bootstrap.yml 配置如下:
<code>spring:
application:
name:eureka-ha-center##設置應用的名稱
cloud:
inetutils:
ignoredInterfaces:
-docker0
-veth.*
-VM.*
preferredNetworks:
-192.168/<code>
application.yml 配置如下:
<code>spring:
profiles:eureka-center1
server:
port:1989
eureka:
instance:
hostname:ha-eureak-center1
appname:註冊中心
client:
registerWithEureka:true
fetchRegistry:true
serviceUrl:
defaultZone:http://localhost:1988/eureka##註冊到eureka-center2上,端口1988
---
spring:
profiles:eureka-center2
server:
port:1988
eureka:
instance:
hostname:ha-eureak-center2
appname:註冊中心
client:
registerWithEureka:true
fetchRegistry:true
serviceUrl:
/<code>
通過 profiles 參數,稍後在啟動的時候根據 vm 參數決定啟用配置。
client.registerWithEureka 和 client.registerWithEureka 設置為 true,表示要註冊到 eureka 。單點模式中設置為 false。高可用版本要允許註冊到 eureka 。注意:eureka-center1 和 eureka-center2 的 serviceUrl.defaultZone 是互相註冊的。
2、啟動應用。
-通過設置 vm 參數 -Dspring.profiles.active=eureka-center1 在 1989 端口啟動註冊中心1
-通過設置 vm 參數 -Dspring.profiles.active=eureka-center2 在 1988 端口啟動註冊中心2。
之後訪問 http://localhost:1988 或 http://localhost:1989 都能進入 eureka ui 界面,並且能看到註冊到自身的eureka 服務。
![Spring Cloud Eureka 實現高可用服務發現註冊中心](http://p2.ttnews.xyz/loading.gif)
2、創建高可用的服務提供者,並註冊到上面的兩個註冊中心
application.yml 配置如下:
<code>spring:
profiles:ha-provider1
application:
name:ha-provider
security:
user:
name:root
password:root
server:
port:1990
eureka:
instance:
preferIpAddress:true
client:
serviceUrl:
defaultZone:http://localhost:1989/eureka,http://localhost:1988/eureka
---
spring:
profiles:ha-provider2
application:
name:ha-provider
security:
user:
name:root
password:root
server:
port:1991
eureka:
instance:
preferIpAddress:true
client:
serviceUrl:
defaultZone:http://localhost:1989/eureka,http://localhost:1988/eureka/<code>
同樣利用 profiles 區分兩個服務提供者。
注意,defaultZone 設置了上面啟動的兩個註冊中心服務,中間用逗號隔開。
之後設置 vm 參數 -Dspring.profiles.active=ha-provider1 啟動第一個服務提供者,設置 vm 參數 -Dspring.profiles.active=ha-provider2 啟動第二個服務提供者。
之後打開 eureka ui 界面,看到已經註冊到註冊中心
3、創建服務消費者
application.yml 配置:
<code>spring:
application:
name:ha-customer
server:
port:1992
eureka:
client:
serviceUrl:
defaultZone:http://localhost:1989/eureka,http://localhost:1988/eureka
instance:
preferIpAddress:true
複製代碼/<code>
啟動服務消費者
通過訪問 http 接口,查看服務是否可用,通過日誌可以看出每次調用有可能負載到不同的服務提供者實例上。
4、停掉一個服務提供者。
訪問 http 接口,不影響服務,會自動負載到正常的服務提供者實例上。
5、停掉一個註冊中心實例。
訪問 http 接口,仍然不受影響。
作者:古時的風箏
鏈接:https://juejin.im/post/5e1bd14351882526953670fd
閱讀更多 妖精的雜七雜八 的文章