簡體   English   中英

微服務使用Eureka和traefik和docker compose進行服務發現

[英]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

traefik配置:

檔案: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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM