毕大从自身设计HSF的角度出发谈服务化这回事
服务化的过去、现在和未来
服务化毫无疑问是技术圈一直火热的buzzword,而且其实已经非常多年了,这在日益更新的技术圈还挺神奇的,作为在服务化这个领域还从事过比较多年的人,觉得值得写一篇文章来说说我眼里的服务化的过去、现在和未来。
启蒙阶段
我应该是从2006年学习OSGi的时候开始第一次接触Service这个概念,不过OSGi的Service还指的的是单机应用,和之后服务化更多的是应用在分布式应用领域有挺大差别,但也有些共通之处,例如OSGi中的Service也同样具备定义、注册、发现这些机制,我之所以后来能加入淘宝估计也是因为我对OSGi Service这块的经验。
SOA落地阶段
2008年在淘宝我开始淘宝服务框架(HSF)的编写,和业务研发团队一起推进淘宝的服务化,这个时候的SOA火爆的不行,但更多的也只是概念,缺乏非常细节的落地Guideline或框架,这个时候业界的SOA的实现主要倡导两种方式,一种为用xml方式描述的service,例如WSDL,另一种则是esb。
我在设计HSF的时候,认为xml方式描述的service太复杂,而且其实也没有很清晰的指导例如服务的注册/发现应该怎么实现,尤其是在有集群、负载均衡场景的大型分布式系统中,更不用说服务化后会带来什么问题;至于esb,我认为在一个高并发的系统中,esb会成为极大的瓶颈点,最终导致系统的风险,所以最终我决定自己探索一个可用于落地SOA的服务框架到底应该怎么做,从而让大家基于这个框架就可以去做服务化,而不是还得先解读这个概念。
但由于缺乏经验,HSF的设计是出了挺多问题的,在系统设计之解决核心问题的设计这篇文章里基本都说到了,在这就不再去重复,最后总结下来就是我们可以看到一个服务框架的特征是:
简单的和单机开发框架集成的服务定义方式,例如在HSF中就是通过spring的bean定义方式来发布、订阅服务;
服务注册/发现机制,HSF采用的是引入一个ConfigServer来实现;
服务寻址和负载均衡,HSF采用的是无中心化的软件负载均衡方式,这个方式为支持可水平伸缩的服务调用是奠定了很好的基础的;
服务Tracing,HSF采用的是类似Google Dapper的方式,自己实现了一个内部代号为EagleEye的东西,以跟踪一个复杂的服务调用过程,这个对排查问题而言真的是至关重要,如果没有Tracing,服务化后的一堆问题是很麻烦的。
有了一个服务框架后呢,相对来说服务化就不是那么一个停留在概念阶段的东西,但对于服务化而言,服务框架不是全部,只是个基座而已,服务框架解决的更多的是服务化的技术问题,但服务化还有另外的核心问题是业务系统本身怎么服务化,应该把什么抽象为服务,服务的粒度怎么把控,这不是框架能搞定和指导的,这就得靠业务架构师了,而且除了这个外,服务化还会带来巨大的变化是组织结构需要相应的变化,因为在服务化之前,通常分工是不会太明晰的,而服务化后,就会有这样的要求,这对很多企业来说,是推进服务化最难的地方。
回顾这个阶段的话,可以看到的是这个阶段更重要的是让SOA这个概念有了一个更为清晰的可落地的框架出现,从而大家不用在纯粹的技术概念层面去争吵,比较概念这玩意吵个十年都没问题,框架的出现使得大家去落地服务化更多的进入了真正的实操阶段,去思考业务系统应该怎么抽象和定义服务,组织结构需要相应的如何调整。
淘宝大概在2009年可以认为服务化就进入了比较成熟的阶段了(那个时候差的主要是Tracing),在那之后如果看中国范围的企业,可以看到的是更多的互联网公司开始进行服务化的改造,由于当时开源界完全没有可用的服务框架,各家基本都自己打造,不过思想基本类似;如果视野放宽到全球的互联网公司,会看到google、facebook、ebay等其实是在更早的时候就完成了服务化的改造,并且google做的分享(Jeff Dean有一次在Stanford的分享讲到了Google的服务化)或者发表的一些论文(例如影响巨大的Dapper)里都可以看到对服务框架的一些组件的定义,只是没有那么系统化的说一个服务化的框架的组成,所以这样去看的话,阿里的整个服务化进程,通过分享以及后面开源的dubbo,对中国的企业进行服务化改造还是起到了一些帮助的。
微服务?
又过了很多年,SOA好像越来越不火了,突然有个新的概念:微服务火起来了,我到现在都没搞清楚微服务和淘宝在08年做的服务化的区别到底是什么,看了很多解读,我也还是不得要领,有见解的同学欢迎评论指导下,所以我对微服务就不做什么阐述了,这个对服务化唯一的好处我觉得就是又吸引了巨多人的关注。
Service Mesh
这个是继微服务后在服务化领域最火的概念了,同样,目前这东西和当年SOA一样,我觉得也更多的还只是概念,尽管已经有Istio、Envoy、RSocket、Knative等等东西出现了,但实践层面还挺缺少的,目前还是一个战国时代。
Service Mesh这概念我之前也一直看不太懂,现在我基本上认可Service Mesh确实是推进服务化领域发展的一个方法,原因是我认为Cloud Native一个很核心的点是打造一套开放、公共的技术体系,而看起来Service Mesh是实现这个的不错的思路,它会带来两个好处:
对客户而言,采用Service Mesh使得在vendor no lock-in上有了很大的帮助,因为只要各家vendor在功能层面能差不多,mesh的sidecar方式使得客户非常容易切换vendor,不影响业务层面的代码;
对云计算厂商而言,采用Service Mesh使得在对接多种协议层面有了很简单的实现方法,这样就可以很好的实现同一技术领域不同产品的互通,这对一个开放、公共的技术体系而言挺重要的,同样也会使得客户move to cloud变的更加容易。
所以我认为Service Mesh最后成的那家一方面是实践的经验,另一方面则是对不同领域的不同技术产品协议的对接丰富度,我也非常看好service mesh成为新一代的服务化的实现方式。
总结
服务化的技术经过这么多年的发展,经历了SOA概念,到帮助SOA落地的服务框架,到微服务,到未来的Service Mesh,现在仍然活跃在技术的舞台上,并且其实大部分企业还在经历多数互联网公司早期服务化的阶段,当然,诉求我觉得差别很大,互联网公司做服务化多数其实是为了解水平伸缩的问题,现在大部分企业服务化更多的是为了解业务互通、大规模研发团队协作的问题,所以仍然非常看好这个领域的发展。
毕大从自身设计HSF的角度出发谈服务化这回事的更多相关文章
- nodejs高并发大流量的设计实现,控制并发的三种方法
nodejs高并发大流量的设计实现,控制并发的三种方法eventproxy.async.mapLimit.async.queue控制并发Node.js是建立在Google V8 JavaScript引 ...
- 商业智能(BI)可视化大屏的设计及使用原则
信息时代,数据是一种可贵的资源,我们可能经常听到的一句话就是:用数据说话.但是,在没有进行系统化整理之前,数据不过只是一串串冰冷的数字,我们很难从大量的数据中获取到有价值的信息.只有通过合适的可视化工 ...
- ES:PB级别的大索引如何设计
一.单个大索引的缺陷 如果每天亿万+的实时增量数据呢,基于以下几点原因,单个索引是无法满足要求的: 1.存储大小限制维度 单个分片(Shard)实际是 Lucene 的索引,单分片能存储的最大文档数是 ...
- 与焊接厂交流——从生产角度出发的PCB设计心得
上周的时候,去了趟加工厂盯电路板的焊接进度.然后在闲余的时候,跟焊接厂的工程师交流了一下,工程师从生产的角度,说了几个值得注意的事项: 1.元件的焊盘应该要窄长,不能过宽.因为,在过机表贴时,焊盘上的 ...
- 数据结构大二课程设计:QT实现线段树
源码以及编译文件下载地址:http://download.csdn.net/detail/zhiyanpianyu1234/9445909#comment 加入了一些小东西,一直觉得课设是做给自己看的 ...
- 从实力的角度出发来思考这道AOP题目
文/楠木大叔 技术更迭,一往无前.技术人总是要不断学习以适应社会的发展和行业对我们的要求.每隔一段时间,就会有纷至沓来的新技术,新知识,新概念,我们应该如何应对,是被逼到墙角,还是主动出击? 导读 从 ...
- (转)运维角度浅谈MySQL数据库优化
转自:http://lizhenliang.blog.51cto.com/7876557/1657465 一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架 ...
- 运维角度浅谈MySQL数据库优化(转)
一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分 ...
- 从运维角度浅谈 MySQL 数据库优化
一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分 ...
随机推荐
- PyQt(Python+Qt)学习随笔:QListView的wordWrap属性
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QListView的wordWrap属性与QTableView的wordWrap属性功能完全相同,用 ...
- PyQt(Python+Qt)学习随笔:Qt Designer中部件的toolTip、toolTipDuration、statusTip、whatsThis属性
toolTip属性 toolTip属性设置部件的toolTip提示信息,toolTip提示信息在鼠标放到控件上会浮动出一个小框显示提示信息.默认情况下,仅显示活动窗口子部件的toolTip,可以通过在 ...
- js之数组乱序
这是最近面试遇到的,不过忘记了,之前也有印象刷到过这道题,就再次记录一下加深印象吧,听到最多的答案是利用sort方法,不过也有说这种方法不好,利用了快排和插入排序,那就整理下吧 <!DOCTYP ...
- 【学习笔记】使用 bitset 求解较高维偏序问题
求解五维偏序 给定 \(n(\le 3\times 10^4)\) 个五元组,对于每个五元组 \((a_i, b_i, c_i, d_i, e_i)\),求存在多少个 \(1\le j\le n\) ...
- 页面上下载canvas中的内容作为图片
使用如下代码,获得Canvas图像对应的data URI,也就是平常我们所说的base64地址 var dataUrl = document.getElementById("canvasId ...
- Nginx的安装及相关配置
Nginx的安装及相关配置 Nginx 是 C语言 开发,建议在 Linux 上运行,当然,也可以安装 Windows 版本,本篇则使用 CentOS 7 作为安装环境. 一. gcc 安装 安装 n ...
- 前端使用canvas生成盲水印的加密解密
为了保障信息安全,防止重大信息泄露,并且能够锁定泄露用户,需要对页面展示的图片加入当前用户信息的盲水印,即最终图片外观看起来和原图一样,但是经过解码以后可以识别出水印信息,并且在截图后仍能进行较好的识 ...
- Exception in thread "main" java.lang.RuntimeException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient
hive安装时遇到的问题 解压后指定了hive-env.sh文件的Hadoop_home & hive_conf 两个参数后,先直接bin/hive 用Derby数据库启动一下,然后再配置其 ...
- Hbase备份以及清表脚本
脚本主要是方便自己工作使用,服务器环境中配置了hbase相关环境变量 1.hbase备份脚本 #!/bin/bash tableList=("table1" "table ...
- C++回调函数的理解与使用
一.回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在 ...