在《4.7 Eureka Server的高可用》中德谅,我們構(gòu)建了一個雙節(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
構(gòu)建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)容我們可以看到浸策,我們定義了兩個服務(wù):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)絡(luò)的方式解決該問題句旱,以下是配置:
version: "2"
services:
peer1: # 默認情況下,其他服務(wù)可以使用服務(wù)名稱連接到該服務(wù)晰奖。因此谈撒,對于peer2的節(jié)點,它需要連接http://peer1:8761/eureka/匾南,因此需要配置該服務(wù)的名稱是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)依賴的總結(jié):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上的相關(guān)Issue: https://github.com/docker/compose/issues/666
本文首發(fā)
http://www.itmuch.com/docker-compose-eureka-ha/