如何打造真正可动态扩展的服务架构
在互联网应用领域,服务的动态性需求十分常见,这就对服务的自动发现和可动态扩展提出了很高的要求。
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 对在线升级支持做到了极致。实时配置更新更是不在话下,可以保证服务的连续性。
实验过程
准备工作
首先,从 这里 下载模板文件。
主要内容如下:
- #backend web application, scale this with docker-compose scale web=3
- web:
- image: yeasy/simple-web:latest
- environment:
- SERVICE_80_NAME: http
- SERVICE_NAME: web
- SERVICE_TAGS: backend
- ports:
- - "80"
- #load balancer will automatically update the config using consul-template
- lb:
- image: yeasy/nginx-consul-template:latest
- hostname: lb
- links:
- - consulserver:consul
- ports:
- - "80:80"
- consulserver:
- image: gliderlabs/consul-server:latest
- hostname: consulserver
- ports:
- - "8300"
- - "8400"
- - "8500:8500"
- - "53"
- command: -data-dir /tmp/consul -bootstrap -client 0.0.0.0
- # listen on local docker sock to register the container with public ports to the consul service
- registrator:
- image: gliderlabs/registrator:master
- hostname: registrator
- links:
- - consulserver:consul
- volumes:
- - "/var/run/docker.sock:/tmp/docker.sock"
- command: -internal consul://consul:8500
如果没有安装 docker 和 docker-compose,需要先进行安装,以 ubuntu 系统为例。
- $ curl -sSL https://get.docker.com/ | sh
- $ sudo pip install docker-compose
执行
docker-compose 模板所在目录,执行
- $ sudo docker-compose up
相关镜像即可自动被下载,下载完毕后,容器就启动起来了。
访问 http://localhost 可以看到一个 web 页面,提示实际访问的目标地址。
多次刷新,可以看到目标地址没有变化,这是因为,目前我们只有一个 web 后端服务器。
- 2015-08-18 03:37:58: 6 requests from <LOCAL: 172.17.1.150> to WebServer <172.17.1.148>
调整后端为 3 个服务器。
- $ sudo docker-compose scale web=3
然后,再次访问 http://localhost,多次刷新,可以看到访问的实际目标地址发生了变化,新启动的 web 服务器被自动注册,并且 nginx 自动对它们进行了负载均衡。
- 2015-08-18 03:37:58: 6 requests from <LOCAL: 172.17.1.150> to WebServer <172.17.1.148>
- 2015-08-18 03:38:17: 5 requests from <LOCAL: 172.17.1.150> to WebServer <172.17.1.152>
- 2015-08-18 03:38:20: 5 requests from <LOCAL: 172.17.1.150> to WebServer <172.17.1.153>
如何打造真正可动态扩展的服务架构相关推荐
- 【项目实战】Java从单体到微服务打造房产销售平台(九) - 微服务架构的优势
- 简单几步,教你部署一个可扩展微服务系统!
当你构建一个微服务时,你最看重什么?一个完全管理和可扩展的系统?因为托管代码的选择有很多,例如EC2,ECS,Elastic Beanstalk,Lambda,所以很多人不知道该如何下手.虽然每个人部 ...
- 微服务架构设计模式读书笔记
1.总览 2.单体架构 2.1 单体架构好处 主要体现在早期 应用开发简单 易于对应用程序进行大规模的更改 测试相对简单直观 部署简单明了 横向扩展不费吹灰之力 2.2 局限性 过度的复杂性会吓退开发 ...
- 微服务架构-服务注册中心和服务网关(6.8) (转载)
原文链接:微服务架构-服务注册中心和服务网关(6.8) 这篇文章还是基于SpringCloud开源框架体系来谈下对Eureka服务注册中心和Zuul服务网关在使用上的一些理解和说明.在使用微服务架构进 ...
- AI TALK | 云原生时代的微服务架构与关键技术
随着云原生与微服务技术的逐步发展,业界也逐步构建出一整套比较完整的微服务技术体系. 面向云原生时代,微服务架构是从业人员绕不开的一个话题,腾讯云AI&腾讯优图的内容风控安全审核能力也与微服务技 ...
- 使用 Docker 和 Nginx 打造高性能的二维码服务
本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载.或重新修改使用,但需要注明来源. 署名 4.0 国际 (CC BY 4.0) 本文作者: 苏洋 创建时间: 2018年10月1 ...
- nginx动态配置及服务发现那些事
标题, <闲聊nginx动态配置及服务发现的那些事> - 这次的准备闲聊关于nginx服务发现的话题, 按照我以往写文章的性子,估计会迁移一些主题. 毕竟单纯聊nginx和动态服务发 ...
- docker高级应用之动态扩展容器空间大小
docker容器默认的空间是10G,如果想指定默认容器的大小(在启动容器的时候指定),可以在docker配置文件里通过dm.basesize参数指定,比如 docker -d --storage-op ...
- 【阿里内部应用】基于Blink为新商业调控打造实时大数据交互查询服务
基于Blink为新商业调控打造实时大数据交互查询服务 案例与解决方案汇总页: 阿里云实时计算产品案例&解决方案汇总 从IT到DT.从电商到新商业,阿里巴巴的每个细胞都存在大数据的DNA,如何挖 ...
最新文章
- C++中getline函数的使用
- MATLAB 图像函数(第三章) 图像基本处理
- 开发app用户协议_兰州移动APP开发用户体验设计不应该做的事
- routine tortoisesvn operations-1
- 【POJ - 2631 】Roads in the North(树的直径)
- LINUX下安装软件方法命令方法
- 内存映射过程之paging_init
- STM32F103系列选型
- VUE table下载XLSX文件
- 使用Audacity软件分析浊音、清音、爆破音的时域及频域特性。
- c语言中字母与allse,几读音是什么
- rm: cannot remove `xxx’: Operation not permitted的解决方法
- 2020微信设置2小时到账或24小时到账
- Win10右键菜单没有新建选项怎么解决?
- 淘东电商项目(68) -互联网安全架构设计(黑名单拦截及MD5加签)
- 在HarmonyOS中实现基于JS卡片的音乐播放器
- 死亡搁浅服务器不稳定ps4,《死亡搁浅》实机画面碉堡了 小岛秀夫亲晒
- 1天熟记----数据库
- .假设一个简单的ATM机的取款过程是这样的:首先提示用户输入密码(password),最多只能输入三次,超过三次则提示用户“密码错误,请取卡”结束交易。
- 2023年网络安全工程师学习教程+资料分享
热门文章
- android 47 service绑定
- 吴昊品游戏核心算法 Round 7 —— 熄灯游戏AI(有人性的Brute Force)(POJ 2811)
- jquery为图片添加事件
- TextArea的滚动条看不到了,可能与height有关
- python数据结构推荐书-「算法与数据结构」从入门到进阶吐血整理推荐书单
- python读取txt文件并写入excel-Python读excel生成数据存入txt文件
- python电脑下载有问题-Python 解决火狐浏览器不弹出下载框直接下载的问题
- python基础知识整理-python入门基础知识点整理-20171214
- python下载大文件-python 大文件
- python系统-Python OS模块常用功能 中文图文详解