重要更新
由于这个答案最初是写的,应用程序负载均衡器引入了 ALB 根据请求将请求路由到特定目标组的功能Host传入请求的标头.
现在可以使用传入的主机标头将请求路由到特定实例和端口。
此外,ALB引入了SNI支持,允许您将多个 TLS (SSL) 证书与单个平衡器关联,并且在协商 TLS 时,将根据客户端提供的 SNI 自动选择正确的证书。 Amazon Certificate Manager 的多域和通配符证书也可与 ALB 配合使用。
基于这些因素,不需要单独的端口或不同的侦听器 - 只需为每个服务分配主机名和/或路径前缀,并将这些模式映射到适当的目标实例组。
原来的答案不再准确,但包含在下面。
1.) 我们是否需要为每个微服务分配单独的域?
不,这对你没有帮助。 ALB 不会解释附加到传入请求的主机名。
同一域中的单独主机名也不会直接实现您的目标。
2.) 如何使用别名将域指向ELB的特定端口?
域不指向端口。主机名不指向端口。 DNS仅用于地址解析。互联网上到处都是如此。
3.) 如果域来自 AWS 以外的其他提供商,是否可以使用此设置。
这不是 AWS 的限制。 DNS 根本无法以这种方式工作。
服务端点不知道指向它的 DNS 记录。 DNS 条目本身严格用于发现可用于访问端点的 IP 地址。此后,端点实际上并不知道有关 DNS 的任何信息,并且无法通过 DNS 告诉浏览器使用不同的端口。
对于 HTTP,隐式端口为 80。对于 HTTPS,隐式端口为 443。除非 URL 中提供了端口,否则这些是only可用端口。
然而,在HTTP和HTTPS中,每个请求都伴随着一个Host:
标头,由 Web 浏览器随每个请求发送。这是地址栏中的主机名。
为了区分到达设备(例如 ELB/ALB)的不同主机名的请求,端点处的设备必须解释传入的主机标头并将请求路由到提供该服务的后端系统。
ALB 目前不支持此功能。
但是,ALB 支持根据路径前缀选择端点。因此,microservices.example.com/api/foo 可以路由到一组服务,而 microservices.example.com/api/bar 可以路由到另一组服务。
但ALB不直接支持通过主机头进行路由。
在我的基础设施中,我们使用 ELB 或 ALB 的组合,但负载均衡器背后的实例是not应用程序。相反,它们是运行 HAProxy 负载均衡器软件的实例,并将请求路由到后端。
重要配置元素的简短示例如下所示:
frontend main
use_backend svc1 if { hdr(Host) -i foo.example.com }
use_backend svc2 if { hdr(Host) -i bar.example.com }
backend svc1
server foo-a 192.168.2.24:8080
server foo-b 192.168.12.18:8080
backend svc2
....
ELB终止SSL并随机选择一个代理,代理检查Host:
header 并选择请求将路由到的后端(一组 1 个或多个实例)。它是 ELB 和应用程序之间的一个薄层,它通过检查主机标头或请求的任何其他特征来处理请求路由。
这是一种解决方案,但是是一种稍微高级的配置,具体取决于您的专业知识。
如果您正在寻找开箱即用、无服务器、以 AWS 为中心的解决方案,那么实际上可以在 CloudFront 中找到答案。是的,它是一个 CDN,但它还有其他几个应用程序,包括作为反向代理。
对于每项服务,从您的域中选择一个主机名来分配给该服务,即 foo.api.example.com 或 bar.api.example.com。
对于每项服务,创建一个 CloudFront 分配。
配置每个发行版的备用域名以使用该服务分配的主机名。
将源域名设置为 ELB 主机名。
Set the 原始 HTTP 端口到 ALB 上服务的特定端口,例如8090。
配置默认缓存行为以转发您需要的任何标头。如果您不需要 CloudFront 的缓存功能,请选择转发所有标头。如果需要,还可以启用查询字符串和 Cookie 的转发。
在 Route 53 中,创建 foo.api.example.com 作为该特定 CloudFront 分配主机名的别名,例如dxxxexample.cloudfront.net。
你的问题已经解决了。
你看到我在那里做了什么吗?
对于您配置的每个主机名,专用的 CloudFront 分配会在标准端口 (80/443) 上接收请求,并且根据主机标头匹配的分配,CloudFront 将请求路由到sameELB/ALB 主机名但是custom端口号。