天天看点

利用阿里云容器服务实现Docker微服务间的负载均衡和服务发现

然而这个是将服务暴漏到外网的,那么服务间如何通过这种方式做到自动的服务发现和的负载均衡呢?容器服务引入了负载均衡的功能,只需要使用<code>.local</code>结尾的域名,并在依赖的服务的<code>external_links</code>中增加这个域名, 依赖的服务便可以通过<code>.local</code>的域名访问到依赖的服务,并且能够配合健康检查做到自动的服务发现,例如:

然后通过如下的restclient服务的日志,我们可以看到restclient的curl的http的请求就被路由到不同的rest服务的容器上了,容器id分别是<code>053cb232fdfbcb5405ff791650a0746ab77f26cce74fea2320075c2af55c975f</code>和<code>b8c36abca525ac7fb02d2a9fcaba8d36641447a774ea956cd93068419f17ee3f</code>:

首先利用了docker 1.10之后支持在容器中做别名的方式,在依赖负载于<code>restserver.local</code>的服务的容器中<code>restserver.local</code>的域名解析到的是routing服务的地址,这样可以实现http请求转发到<code>routing</code>的容器,并带上了<code>host</code>为<code>restserver.local</code>的请求头。

然后routing会对配置了<code>aliyun.routing_port_xxx: restserver.local</code>的服务监听它的容器的健康状态并挂载到haproxy的后端,haproxy接收到带有<code>restserver.local</code> host头的http请求就能转发到对应了容器了。

利用阿里云容器服务实现Docker微服务间的负载均衡和服务发现

相对于使用link或者hostname的基于dns的方式来说,首先不同客户端对dns缓存的处理不一致会导致服务发现的延迟性,其次dns的方案也只有round robin,对于微服务的场景是不够用的;

而相对于其他的微服务服务发现的解决方案,提供了一个实现无关的服务发现和负载均衡机制,无需server端和client应用做任何修改即可使用;

并且服务生命周期解耦的,每个微服务可以采用一个docker-compose模板独立部署,更新。相互只是通过一个虚拟域名实现动态绑定即可。