在互联网应用领域,服务的动态性需求十分常见,这就对服务的自动发现和可动态扩展提出了很高的要求。

Docker 的出现,以及微服务架构的兴起,让众多开源项目开始关注在松耦合的架构前提下,如何基于 Docker 实现一套真正可动态扩展的服务架构。

基本需求

基本的需求包括:

  • 服务启动后要能自动被发现(vs 传统需要手动进行注册);
  • 负载要能动态在可用的服务实例上进行均衡(vs 传统需要静态写入配置);
  • 服务规模要方便进行快速调整(vs 传统需要较长时间的手动调整)。

相关项目

服务发现

服务发现的项目已经有不少,包括之前介绍的 consul,以及 skydns、serf、以及主要关注一致性的强大的 zookeeper 等。

这些项目各有优缺点,功能上大同小异,都是要通过某种机制来获取服务信息,然后通过维护一套(分布式)数据库来存储服务的信息。这也是为什么 etcd 受到大家关注和集成。

在这里,选用 HashiCorp 公司的 consul 作为服务发现的管理端,它的简介可以参考 这里。

服务注册

服务注册的手段有很多,当然,从发起方是谁可以分为两大类,主动注册还是被动探测。

主动注册,顾名思义,服务启动后,向指定的服务发现管理端的 API 发送请求,给出自身的相关信息。这样做,对管理端的要求简单了很多,但意味着服务自身要完成注册工作,并且极端情况下,管理端比较难探测出真正存活的服务。

被动探测,则是服务发现管理端通过某种机制来探测存活的服务。这样可以获取真实的服务情况,但如何探测是个很难设计的点,特别当服务类型比较复杂的时候。

以上两种,都对网络连通性要求较高。从短期看,主动注册方式会比较容易实现一些,应用情形更广泛;但长期维护上,被动探测方式应该是更高效的设计。

这里,我们选用 gliderlabs 的 registrator,它可以通过跟本地的 docker 引擎通信,来获取本地启动的容器信息,并且注册到指定的服务发现管理端。

配置更新

服务被调整后,负载均衡器要想动态重新分配负载,就需要通过配置来获取更新。这样的方案也有不少,基本上都是要安装一些本地 agent 来监听服务发现管理端的信息,生成新的配置,并执行更新命令。

HashiCorp 公司 的consul-template,可以通过监听 consul 的注册信息,来完成本地应用的配置更新。

负载均衡

负载均衡对性能要求很高,其实并不是软件所擅长的领域,但软件方案胜在成本低、维护方便。包括 lvs、haproxy 都是很优秀的设计方案。

这里,我们选用 nginx。nginx 不仅是个强大的 web 代理服务器,同时在负载均衡方面表现也不俗。更关键的,新版本的 nginx 对在线升级支持做到了极致。实时配置更新更是不在话下,可以保证服务的连续性。

实验过程

准备工作

首先,从 这里 下载模板文件。

主要内容如下:

  1. #backend web application, scale this with docker-compose scale web=3
  2. web:
  3. image: yeasy/simple-web:latest
  4. environment:
  5. SERVICE_80_NAME: http
  6. SERVICE_NAME: web
  7. SERVICE_TAGS: backend
  8. ports:
  9. - "80"
  10. #load balancer will automatically update the config using consul-template
  11. lb:
  12. image: yeasy/nginx-consul-template:latest
  13. hostname: lb
  14. links:
  15. - consulserver:consul
  16. ports:
  17. - "80:80"
  18. consulserver:
  19. image: gliderlabs/consul-server:latest
  20. hostname: consulserver
  21. ports:
  22. - "8300"
  23. - "8400"
  24. - "8500:8500"
  25. - "53"
  26. command: -data-dir /tmp/consul -bootstrap -client 0.0.0.0
  27. # listen on local docker sock to register the container with public ports to the consul service
  28. registrator:
  29. image: gliderlabs/registrator:master
  30. hostname: registrator
  31. links:
  32. - consulserver:consul
  33. volumes:
  34. - "/var/run/docker.sock:/tmp/docker.sock"
  35. command: -internal consul://consul:8500

如果没有安装 docker 和 docker-compose,需要先进行安装,以 ubuntu 系统为例。

  1. $ curl -sSL https://get.docker.com/ | sh
  2. $ sudo pip install docker-compose

执行

docker-compose 模板所在目录,执行

  1. $ sudo docker-compose up

相关镜像即可自动被下载,下载完毕后,容器就启动起来了。

访问 http://localhost 可以看到一个 web 页面,提示实际访问的目标地址。

多次刷新,可以看到目标地址没有变化,这是因为,目前我们只有一个 web 后端服务器。

  1. 2015-08-18 03:37:58: 6 requests from <LOCAL: 172.17.1.150> to WebServer <172.17.1.148>

调整后端为 3 个服务器。

  1. $ sudo docker-compose scale web=3

然后,再次访问 http://localhost,多次刷新,可以看到访问的实际目标地址发生了变化,新启动的 web 服务器被自动注册,并且 nginx 自动对它们进行了负载均衡。

  1. 2015-08-18 03:37:58: 6 requests from <LOCAL: 172.17.1.150> to WebServer <172.17.1.148>
  2. 2015-08-18 03:38:17: 5 requests from <LOCAL: 172.17.1.150> to WebServer <172.17.1.152>
  3. 2015-08-18 03:38:20: 5 requests from <LOCAL: 172.17.1.150> to WebServer <172.17.1.153>

如何打造真正可动态扩展的服务架构相关推荐

  1. 【项目实战】Java从单体到微服务打造房产销售平台(九) - 微服务架构的优势

  2. 简单几步,教你部署一个可扩展微服务系统!

    当你构建一个微服务时,你最看重什么?一个完全管理和可扩展的系统?因为托管代码的选择有很多,例如EC2,ECS,Elastic Beanstalk,Lambda,所以很多人不知道该如何下手.虽然每个人部 ...

  3. 微服务架构设计模式读书笔记

    1.总览 2.单体架构 2.1 单体架构好处 主要体现在早期 应用开发简单 易于对应用程序进行大规模的更改 测试相对简单直观 部署简单明了 横向扩展不费吹灰之力 2.2 局限性 过度的复杂性会吓退开发 ...

  4. 微服务架构-服务注册中心和服务网关(6.8) (转载)

    原文链接:微服务架构-服务注册中心和服务网关(6.8) 这篇文章还是基于SpringCloud开源框架体系来谈下对Eureka服务注册中心和Zuul服务网关在使用上的一些理解和说明.在使用微服务架构进 ...

  5. AI TALK | 云原生时代的微服务架构与关键技术

    随着云原生与微服务技术的逐步发展,业界也逐步构建出一整套比较完整的微服务技术体系. 面向云原生时代,微服务架构是从业人员绕不开的一个话题,腾讯云AI&腾讯优图的内容风控安全审核能力也与微服务技 ...

  6. 使用 Docker 和 Nginx 打造高性能的二维码服务

    本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载.或重新修改使用,但需要注明来源. 署名 4.0 国际 (CC BY 4.0) 本文作者: 苏洋 创建时间: 2018年10月1 ...

  7. nginx动态配置及服务发现那些事

    标题,  <闲聊nginx动态配置及服务发现的那些事> - 这次的准备闲聊关于nginx服务发现的话题,  按照我以往写文章的性子,估计会迁移一些主题.  毕竟单纯聊nginx和动态服务发 ...

  8. docker高级应用之动态扩展容器空间大小

    docker容器默认的空间是10G,如果想指定默认容器的大小(在启动容器的时候指定),可以在docker配置文件里通过dm.basesize参数指定,比如 docker -d --storage-op ...

  9. 【阿里内部应用】基于Blink为新商业调控打造实时大数据交互查询服务

    基于Blink为新商业调控打造实时大数据交互查询服务 案例与解决方案汇总页: 阿里云实时计算产品案例&解决方案汇总 从IT到DT.从电商到新商业,阿里巴巴的每个细胞都存在大数据的DNA,如何挖 ...

最新文章

  1. C++中getline函数的使用
  2. MATLAB 图像函数(第三章) 图像基本处理
  3. 开发app用户协议_兰州移动APP开发用户体验设计不应该做的事
  4. routine tortoisesvn operations-1
  5. 【POJ - 2631 】Roads in the North(树的直径)
  6. LINUX下安装软件方法命令方法
  7. 内存映射过程之paging_init
  8. STM32F103系列选型
  9. VUE table下载XLSX文件
  10. 使用Audacity软件分析浊音、清音、爆破音的时域及频域特性。
  11. c语言中字母与allse,几读音是什么
  12. rm: cannot remove `xxx’: Operation not permitted的解决方法
  13. 2020微信设置2小时到账或24小时到账
  14. Win10右键菜单没有新建选项怎么解决?
  15. 淘东电商项目(68) -互联网安全架构设计(黑名单拦截及MD5加签)
  16. 在HarmonyOS中实现基于JS卡片的音乐播放器
  17. 死亡搁浅服务器不稳定ps4,《死亡搁浅》实机画面碉堡了 小岛秀夫亲晒
  18. 1天熟记----数据库
  19. .假设一个简单的ATM机的取款过程是这样的:首先提示用户输入密码(password),最多只能输入三次,超过三次则提示用户“密码错误,请取卡”结束交易。
  20. 2023年网络安全工程师学习教程+资料分享

热门文章

  1. android 47 service绑定
  2. 吴昊品游戏核心算法 Round 7 —— 熄灯游戏AI(有人性的Brute Force)(POJ 2811)
  3. jquery为图片添加事件
  4. TextArea的滚动条看不到了,可能与height有关
  5. python数据结构推荐书-「算法与数据结构」从入门到进阶吐血整理推荐书单
  6. python读取txt文件并写入excel-Python读excel生成数据存入txt文件
  7. python电脑下载有问题-Python 解决火狐浏览器不弹出下载框直接下载的问题
  8. python基础知识整理-python入门基础知识点整理-20171214
  9. python下载大文件-python 大文件
  10. python系统-Python OS模块常用功能 中文图文详解