【发布时间】:2019-04-05 06:01:44
【问题描述】:
我正在研究在运行 Dockerized 微服务的 Service Fabric 集群中使用 Traefik 作为反向代理。在 Service Fabric 中运行 Traefik 的 official 方式是使用 Service Fabric 提供程序。不建议在 Docker 容器中运行 Traefik according to the Github readme,因为您无法通过 localhost:19080 访问 Service Fabric API,而是必须通过其公共 IP 访问它。这需要您安装 SSL 证书才能安全地与 API 通信,这有点麻烦。
我很好奇使用 Traefix Service Fabric 提供程序(需要复杂的设置)而不是仅在使用文件提供程序运行的容器中运行 Traefix 是否有任何优势。如果您的服务在 ApplicationManifest 中有 ServiceDnsName 属性,从而允许 Service Fabric DNS 找到它们,这似乎是一个更简单的方法。 Traefik 配置类似于:
[frontends]
[frontends.api]
backend = "api"
passHostHeader = true
[frontends.api.routes.forwarder]
rule = "PathPrefixStrip: /api/"
[frontends.someservice]
backend = "someservice"
passHostHeader = true
[frontends.someservice.routes.forwarder]
rule = "PathPrefixStrip: /SomeService/"
[backends]
[backends.api]
[backends.api.servers.endpoint]
url = "http://Api:11080"
[backends.someservice]
[backends.someservice.servers.endpoint]
url = "http://SomeService:12080"
您将端口 80 映射到 Traefix 服务,然后该服务会根据 URL 前缀将 HTTP 调用分派到适当的内部服务。
优点:
- 无需与 Service Fabric API 对话,这在容器内有点hacky。
- 可能更安全;一切都是内部的,无需担心安装证书
缺点:
- 您的服务路由现在绑定到 Docker 容器中的 TOML 文件,而不是集成到服务和应用程序清单文件中。如果不重新部署该容器,就无法修改它。
- 除非所有服务都在容器中运行,否则我认为这不会起作用(尽管我相信如果您启用了保留代理,则可以改用
http://localhost:19081/AppName/ServiceName按名称解析服务)
对我来说,如果您不一直更改和添加服务,这似乎是一种更简洁的方法。但通常情况下,这些东西保持相当静态。
是否有任何我没有考虑的陷阱,或者有什么强烈反对这样做的理由?
【问题讨论】:
-
据我所知 - 这应该可以正常工作。您打算在 Azure 中还是在本地托管它?
-
@OlegKarasik - 这是托管在 Azure 上的。我有一个原型设置,它似乎也可以正常工作。
标签: azure-service-fabric traefik