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

简介: 容器服务的服务间的负载均衡和自动服务发现方案
+关注继续查看

基于容器服务实现Docker微服务间的负载均衡和自动服务发现的方法

在容器服务上可以通过acsrouting将基于域名的http的服务暴漏出去,而且能够配合健康检查自动的负载均衡和服务发现,当其中一个容器出现问题之后,routing会自动将健康检查失败的容器从后端摘除,所以能做到自动的服务发现。

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

restserver: # 模拟rest服务
  image: nginx
  labels:
    aliyun.routing.port_80: restserver.local # 使用local的域名,只有集群内的容器可以访问这个域名
    aliyun.scale: "2" # 扩展出2个实例,模拟负载均衡
    aliyun.probe.url: "http://container:80" # 定义容器的健康检查策略是http,端口是80
    aliyun.probe.initial_delay_seconds: "2" # 健康检查在容器起来之后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分别是053cb232fdfbcb5405ff791650a0746ab77f26cce74fea2320075c2af55c975fb8c36abca525ac7fb02d2a9fcaba8d36641447a774ea956cd93068419f17ee3f:

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=/

实现的原理:

  1. 首先利用了docker 1.10之后支持在容器中做别名的方式,在依赖负载于restserver.local的服务的容器中restserver.local的域名解析到的是routing服务的地址,这样可以实现HTTP请求转发到routing的容器,并带上了HOSTrestserver.local的请求头。
  2. 然后routing会对配置了aliyun.routing_port_xxx: restserver.local的服务监听它的容器的健康状态并挂载到haproxy的后端,haproxy接收到带有restserver.local HOST头的HTTP请求就能转发到对应了容器了。
    screenshot

优势

  1. 相对于使用link或者hostname的基于DNS的方式来说,首先不同客户端对DNS缓存的处理不一致会导致服务发现的延迟性,其次DNS的方案也只有round robin,对于微服务的场景是不够用的;
  2. 而相对于其他的微服务服务发现的解决方案,提供了一个实现无关的服务发现和负载均衡机制,无需server端和client应用做任何修改即可使用;
  3. 并且服务生命周期解耦的,每个微服务可以采用一个docker-compose模板独立部署,更新。相互只是通过一个虚拟域名实现动态绑定即可。
相关实践学习
Docker镜像管理快速入门
本教程将介绍如何使用Docker构建镜像,并通过阿里云镜像服务分发到ECS服务器,运行该镜像。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
1天前
|
应用服务中间件 Linux nginx
百度搜索:蓝易云【Docker容器安装Nginx教程。】
注意:在运行容器时,可以根据需要使用其他参数进行自定义配置,例如将本地文件挂载到容器中,或者使用自定义配置文件等。这些配置超出了本教程的范围,但你可以参考Docker文档和Nginx文档以获取更多详细信息。
47 2
|
2月前
|
应用服务中间件 nginx 数据中心
docker服务发现
docker服务发现
28 0
|
2月前
|
应用服务中间件 nginx 数据中心
docker服务发现
docker服务发现
88 1
|
2月前
|
应用服务中间件 nginx 数据中心
docker服务发现
docker服务发现
18 0
|
存储 NoSQL 应用服务中间件
最佳实践系列丨Docker EE 服务发现参考架构(三)
现在您已经了解了 HRM 的工作原理和与它相关的要求,本部分将介绍用于 HTTP 路由、日志记录、监控和从节点的 HRM 语法。
2177 0
|
网络协议 前端开发 数据安全/隐私保护
最佳实践系列丨Docker EE 服务发现参考架构(二)
swarm mode 网格路由非常适合传输层路由。它使用服务的已发布端口路由到服务。但是,如果希望基于主机名将流量路由到服务应该怎么办?
2102 0
|
运维 负载均衡 网络协议
最佳实践系列丨Docker EE 服务发现参考架构(一)
服务发现对服务进行注册并发布其连接信息,以使其他服务了解如何连接到服务。随着应用向微服务和面向服务的架构转变,服务发现已经成为所有分布式系统的必要组成部分,增加了这些环境的运维复杂性。
8011 0
|
网络协议 数据库 Docker
在Docker Swarm模式下,Docker应用如何实现服务发现
本文讲的是在Docker Swarm模式下,Docker应用如何实现服务发现【编者的话】无论容器是否存在于集群之中,本文将告诉我们如何可靠地连接到它。
2165 0
|
负载均衡 网络协议 测试技术
DockOne微信分享(七十一):基于Docker的负载均衡和服务发现
本文讲的是DockOne微信分享(七十一):基于Docker的负载均衡和服务发现【编者的话】Docker已经成为时下热门的容器技术,各大公司,中小创业者,都选择采用Docker技术架构其下一代的系统和应用。
2279 0
相关产品
容器镜像服务
容器服务Kubernetes版
推荐文章
更多