我们正在AWS中实施微服务架构.我们有几个EC2实例,它们在不同的端口上部署了微服务.我们还有一个面向互联网的应用程序负载均衡器,它根据端口路由到不同的服务.
例如:
xxxx-xx.xx.elb.amazonaws.com : 8080/转到微服务1
xxxx-xx.xx.elb.amazonaws.com:8090/转到微服务2
我们需要有一个域名而不是ELB,端口也不应该通过域名公开.几乎我找到的关于路径53的所有资源,使用别名执行以下操作
xx.xxxx.co.id - > xxxx-xx.xx.elb.amazonaws.com或
xx.xxxx.co.id - > 111.111.111.11(静态IP)
1.)我们是否需要为每个微服务提供单独的域名?
2.)如何使用别名将域指向ELB的特定端口?
3.)如果域来自AWS以外的其他提供商,是否可以使用此设置.
重要更新
由于此答案最初编写,因此Application Load Balancer 引入了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中提供了端口,否则这些端口是唯一可用的端口.
但是,在HTTP和HTTPS中,每个请求都附带一个Host:
标头,由Web浏览器随每个请求发送.这是地址栏中的主机名.
为了区分到达设备的不同主机名(例如ELB/ALB)的请求,端点上的设备必须解释传入的主机头并将请求路由到提供该服务的后端系统.
ALB目前不支持此功能.
但是,ALB支持基于路径前缀选择端点.因此microservices.example.com/api/foo可以路由到一组服务,而microservices.example.com/api/bar可以路由到另一组服务.
但ALB不直接支持主机头的路由.
在我的基础架构中,我们使用ELB或ALB的组合,但负载均衡器背后的实例不是应用程序.相反,它们是运行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:
标头并选择请求将路由到的后端(一组1个或更多实例).它是ELB和应用程序之间的一个薄层,它通过检查主机头或请求的任何其他特征来处理请求路由.
这是一个解决方案,但根据您的专业知识,它是一种稍微高级的配置.
如果您正在寻找开箱即用,无服务器,以AWS为中心的解决方案,那么实际上可以在CloudFront中找到答案.是的,它是CDN,但它有其他几个应用程序,包括作为反向代理.
对于每项服务,请从您的域中选择要分配给该服务的主机名foo.api.example.com或bar.api.example.com.
对于每项服务,请创建CloudFront分配.
配置每个分发的备用域名以使用该服务的分配主机名.
将Origin Domain Name设置为ELB主机名.
将Origin HTTP Port设置为ALB上服务的特定端口,例如8090.
配置默认缓存行为以转发所需的任何标头.如果您不需要CloudFront的缓存功能,请选择"转发所有标头".如果需要,还可以转发查询字符串和Cookie.
在Route 53中,将foo.api.example.com创建为该特定CloudFront分配的主机名的别名,例如dxxxexample.cloudfront.net.
你的问题解决了.
你看我在那里做了什么?
对于您配置的每个主机名,专用的CloudFront分配在标准端口(80/443)上接收请求,并且 - 根据主机标头匹配的分布 - CloudFront将请求路由到相同的 ELB/ALB主机名但是自定义端口数.