毕大从自身设计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数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分 ...
随机推荐
- 第8.22节 Python案例详解:重写 “富比较”方法控制比较逻辑
一. 案例说明 本节定义一个小汽车的类Car,类中包括车名carname.百公里油耗oilcostper100km.价格price三个属性.然后实现__lt__.__gt__.__le__.__ge_ ...
- PyQt学习随笔:QTableWidget水平表头horizontalHeader、竖直表头verticalHeader的相关操作方法
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTableWidget表格部件的表头包括水平表头和竖直表头,水平表头每节对应表格的一列,竖直表头对 ...
- 西湖论剑2020MISC-Yusa_yyds
非常规USB流量分析 附件下载: 链接:https://pan.baidu.com/s/1Gjgj1EH9qmX0PYi21uYlDg 提取码:x9xn 先提取USB流量数据,使用工具: https: ...
- Docker-使用数据卷在宿主机和容器间的数据共享
场景一:现在用Docker创建了N个容器,但是这些容器之间需要数据共享,这个时候我们应该怎么办?[参考第四步] 场景二:docker创建了一个容器并进入容器,添加了一些定制功能,此时除了用docker ...
- python中的Restful
哇,昨天组里进行总结的时候,小哥哥和小姐姐真是把我给秀到了,跟他们一比,我总结的太垃圾了,嘤嘤嘤.因为我平常不怎么总结,总结的话,有word还有纸质的,现在偏向于纸质,因为可以练练字.个人观点是,掌握 ...
- 深入分析 Java 乐观锁
前言 激烈的锁竞争,会造成线程阻塞挂起,导致系统的上下文切换,增加系统的性能开销.那有没有不阻塞线程,且保证线程安全的机制呢?--乐观锁. 乐观锁是什么? 操作共享资源时,总是很乐观,认为自己可以成功 ...
- CSP-S 2019 Solution
Day1-T1 格雷码(code) 格雷码是一种特殊的 \(n\) 位二进制串排列法,要求相邻的两个二进制串恰好有一位不同,环状相邻. 生成方法: \(1\) 位格雷码由两个 \(1\) 位的二进制串 ...
- ubuntu18.04 登录界面循环,已解决
按照百度的方法,要卸载重装nvidia,遇到如下问题 1.进入Ubuntu字符界面,出现乱码,猜测是sudo命令出现问题,果然 解决方案:$ PATH=/usr/kerberos/sbin:/usr/ ...
- 前端进阶之认识与手写compose方法
目录 前言:为什么要学习这个方法 compose简介 compose的实现 最容易理解的实现方式 手写javascript中reduce方法 redux中compose的实现 参考文章 最后 前言:为 ...
- Spring Cloud Alibaba (一): SpringCloud与SpringBoot版本选型
前言 近年SpringCloud与SpringBoot更新迭代非常频繁,导致我们对两者的版本选型非常的困难.若是版本选择有问题, 会导致开发中调试兼容性占用非常多的得必要时间. SpringClo ...