毕大从自身设计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数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分 ...
随机推荐
- 你说说对Java中SPI的理解吧
前言 最近在面试的时候被问到SPI了,没回答上来,主要也是自己的原因,把自己给带沟里去了,因为讲到了类加载器的双亲委派模型,后面就被问到了有哪些是破坏了双亲委派模型的场景,然后我就说到了SPI,JND ...
- 基础篇:JAVA.Stream函数,优雅的数据流操作
前言 平时操作集合数据,我们一般都是for或者iterator去遍历,不是很好看.java提供了Stream的概念,它可以让我们把集合数据当做一个个元素在处理,并且提供多线程模式 流的创建 流的各种数 ...
- 第15.38节 PyQt(Python+Qt)入门学习:containers容器类部件QDockWidget停靠窗功能详解
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.概述 QDockWidget类提供了一个可以停靠在QMainWin ...
- selenium常用的标签
1.selenium之 下拉选择框Select.反选框Deselect.options 我们通常会遇到两种下拉框,一种使用的是html的标签select,另一种是使用input标签做的假下拉框.后者我 ...
- Mysql 存储过程(变量、定义条件、处理程序、光标、流程控制构造)
最近由于有同事编写了存储函数,需要进行验证,但是对存储过程一直不是很了解,所以抽时间了解了一下存储过程的基本语法.本篇文章主要包括介绍了存储过程的5个小语法:declare语句的变量.定义条件.处理程 ...
- 【C/C++】C和C++11之enum枚举的使用细节
作者:李春港 出处:https://www.cnblogs.com/lcgbk/p/14101271.html 目录 一.前言 二.C中的枚举(enum) 2.1 C中枚举的大小 2.2 C中枚举的取 ...
- 团队作业6(A)-Alpha阶段项目复审
Alpha阶段项目复审 复审团队: 莫政 (3118005067). 卢耀恒(3118005065) . 许梓莹(3218005083). 梁小燕(3218005081).高嘉淳(3118005047 ...
- 前端webSocket和后台php
HTTP协议的特性:属于"请求-响应"模型,只有客户端发起了请求消息,服务器才能给出响应消息,没有请求,就没有响应:一个请求消息,服务器只能返回一个响应消息.有些特殊应用场景中,如 ...
- 深入浅出java的Map
HashMap的组成 首先了解数组和链表两个数据结构 1.数组 寻址容易,插入和删除元素困难 数组由于是紧凑连续存储,可以随机访问,通过索引快速找到对应元素,而且相对节约存储空间. 但正因为连续存储, ...
- feign代码自动生成插件
简介 feign对微服务之间的http调用做了一层封装,如果B项目想调用A项目的一个web服务,只需要编写对应的接口并标注FeignClient注解.但如果接口发生了变更,对应的Feign代码往往会忘 ...