在《4.7 Eureka Server的高可用》中,我們構建了一個雙節(jié)點的Eureka Server集群,本節(jié)我們使用Compose來編排這個Eureka Server集群。該雙節(jié)點的Eureka配置如下:
spring:
application:
name: microservice-discovery-eureka-ha
---
spring:
profiles: peer1 # 指定profile=peer1
server:
port: 8761
eureka:
instance:
hostname: peer1 # 指定當profile=peer1時,主機名是peer1
client:
serviceUrl:
defaultZone: http://peer2:8762/eureka/ # 將自己注冊到peer2這個Eureka上面去
---
spring:
profiles: peer2
server:
port: 8762
eureka:
instance:
hostname: peer2
client:
serviceUrl:
defaultZone: http://peer1:8761/eureka/
以下是步驟:
(1) 執(zhí)行mvn clean package docker:build 構建Docker鏡像。
(2) 編寫docker-compose.yml,如下
version: "2" # 表示使用docker-compose.yml的Version 2 file format編寫
services:
microservice-discovery-eureka-ha1:
hostname: peer1 # 指定hostname
image: itmuch/microservice-discovery-eureka-ha:0.0.1-SNAPSHOT
links:
- microservice-discovery-eureka-ha2
ports:
- "8761:8761"
environment:
- spring.profiles.active=peer1
microservice-discovery-eureka-ha2:
hostname: peer2
image: itmuch/microservice-discovery-eureka-ha:0.0.1-SNAPSHOT
links:
- microservice-discovery-eureka-ha1
ports:
- "8762:8762"
environment:
- spring.profiles.active=peer2
從文件內(nèi)容我們可以看到,我們定義了兩個服務:microservice-discovery-eureka-ha1和microservice-discovery-eureka-ha2,它們的hostname分別是peer1和peer2。然后通過links標簽相互連接。
(3) 執(zhí)行
docker-compose up
命令啟動。然而,控制臺會輸出類似以下的異常:
ERROR: Circular dependency between microservice-discovery-eureka-ha1 and microservice-discovery-eureka-ha2
從異常可知,發(fā)生了循環(huán)依賴。如何解決這個問題呢?
解決循環(huán)依賴
該問題有很多解決方案,例如使用ambassador pattern,使用外部的DNS容器等,本節(jié)用多個容器共享一個網(wǎng)絡的方式解決該問題,以下是配置:
version: "2"
services:
peer1: # 默認情況下,其他服務可以使用服務名稱連接到該服務。因此,對于peer2的節(jié)點,它需要連接http://peer1:8761/eureka/,因此需要配置該服務的名稱是peer1。
image: itmuch/microservice-discovery-eureka-ha:0.0.1-SNAPSHOT
networks:
- eureka-net
ports:
- "8761:8761"
environment:
- spring.profiles.active=peer1
peer2:
image: itmuch/microservice-discovery-eureka-ha:0.0.1-SNAPSHOT
hostname: peer2
networks:
- eureka-net
ports:
- "8762:8762"
environment:
- spring.profiles.active=peer2
networks:
eureka-net:
driver: bridge
參考文檔
(1) 解決循環(huán)依賴的總結:http://www.dockone.io/article/929
(2) ambassador pattern官方介紹:https://docs.docker.com/engine/admin/ambassador_pattern_linking/
(3) StackOverflow上對該問題的深入探討:http://stackoverflow.com/questions/29307645/how-to-link-docker-container-to-each-other-with-docker-compose
(4)Github上的相關Issue: https://github.com/docker/compose/issues/666
本文首發(fā)
http://www.itmuch.com/docker-compose-eureka-ha/
干貨分享
