SaaS路线图 | 时光机


戳蓝字“CSDN云计算”关注我们哦!

640?wx_fmt=jpeg

时光机:搭载这部时光机,带您回顾《程序员》大量优秀文章,重温经典技术干货,我们发现硬核技术永不过时,对于get要点、solve难题、提高自我,仍有非凡意义。


作者:Richy Ho是一名软件架 构师,热衷于分布式及 并行计算、机器学习和 数据挖掘、SaaS和云 计算。先后在Cisco、 eBay、Adobe等公司工作。博客在horicky. blogspot.com。


本文介绍了从传统Web应用一步一步迁移到SaaS的历程。


我观察了多家企业从传统 Web 应用迁移到 SaaS 的历程,察觉出其中存在着一种模式。本文试 图将这模式描绘出来,并总结出从中学到的若 干教训。虽然讲解中以 J2EE Web 应用架构作为示 例,但同样的原理也适用于其他技术平台。

 

第1阶段:使用中的现有Web应用 在最开始,我们已经拥有正常工作的Web应用。我 们分析现有应用的功能,把各个实现类划分成适当的组 (见图1)。

 

640?wx_fmt=jpeg


 第2阶段:将功能分散到单独的进程中去 我们分析各个功能,将它们拆分到不同的进程 (JVM)中。拆分要求是粗粒度的,各进程通过一个 Facade类暴露出服务接口,经由这些服务接口实现彼 此间的通信。服务接口可以是各种远程对象调用,也 可以是XML Over HTTP。Restful Web Service是服务 接口实现途径的事实标准(见图2)。

 

640?wx_fmt=jpeg


第3阶段:将不同进程转移到不同机器上 为了进一步扩展,跨越单台服务器能力的局限, 我们将进程转移到不同的机器上。请注意可以是物理 机器,也可以是虚拟机器(见图3)。

 

640?wx_fmt=jpeg


第4阶段:构建服务池 如果服务本身是无状态的,我们可以简单地 向服务池中投入(运行着同样服务的)更多机器, 横向扩展服务的容量。有必要使用一个网络负载均 衡服务器来平均地将工作量分散到池中的服务器上 (见图4)。

640?wx_fmt=jpeg


当工作负载上升时,可以向池中投入更多机器去 增强服务的总体容量。云计算供应商提供了弹性的扩展能力,使我们可以更加迅速地伸缩 池的大小,更有效率地处理动态的负 载变化。

 

第5阶段:通过分区扩展数 据层 业务处理层扩展完毕之后,我 们发现数据层成了瓶颈。因此有必 要通过按照数据的键作分区,分散 数据访问的工作负载。构建分布式 数据库的典型技巧请参考本刊2010 年第1期的文章《NoSQL的模式》 (见图5)。

 

640?wx_fmt=jpeg


第6阶段:加入缓存以降低服 务器负载 如果应用的读/写比很高,或者可 以在一定程度上容忍过时数据,我们 就可以增加一层缓存层,减少对服务 的实际访问量。客户端在向服务发送 请求之前先检查缓存。

 

我们需要维持缓存对象的新鲜 度。这方面存在很多方案,比如可以设定缓存对象在一定时间后过期;也 可以在后端数据发生变化的时候,明 确地发出请求,将相应的特定缓存对 象废弃掉(见图6)。 我们可以用本地缓存(位于客 户端所在的机器上),也可以采用 Memcached或者Oracle Coherence这 类分布式缓存引擎。

 

640?wx_fmt=jpeg


第7阶段:考虑对外公开哪些 服务 到了这个阶段,我们希望对外 公开一些服务,也许是服务本身就 是获利渠道,也许是为了更方便与 商业伙伴实现紧密的B2B集成。决 定暴露哪些东西,牵涉到非常多的 考虑因素,比如安全、可伸缩性、 服 务 水 平 协 议 、 使 用 情 况 跟 踪 等 (见图7)。

 

640?wx_fmt=jpeg


第8阶段:部署服务入口网关 决定对外暴露哪些服务之后,我 们根据具体的决策配置专门的服务入 口网关,负责处理上面提到的那些问 题。大多数XML服务网关都具备了消 息验证、安全检查、消息转换、路由 逻辑等功能(见图8)。

 

640?wx_fmt=jpeg


第9阶段:部署服务出口网关 我们不但对外提供服务,同时也 会消费其他人提供的服务。此时需要 部署一个服务出口网关,帮助我们完 成查找服务端点、提取服务策略等任 务(见图9)。


640?wx_fmt=jpeg



服务出口网关的一项重要功能 是管理企业内部对外部服务提供者的 依赖。典型的安排是让出口网关持有 提供相同服务的服务提供者的一份列 表,列表中还记录了该服务提供者的可用性(availability)和响应时间等信 息。出口网关要负责按照我选择的指 标(如最便宜的、最可靠的、延迟最 小的等)将请求路由到适当的服务提 供者(见图10)。

 

640?wx_fmt=jpeg


第10阶段:实现服务的版本 控制 服务在对外开放之后还会继续演 进。在理想的情况下,只需要改变服 务的实现,服务的接口保持不变,因 此不需要改动客户端的代码。

 

但现实往往没有那么理想,服 务接口或者消息格式都有可能需要 修改。在这样的情况下,为了保证不 破坏现有客户端,有可能要同时运 行多个版本的服务。也就是说,服务 入口网关必须智能地将客户端请求 路由到正确版本的服务实现上去(见 图11)。

 

640?wx_fmt=jpeg


典型的解决方法是维护一个版 本矩阵,跟踪各版本之间的兼容性。 我们可以规定一些发布策略,比如小 版本号的变动必须保持向后兼容, 而大版本号的变动就不要求。利用 这样的兼容性矩阵,入口网关就能 根据收到的请求判定客户端的版本, 并将其路由到具有最新兼容版本的服 务器上。

 

第11阶段:将基础设施外包 给云提供商 购买和维护必要的硬件设备成本 可能非常高昂,使用中出现闲置的计 算资源更是浪费。闲置通常是不可避 免的,因为我们要按照负载高峰去配 备资源,所以非高峰时段就必然会出 现闲置。 为了更有效地利用计算资源,

 

我们可以考虑市场上的云提供商,比如,Amazon AWS或者Microsoft Azure。 将应用迁移到云上可能需要重 新设计,才能适应云环境的一些特 质,比如,要适应较高的网络延迟, 要计较带宽的成本,还要让应用程序 的设计适应数据库的“最终一致性” 模型。

 

640?wx_fmt=png


福利

扫描添加小编微信,备注“姓名+公司职位”,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!


640?wx_fmt=jpeg


推荐阅读:

  • 太形象了!什么是边缘计算?最有趣的解释没有之一!

  • 互联网出海十年

  • 华为员工年薪 200 万!真相让人心酸!

  • 天才程序员:25 岁进贝尔实验室,32 岁创建信息论  琥珀  极客宝宝  5天前

  • 安全顾问反水成黑客, 靠瞎猜盗得5000万美元的以太币, 一个区块链大盗的另类传奇

  • 人造器官新突破!美国科学家3D打印出会“呼吸”的肺 | Science


640?wx_fmt=png真香,朕在看了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/523870.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qt将光标相对于桌面的位置转换为相对于窗口的位置

提要 鼠标光标获取的位置cursor().pos()是相对于整个屏幕坐标的,鼠标进入窗口的范围内,判断光标是否在窗口中某控件的范围内,就需先将相对于整个电脑屏幕的鼠标位置,转换为相对于当前程序的窗口的位置,然后判断这个坐…

MyBatisPlus_通用service篇_入门试炼_05

文章目录1. service和impl2. 实战1. service和impl package com.gblfy.springboot.mybatisplus.service;import com.baomidou.mybatisplus.extension.service.IService; import com.gblfy.springboot.mybatisplus.entity.User;public interface UserService extends IService&…

SpringCloud微服务如何优雅停机及源码分析 | 技术头条

戳蓝字“CSDN云计算”关注我们哦!技术头条:干货、简洁、多维全面。更多云计算精华知识尽在眼前,get要点、solve难题,统统不在话下!作者:Trust_FreeDom转自:码农沉思录本文主要讨论的是微服务注册…

qt自定义行编辑器,用来加载颜色

提要 自定义行编辑器,点击后弹出颜色选择对话框,选择喜欢的颜色,确认后在行编辑器加载选中的颜色。 效果 选中某一个颜色后,行编辑器中加载所选的颜色。 示例 mylineedit.h #ifndef MYLINEEDIT_H #define MYLINEEDIT_H#inclu…

MyBatisPlus_AR篇_入门试炼_06

文章目录1. 实体类2. 实战1. 实体类 原则:继承Model package com.gblfy.springboot.mybatisplus.entity;import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.exten…

MyBatisPlus_更新篇_入门试炼_03

文章目录1. 实战更新1. 实战更新 package com.gblfy.springboot.mybatisplus.mapper;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.co…

qt使用样式表设置窗口widget为圆角

提要 窗口widget是无法直接通过样式表设置为圆角的,需要在窗口QWidget中拖入控件QFrame,将QFrame设置的和窗口QWidget一样大小,将窗口QWidget中需要的控件拖入到QFrame中。 示例 下面是一个提示工具的窗口。通过它简单的记录一下样式表怎么…

微软 Build 2019:IE 重生,Azure 成主角;华为拟在英剑桥新建半导体研发基地,与ARM做邻居……...

关注并标星星CSDN云计算极客头条:速递、最新、绝对有料。这里有企业新动、这里有业界要闻,打起十二分精神,紧跟fashion你可以的!每周三次,打卡即read更快、更全了解泛云圈精彩newsgo go go阿联酋联邦政府人工智能部长 …

qt获取当前场景中的所有图形项的层次

提要 场景中有多个窗口,窗口处于不断更新中,获取场景中当前所有窗口的图层。由于特定的结构,这里场景中的窗口采用自定义窗口,将该自定义窗口作为自定义代理窗口的窗口,图形项作为自定义代理窗口的父窗口,…

MyBatisPlus_删除篇_入门试炼_04

文章目录1. 实战删除1. 实战删除 package com.gblfy.springboot.mybatisplus.mapper;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybati…

完美起点更重要:青立方超融合易捷版 助力企业一步云就绪

戳蓝字“CSDN云计算”关注我们哦!技术头条:干货、简洁、多维全面。更多云计算精华知识尽在眼前,get要点、solve难题,统统不在话下!长跑,一项比短跑更具技术含量的运动,如果起跑过猛,…

MyBatis-Plus_查询进阶01

select语句中不列出全部字段 文章目录1. 形式12. 形式21. 形式1 /*** 1. 名字包含雨并且年齡小于40* sql&#xff1a;name like %雨% and age < 40*/Testpublic void selectByWrapperSupper() {QueryWrapper<User> queryWrapper new QueryWrapper<>(); // …

qt中处理精度丢失

提要 定义的qreal类型的变量在做减法和乘法时所得的值不正确。 示例 做减法运算 //参数定义 qreal m_lastScale;//上一次缩放比 qreal m_scale;//保存缩放比m_scale m_lastScale - 0.05;//变为减0.05后计算的值不对下面的方法可以解决精度丢失导致的计算所得的值不正确的问…

没有一家公司可以逃避边缘计算 | 技术头条

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;作者&#xff1a; Ariane转自&#xff1a;边缘计算社区边缘计算正在为数据中心的世界添…

Qt实现浮动窗口

提要 在窗口上悬浮鼠标&#xff0c;此时窗口标题栏显示&#xff0c;窗口变大&#xff0c;鼠标移开后&#xff0c;窗口恢复原来的大小&#xff0c;标题栏隐藏。 示例 直接上代码&#xff0c;只包含只要的代码部分。 在自定义的窗口中重写鼠标进入事件enterEvent和鼠标离开事件…

gblfy_IDEA常用快捷键技巧

文章目录一、IDEA常用快捷键1. 查找2. 注释3. 断点调试4. 复制/移动5. 提示二、为需要的菜单设置快捷键2.1. 先搜2.2. 后加三、查找快捷键对应的菜单/替换快捷键3.1. 先搜3.2. 再加3.3. 需移除一、IDEA常用快捷键 1. 查找 查找快捷键说明idea中对应菜单位置CTRLR当前文件替换…

qt编写触摸事件的关键

提要 无论你的电脑是支持触摸屏&#xff0c;还是你通过usb外部连接触摸屏&#xff0c;都能验证你的触摸程序功能。下面说说程序中使用触摸按钮等。 示例 按钮可以实现触摸功能&#xff1b;自动义控件可以实现触摸按下拖动&#xff1b;触摸长按出现对话框&#xff08;也可以是…

MyBatis-Plus_查询进阶05

查询专栏&#xff1a;select语句中不列出全部字段 文章目录1. 第一种形式2. 第二种形式1. 第一种形式 通过queryWrapper调用select方法&#xff0c;在select方法中添加需要查询的列 /*** 1. 名字包含雨并且年齡小于40* sql&#xff1a;name like %雨% and age < 40*/Testp…

甲骨文中国裁员已定,补偿为N+6;VMware联手云平台合作伙伴AsiaPac,闪耀狮城;对标英伟达,寒武纪新货曝光……...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 乐视改乐融&#xff0c;重新…

qt自定义窗口添加父窗口后,显示不出来

提要 继承于QDialog的类&#xff0c;在被其它类创建的改对象时&#xff0c;没设置父窗口前显示正常&#xff0c;设置了父窗口后显示不出来。 自定义窗口的构造函数 configBtnNameDialog::configBtnNameDialog(QWidget *parent) :QDialog(parent),ui(new Ui::configBtnNameDial…