WebAPI 接口中有兩大類業務,當然根據具體情況可以是若干類。例如:workflow 和 interface,分別代表流程平臺和接口平臺。
在集群部署模式下,可以根據不同的路由分配到不同的節點。例如:一共部署了 10 個節點,workflow 分布式到其中的 3 個節點,interface 分布式到其余的 7 個節點。
這種方式的好處就是對于只有單一技術棧的團隊,在物理上可以將代碼組織在一起,方便維護,但在邏輯上可以將不同的業務分開,實現動態擴展和彈性。
當然上面的需求使用 nginx 也可以很容易做到,但本文采用的是 Tr?f?k ,先來看看 Tr?f?k 和 nginx 的區別。
Traefik 和 Nginx 都是反向代理工具,但它們在設計和使用場景上存在一些區別。下面簡要比較一下這兩者:
Traefik 使用 docker-compose 進行部署,部署前先創建一個 docker 網絡:
docker network create traefik-net
創建一個 traefik-demo 的目錄,目錄中創建 docker-compose.yml 文件,用來構建一個 Traefik 容器。
version: "3"services: traefik: image: traefik:v3.0.0-rc2 restart: always ports: - 80:80 volumes: - /var/run/docker.sock:/var/run/docker.sock command: - "--api=true" - "--api.dashboard=true" - "--api.insecure=true" - "--entrypoints.http.address=:80" - "--providers.docker=true" labels: - "traefik.http.routers.traefik-dashboard.entrypoints=http" - "traefik.http.routers.traefik-dashboard.rule=Host(`traefik.fw.com`)" - "traefik.http.routers.traefik-dashboard.service=dashboard@internal" - "traefik.http.routers.traefik-dashboard-api.entrypoints=http" - "traefik.http.routers.traefik-dashboard-api.rule=Host(`traefik.fw.com`) && PathPrefix(`/api`)" - "traefik.http.routers.traefik-dashboard-api.service=api@internal" networks: - traefik-net networks: traefik-net: external: true name: traefik-net
通過在 Docker Labels 中添加了聲明式的路由,分別將 Dashboard 的網頁(路由名稱 traefik-dashboard )和 API (路由名稱 traefik-dashboard-api )注冊在了我們創建的 http 網絡入口上,用戶就可以通過我們設置的域名來訪問服務了。
上面的配置中有一個域名:traefik.fw.com ,這是我本地測試使用的域名,正式環境替換為真實域名即可。本地測試可以通過修改 hosts 文件的方式:
cd /etc/sudo chmod 777 hostsvi hosts
添加映射:
127.0.0.1 traefik.fw.com
在 traefik-demo 目中中執行 docker-compose up -d traefik 來構建 Traefik 服務,執行成功后,在瀏覽器中訪問:traefik.fw.com ,可以看到如下界面:
可以看到 Services 有 10 個,其中包含了我本機上部署的其他的 docker 容器。
使用官方的測試容器來進行測試,修改 docker-compose.yml 文件,在下面添加如下內容:
whoami: image: containous/whoami labels: - "traefik.enable=true" - "traefik.http.routers.whoami.rule=Host(`whoami.fw.com`)" - "traefik.http.services.whoami.loadbalancer.server.port=80" networks: - traefik-net
執行 docker-compose up -d whoami 進行構建,構建成功后,命令行執行:curl -H Host:whoami.fw.com http://127.0.0.1。
現在使用命令:docker-compose up -d --scale whoami=2 對 whoami 服務進行擴容,創建成功后,再使用:curl -H Host:whoami.fw.com http://127.0.0.1 進行測試,會發現已經在兩個容器間進行負載了:
使用 C# 編寫 WebAPI 接口,創建兩個 Controller 模擬兩個不同的業務,InterfaceCenterController 和 WorkflowController ,代碼如下:
[ApiController] [Route("[controller]")] public class WorkflowController : ControllerBase { [HttpGet()] public string Test() { string ip = Request.HttpContext.Connection.LocalIpAddress.MapToIPv4().ToString() + ":" + Request.HttpContext.Connection.LocalPort.ToString(); return $"workflow server,{ip}"; } } [ApiController] [Route("[controller]")] public class InterfaceCenterController : ControllerBase { [HttpGet()] public string Test() { string ip = Request.HttpContext.Connection.LocalIpAddress.MapToIPv4().ToString() + ":" + Request.HttpContext.Connection.LocalPort.ToString(); return $"interfaceCenter server,{ip}"; } }
代碼寫好后,進行發布,在發布目錄中創建 Dockerfile 文件,內容如下:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1COPY . /appWORKDIR /appEXPOSE 80/tcpENTRYPOINT ["dotnet", "ApiDemo.dll"]
執行下面命令進行鏡像構建:
docker build -t apidemo .
修改 traefik-demo 目錄中的 docker-compose.yml 文件,在下面添加如下內容:
apidemo: image: apidemo labels: - "traefik.enable=true" - "traefik.http.routers.apidemo.entrypoints=http" - "traefik.http.routers.apidemo.rule=Host(`apidemo.fw.com`) && PathPrefix(`/workflow`)" - "traefik.http.services.apidemo.loadbalancer.server.port=80" networks: - traefik-net apidemo-1: image: apidemo labels: - "traefik.enable=true" - "traefik.http.routers.apidemo-1.entrypoints=http" - "traefik.http.routers.apidemo-1.rule=Host(`apidemo.fw.com`) && PathPrefix(`/interfacecenter`)" - "traefik.http.services.apidemo-1.loadbalancer.server.port=80" networks: - traefik-net
在上面 labels 的路由配置中使用了 apidemo.fw.com 的域名,同樣,這個域名也需要配置到 hosts 文件中:
127.0.0.1 traefik.fw.com apidemo.fw.com
執行下面的命令進行容器的構建:
docker-compose up -d apidemodocker-compose up -d apidemo-1
使用 Postman 進行測試:
本文鏈接:http://www.www897cc.com/showinfo-26-80876-0.html能更好集成容器的反向代理工具Traefik的簡單使用
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com