[英]Micro services Service discovery using Eureka and traefik with docker compose
Traefik的假人問題。 我正在嘗試使用traefik作為反向代理使用docker compose設置Spring Cloud Micro服務。
我的目標是微服務應通過服務名稱(例如:service-registry-app)相互通信,traefik應將其解析為ip地址。 一旦在本地框中運行,我想擴展它以在AWS ECS上運行。
我已經使用創建了ana_network
docker network create ana_network
檔案:docker-compose.yml
version: '2'
services:
proxy:
image: traefik
command: --api --docker --docker.domain=docker.localhost --logLevel=DEBUG
networks:
- ana_network
ports:
- "80:80"
- "8080:8080"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /dev/null:/traefik.toml
networks:
ana_network:
driver: bridge
檔案:docker-compose.yml
version: '2'
services:
service-registry:
image: sqshq/piggymetrics-registry
restart: always
networks:
- web
expose:
- "8761"
labels:
- "traefik.backend=service-registry-app"
- "traefik.frontend.rule=Host:service-registry-app.example.com"
environment:
CONFIG_SERVICE_PASSWORD: $CONFIG_SERVICE_PASSWORD
config-server:
image: sqshq/piggymetrics-config
restart: always
networks:
- web
expose:
- "8888"
depends_on:
- service-registry
environment:
EUREKA_HOST: service-registry-app.example.com
EUREKA_PORT: 8761
CONFIG_SERVICE_PASSWORD: $CONFIG_SERVICE_PASSWORD
labels:
- "traefik.backend=config-server-app"
- "traefik.frontend.rule=Host:config-server-app.example.com"
networks:
web:
external:
name: ana_network
我可以使用curl訪問服務注冊表應用程序
curl -H Host:service-registry-app.example.com http://172.21.0.2:8761
但是配置服務器和api網關無法通過docker compose和traefik訪問具有上述配置的服務注冊表。
為了使所有微服務能夠相互發現,我需要做哪些更改?如何擴展它以使其在ECS上工作?
EDIT1:
糾正了將網絡部分從服務移動到網絡的縮進,這是一個錯字。
我是容器和分布式系統的新手,因此我可能會問一些幼稚的顯而易見的問題,因此如果對任何假人進行traefik會很有幫助,那將是很好的。
以下是我目前面臨的兩個問題,
1)容器到容器的通信-示例,容器2(此示例中的配置服務器)應如何通過服務名稱(如service-registry)或任何其他方式與容器1(服務注冊表)進行通信,以及如何從容器中訪問這些容器外部世界(在這種情況下是服務注冊中心)?
2)對其進行擴展以使其在ECS中工作,因此每個容器都有自己的任務定義並在ECS群集內作為服務運行-在這種情況下,容器如何使用traefik相互通信?
您的容器到容器網絡似乎在多個地方損壞。 使用traefik撰寫文件,您可以定義一個網絡,但不要將其標記為外部,這樣撰寫文件將創建一個${project}_ana_network
網絡,而其他項目則看不到該網絡。 通過使用以下命令將其標記為外部來解決此問題:
networks:
ana_network:
external:
name: ana_network
在第二個撰寫文件中,您定義了一個Web服務,該服務看起來像您正在嘗試定義一個Web網絡,而這似乎是由於不正確地縮進“網絡”引起的。 老實說,我不知道該如何運行,因為不存在“網絡”網絡供您其他服務使用。
對於traefik集成,我更喜歡不定義后端名稱,而指定網絡名稱和端口,因此traefik知道在容器上定義多個網絡或端口的情況下如何連接到容器。
結果如下所示:
version: '2'
services:
service-registry:
image: sqshq/piggymetrics-registry
restart: always
networks:
- web
expose:
- "8761"
labels:
- "traefik.frontend.rule=Host:service-registry-app.example.com"
- "traefik.docker.network=ana_network"
- "traefik.port=8761"
environment:
CONFIG_SERVICE_PASSWORD: $CONFIG_SERVICE_PASSWORD
config-server:
image: sqshq/piggymetrics-config
restart: always
networks:
- web
expose:
- "8888"
depends_on:
- service-registry
environment:
EUREKA_HOST: service-registry-app.example.com
EUREKA_PORT: 8761
CONFIG_SERVICE_PASSWORD: $CONFIG_SERVICE_PASSWORD
labels:
- "traefik.backend=config-server-app"
- "traefik.frontend.rule=Host:config-server-app.example.com"
networks:
web:
external:
name: ana_network
最后,我還沒有安裝Eureka安裝程序,但是如果您想讓容器直接通過容器網絡進行通訊,我建議使用:
EUREKA_HOST: service-registry
指定用traefik列出的地址將把請求發送到docker之外,以通過traefik再次進入,從而增加不必要的躍點。
如果您需要將EUREKA_HOST設置為外部名稱,但仍想使用容器到容器網絡,則可以配置網絡別名:
services:
service-registry:
...
networks:
web:
aliases:
- "service-registry-app.example.com"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.