522
阿里云
集群内服务间路由和负载均衡__服务发现和负载均衡_用户指南_容器服务-阿里云
在容器服务上可以通过 acsrouting 将基于域名的 HTTP 服务暴露出去,而且能够配合健康检查自动的负载均衡和服务发现,当其中一个容器出现问题之后,routing 会自动将健康检查失败的容器从后端摘除,所以能做到自动的服务发现。
然而这个例子是将服务暴露到外网,那么服务间如何通过这种方式做到自动的服务发现和负载均衡呢?容器服务引入了负载均衡功能,您只需要使用以 .local
结尾的域名,并在依赖的服务的 external_links
中增加这个域名, 依赖的服务便可以通过 .local
的域名访问到依赖的服务,并且能够配合健康检查做到自动的服务发现。
实现原理
利用了 Docker 1.10 之后支持在容器中做别名的方式,在依赖负载于
restserver.local
的服务的容器中restserver.local
的域名解析到的是 routing 服务的地址,这样可以将 HTTP 请求转发到routing
的容器,并带上HOST
为restserver.local
的请求头。routing 会对配置了
aliyun.routing_port_xxx: restserver.local
的服务监听其容器的健康状态并挂载到 HAProxy 的后端,HAProxy 接收到带有restserver.local
HOST 头的 HTTP 请求就能转发到对应了容器了。
优势
- 相对于使用 link 或者 hostname 的基于 DNS 的方式,首先不同客户端对 DNS 缓存的处理不一致会导致服务发现的延迟性,其次 DNS 的方案也只有 round robin,对于微服务的场景是不够用的。
- 而相对于其他的微服务服务发现的解决方案,提供了一个实现无关的服务发现和负载均衡机制,无需 server 端和 client 应用做任何修改即可使用。
- 服务生命周期是解耦的,每个微服务可以采用一个 docker-compose 模板独立部署,更新。相互之间只是通过一个虚拟域名实现动态绑定即可。
编排实例
restserver: # 模拟 rest 服务
image: nginx
labels:
aliyun.routing.port_80: restserver.local # 使用 local 的域名,只有集群内的容器可以访问这个域名
aliyun.scale: "2" # 扩展出两个实例,模拟负载均衡
aliyun.probe.url: "https://container:80" # 定义容器的健康检查策略是 http,端口是 80
aliyun.probe.initial_delay_seconds: "2" # 健康检查在容器起来之后两秒之后再检查
aliyun.probe.timeout_seconds: "2" # 健康检查超时时间,如果两秒还没返回认为不健康
restclient: # 模拟 rest 服务消费者
image: registry.aliyuncs.com/acs-sample/alpine:3.3
command: "sh -c 'apk update; apk add curl; while true; do curl --head restserver.local; sleep 1; done'" #访问 rest 服务,测试负载均衡
tty: true
external_links:
- "restserver.local" #指定 link 的服务的域名
然后,通过如下的 restclient 服务的日志,您可以看到 restclient 的 curl 的 http 请求被路由到不同的 rest 服务的容器上了,容器 ID 分别为 053cb232fdfbcb5405ff791650a0746ab77f26cce74fea2320075c2af55c975f
和 b8c36abca525ac7fb02d2a9fcaba8d36641447a774ea956cd93068419f17ee3f
。
internal-loadbalance_restclient_1 | 2016-07-01T06:43:49.066803626Z Server: nginx/1.11.1
internal-loadbalance_restclient_1 | 2016-07-01T06:43:49.066814507Z Date: Fri, 01 Jul 2016 06:43:49 GMT
internal-loadbalance_restclient_1 | 2016-07-01T06:43:49.066821392Z Content-Type: text/html
internal-loadbalance_restclient_1 | 2016-07-01T06:43:49.066829291Z Content-Length: 612
internal-loadbalance_restclient_1 | 2016-07-01T06:43:49.066835259Z Last-Modified: Tue, 31 May 2016 14:40:22 GMT
internal-loadbalance_restclient_1 | 2016-07-01T06:43:49.066841201Z ETag: "574da256-264"
internal-loadbalance_restclient_1 | 2016-07-01T06:43:49.066847245Z Accept-Ranges: bytes
internal-loadbalance_restclient_1 | 2016-07-01T06:43:49.066853137Z Set-Cookie: CONTAINERID=053cb232fdfbcb5405ff791650a0746ab77f26cce74fea2320075c2af55c975f; path=/
internal-loadbalance_restclient_1 | 2016-07-01T06:43:50.080502413Z HTTP/1.1 200 OK
internal-loadbalance_restclient_1 | 2016-07-01T06:43:50.082548154Z Server: nginx/1.11.1
internal-loadbalance_restclient_1 | 2016-07-01T06:43:50.082559109Z Date: Fri, 01 Jul 2016 06:43:50 GMT
internal-loadbalance_restclient_1 | 2016-07-01T06:43:50.082589299Z Content-Type: text/html
internal-loadbalance_restclient_1 | 2016-07-01T06:43:50.082596541Z Content-Length: 612
internal-loadbalance_restclient_1 | 2016-07-01T06:43:50.082602580Z Last-Modified: Tue, 31 May 2016 14:40:22 GMT
internal-loadbalance_restclient_1 | 2016-07-01T06:43:50.082608807Z ETag: "574da256-264"
internal-loadbalance_restclient_1 | 2016-07-01T06:43:50.082614780Z Accept-Ranges: bytes
internal-loadbalance_restclient_1 | 2016-07-01T06:43:50.082621152Z Set-Cookie: CONTAINERID=b8c36abca525ac7fb02d2a9fcaba8d36641447a774ea956cd93068419f17ee3f; path=/
最后更新:2016-12-13 13:56:17
上一篇:
简单路由-HTTP 协议变为 HTTPS 协议__服务发现和负载均衡_用户指南_容器服务-阿里云
下一篇:
负载均衡路由__服务发现和负载均衡_用户指南_容器服务-阿里云
API调用方式__API使用手册_归档存储-阿里云
绑定弹性公网IP__快速入门_专有网络 VPC-阿里云
存储包购买流程__购买指导_文件存储-阿里云
资源查询场景__场景示例_Open API_消息队列 MQ-阿里云
移出不健康ECS实例__使用须知_用户指南_弹性伸缩-阿里云
通过 Docker 工具连接集群__快速入门_容器服务-阿里云
虚机windows站点报错500处理方法__网站访问异常_技术分享_云虚机主机-阿里云
ALIYUN::SLB::LoadBalancer__资源列表_资源编排-阿里云
RecordLogType__数据类型_API文档_云解析-阿里云
专有网络和交换机__网络_用户指南_专有网络 VPC-阿里云
相关内容
常见错误说明__附录_大数据计算服务-阿里云
发送短信接口__API使用手册_短信服务-阿里云
接口文档__Android_安全组件教程_移动安全-阿里云
运营商错误码(联通)__常见问题_短信服务-阿里云
设置短信模板__使用手册_短信服务-阿里云
OSS 权限问题及排查__常见错误及排除_最佳实践_对象存储 OSS-阿里云
消息通知__操作指南_批量计算-阿里云
设备端快速接入(MQTT)__快速开始_阿里云物联网套件-阿里云
查询API调用流量数据__API管理相关接口_API_API 网关-阿里云
使用STS访问__JavaScript-SDK_SDK 参考_对象存储 OSS-阿里云