A distributed system is a system whose components are located on different networked computers, which then communicate and coordinate their actions by passing messages to one other.
分布式系统是一种由分散在网络中的节点组合而成的大型软件系统,不同节点之间通过消息传递的形式进行通信和协作以完成特定的功能。分布式系统中的节点,不单单是指计算机 coumputer,一切有计算能力的设备都可以用来构建分布式系统,如智能冰箱/电视,传感器,短信猫,单片器,网络设备(路由器,交换机),手机 …
典型的分布式系统,如大型多人在线的游戏系统,电商系统,通信网络系统,工业控制系统,NFS,HDFS(Hadoop) 等等。按应用的类型,可简单的分为:
分布式系统的难点在于如何让大量、异构节点(单点故障问题)在复杂网络环境(超时、丢包)中协调工作,并实现透明(对用户不可见)、可扩展(节点的动态增删)、可用可靠、一致高效的目标。
相关的技术
负载均衡:
webserver:
service:
容器:
cache:
协调中心:
rpc框架:
消息队列:
实时数据平台:
离线数据平台:
dbproxy:
db:
搜索:
日志:
分布式系统的基本架构有 client-server(centralization), multi-tier(semi-centralization), 和 peer-to-peer(decentralization),更复杂的分布式系统也是由这三类基本架构组合而成。
(a), (b): a distributed system. (c): a parallel system.
分布式系统中有大量的节点,各节点结构不同、功能各异,如何相互通信,并协同作业以完成系统目标,是一个很大的课题,而这个课题的核心就是——IPC !
IPC(Inter-process communication)就是进程间通信,进程是基本的计算单元,是分布式系统中的基本节点。在开发多进程和分布式系统时,需要设计和选择合理有效的 IPC 方案。
由上图可知如下关系:
分布式系统通过 IPC 来实现组件或子系统之间的通信,IPC 分为两类:面向数据(data-centric) vs 面向消息(Message passing)。基于 Socket 的消息传输是分布式系统中最主要的通信方式,分为 RPC 和 Web Services 两大类。RPC 是面向函数的消息传递方式,Web Services 是面向服务的信息传递方式。
不知大家有没有想过,现代信息技术的起点是什么?—— 是通信!从电话,电报,无线广播,到电信系统,蜂窝通信,3G,4G,5G,互联网通信。通信是信息技术的骨架,软件出现的很晚,程控交换机直到上世纪70年代才出现。
计算机普出现之后,有了软件和软件系统,软件系统互联,就是分布式系统!
架构 = 节点 + 关系,在软件开发中,节点可以是函数,类,也可以是模块,库,子系统;关系就是函数调用和 IPC。函数调用和 IPC 本质上是有关数据传输/数据共享的问题,传什么(数据格式,xml?json?binary?string?),用什么传(tcp?http?),传到哪里(路由、寻址),同步还是异步?等等。
总而言之,通信是系统的骨架,所以 IPC 很重要!
做系统/框架开发(c语言)的同学,可能对 IPC 更熟悉一些,比如 UNIX域套接字就常用于在同一台机器上运行的进程之间的通信。UNIX域数据报服务是可靠的,既不会丢失消息也不会传递出错。
RPC(Remote procedure call)是 IPC 的一种,就是以函数调用的形式去执行远程主机上的函数,一般基于TCP协议,具有跨平台、跨语言(Java-RMI 例外)的特性,对于函数的调用方来说,RPC 的底层实现是透明的,由 RPC 框架(比如 Thrifth,gRPC)负责。简单地说, RPC 就是分布式系统中常见的一种通信模式。
RPC 的核心问题:
RPC 的协议有很多,比如最早的 CORBA,Java RMI,Hessian,Thrift,gRPC,SOAP。
RPC 的概念从函数调用衍化而来,而函数是一个编程概念,是程序员所关心的事物,也可以理解为 RPC 是从程序员的角度上提出的 IPC 方案,是程序员友好的!与之相对的概念就是服务(Service),服务是面向业务的,更上层。由此可见,RPC 是一种技术方案,而 SOA 是一种架构思想;RPC 是面向编程的概念,而 SOA 是面向业务和设计的概念。
通信很重要,但是在互联网发展的早期阶段,网络资源稀缺,高延迟,低带宽,易丢包,不稳定,等等,为了实现高效、可靠的信息传输,IPC/RPC 技术应运而生。然而随着互联网技术的发展,Web 技术也日趋成熟,RPC 开始显得有点过于技术化了,慢慢的人们将关注点从技术转移到业务——服务。
那么到底什么是服务?
先从生活中说起,在日常生活中,“为人民服务”,“服务业”,“售后服务”,“服务质量”,… “服务”的概念无处不在,可是“服务”是什么呢?怎么去定义它?它的内涵和外延分别是什么呢?思考这些问题对深入理解什么是软件服务以及服务与资源的关系有很大意义!
经济活动是一切有关于生产、分发、消费特定的商品(goods)或服务(Services)的人类活动;商品是生产劳动(productive labour)过程中创造的有形产品,如汽车、衣服,服务是非生产劳动(unproductive labour)过程中创造的无形产品,如教育、心理咨询、美容美发。
与之相对,
信息技术是一切有关于定义、传递、转换、存储、使用特定的数据(Data)和过程(Procedure)的计算机活动;数据就是信息载体,是信息资源,如变量,对象,Entity,Resource,Record,是有结构的,有形的;过程就是计算,是 computing,是指令,如函数,方法,服务…
要理解编程,先理解生活!
那么,生活中的服务有哪些特征呢?
服务的两种形式:
商品相关的服务:如汽车销售,汽车厂生产汽车这个商品,4S 店提供销售汽车的服务,这里的服务就与“汽车”这个商品直接相关;
商品无关的服务:如心理咨询,心理医生只是进行精神疏导,或者传输知识,是非生产劳动,这种服务不涉及任何有形商品。
服务具有方向性: 提供者 ==> 消费者
我始终认为,计算机/软件/信息技术中的所有模式都源于社会模式,信息系统中的节点就是社会中的人,人是如何交互、协作、沟通、工作的,信息系统中的节点也是如此。人类在进入信息化之前的几千年里,进行了各种各样的复杂活动,贸易,教育,外交,战争,工程建设,信息系统只不过是在让一切变得更快、更强!
分布式计算(算盘),异步,并发,层次化,中继,缓存,索引,编码等等所有在软件开发相关的概念,都能在社会中找到方案实例,架构的概念源自建筑。
因此,我们可以推断:
SOA(Service-oriented architecture)是一种软件设计风格,一种架构模式,一种以服务为核心的架构。组件之间通过服务的请求和响应来实现通信,完成特定的系统功能。
既然有面向服务的架构(SOA),那么就一定有非面向服务的架构,比如面向组件,或者模块化的架构,各组件/模块之间相互协作(双向),没有主从之分。在软件领域,协作就是模块化,模块与模块之间通过继承、组合、关联、聚集等方式建立关系。
SOA 的实现方案:
SOA 并不是个新鲜概念,它是软件技术进化中的一个阶段,软件系统开发从早期的分布式计算,模块化编程,进入到 SOA ,目前流行的 Mashups,SaaS(Software as service), PaaS(Platform as a Service),云计算(Cloud Computing),都可以视为 SOA 的衍生物。
SOA 并没有特定的传输协议,可以是 TCP,也可以是 HTTP。基于 HTTP 的服务称之为 Web 服务(Web Service)。
关于 web 开发,需要理解这么几个概念,以及它们之间的关系。
Web,HTTP,Web Server,Web client,Web Application Server,Web Service。
Web 就是万维网,不是互联网(Internet),不能混淆!
互联网是指所有通过 ip 协议连接起来的网络节点所构成的全局网络,包括 Web 万维网(HTTP),电子邮件网络(SMTP),文件共享网络(FTP),IP电话网,等等。电信网,蜂窝网有自己的传输协议,不属于互联网,但可以通过网关(协议转换器)接入互联网。
HTTP 就 Web 传输协议,更精确的说是一个基于请求-响应模式进行信息传输的无状态协议!
Web Server 是负责存储、处理和发布 web 资源的软件系统;Web Application 则是提供 Web 服务。在具体应用中,其实并不会那么清晰,比如 Tomcat,jetty 本身就是 HTTP Server,但又是 Servlet Container,能提供 application service。Nginx 也不单单是 Web Server,还提供各种复杂强大的功能,比如反向代理,缓存,负载均衡等等。
Web client 一般指浏览器,但广义上所有能发送 HTTP 请求的软件都可以称为 web client,如 curl, wget。在基于 Web Services 的分布式系统中,请求 Web service 的子系统都可以看做是 Web client。
阶段 | Web Client | Web Server |
---|---|---|
静态页面 | 浏览器,HTML | Apache,Nginx |
CGI | Perl,PHP | |
Java/.NET | Servlet + JSP vs .NET + ASP | |
Ajax + MVC | Ajax + jQuery | Struts, Ruby on Rails, SpringMVC |
MVVM + REST | Angular/vue |
Web service 通常泛指所有基于 HTTP 的服务,比如 Ajax,REST,是实现 SOA 的一种实现方案!
A web service is a software system designed to support interoperable machine-to-machine interaction over a network. It has an interface described in a machine-processable format (specifically WSDL). Other systems interact with the web service in a manner prescribed by its description using SOAP-messages, typically conveyed using HTTP with an XML serialization in conjunction with other web-related standards.
Web Service 是 machine-to-machine 的服务,其消费者是软件,不是面向用户的。
很显然,REST 是 Web Service 的一种实践方式,是一种 Web Service 架构风格。它与 SOAP 不同,尽管 SOAP 也常被用于构建 Web Service,但 SOAP 本身与传输协议无关,可以是 HTTP(web service),也可以是 SMTP,TCP 甚至 FTP,这种独立性必然会带来设计的复杂性,降低它的可用性和易用性。
与 SOAP-based Web Service 不同,REST 是一种架构风格,不是标准协议。在实现 RESTful 风格的 API 时会用到 HTTP,URI,JSON,和 XML 等其它 web 标准,REST 只提供架构的理念和约定(Architectural constraints),有时候尽管有些 Web Service 并没有完全遵从 REST 的架构约束,也同样会被称为 RESTful API。
REST(2000s) 就是为 Web Service 而生的,简洁、易用、易扩展!
那么,REST 到底什么呢?Representational State Transfer (REST),这个术语在字面上不直观,不好理解,什么是 Representational,表征的谁?State 是谁的 State?
先说 Representation,可以解释为表征,象征,代理,通俗的说就是符号,不是本体。这背后是一个很深刻的哲学问题,有兴趣的同学可以看一下《皮尔斯:论符号》。人类生活在一个表征的世界,概念的世界,符号的世界,我们口中的月亮、玉盘、太阴、Moon,都与那个围绕着地球旋转的星球有关,但指向月亮的手不是月亮,它们仅仅是指代那个星体的符号!但是在现实生活中,在各种各样的社会活动中,我们需要的恰恰是 Representation,而不是 Objectivity!比如,一个人去银行申请抵押贷款,业务员需要他提供资产证明(Representation),而不是资产实物。
同样的道理,在 web 事务/服务中,用户并不关心资源实体是什么,它可能是 xml 文件,也可能是数据表,可能是字符串,也可能是二进制,这都不重要,因为用户只关心它的 Representation,它的表征物。在 REST 中,资源实体被最终表征为 json/xml 或者字符串!用户通过 RESTful 请求以 transfer state 的形式表征资源实体的增删改查!
“Web resources” 起初是用来指代 web 中的文档/文件(HTML,js,css,image),现在它的涵义变得更加广泛和抽象,任何可以被请求的内容实体(如,字符串,XML,JSON…)都可以称之为 Web 资源。
Clean URLS: 简洁接口的设计
Clean URLs, also sometimes referred to as RESTful URLs, user-friendly URLs, or search engine-friendly URLs, are Uniform Resource Locators (URLs) intended to improve the usability and accessibility of a website or web service by being immediately and intuitively meaningful to non-expert users.
提高 web 接口的可用性、易用性、易理解性,URL 在概念上要简单、直接,结构上更能反映信息的数据结构,而不是信息在服务器中的存储结构。
SEO:search engine optimization。
URL 通常包括资源路径、名称和访问参数,访问参数中常常会包含一些含糊的、无关的元信息,比如
http://example.com/personal?country=china&province=shanghai&name=ligang&id=1001,
访问参数中信息是隔离的、含糊的,甚至是冗余的。如果修改为
http://example.com/personal/china/shanghai/ligang/1001
就会显得简洁、清晰多了。
Uncleaned URL | Clean URL |
---|---|
http://example.com/index.php?page=name | http://example.com/name |
http://example.com/about.html | http://example.com/about |
http://example.com/index.php?page=consulting/marketing | http://example.com/consulting/marketing |
http://example.com/products?category=12&pid=25 | http://example.com/products/12/25 |
http://example.com/cgi-bin/feed.cgi?feed=news&frm=rss | http://example.com/news.rss |
http://example.com/services/index.jsp?category=legal&id=patents | http://example.com/services/legal/patents |
http://example.com/kb/index.php?cat=8&id=41 | http://example.com/kb/8/41 |
http://example.com/index.php?mod=profiles&id=193 | http://example.com/profiles/193 |
http://en.wikipedia.org/w/index.php?title=Clean_URL | http://en.wikipedia.org/wiki/Clean_URL |
实现
WOA:Web-oriented architecture
SOA:Service-oriented architecture
WOA 是从 SOA 衍生出来的概念,可以简单地理解为基于 Web 的 SOA。
WOA = SOA + WWW + REST
The WOA Stack:
最佳实践
RESTful API 设计最佳实践可参考: Vinay Sahni:Best Practices for Designing a Pragmatic RESTful API
https://martinfowler.com/articles/microservices.html
devOps 与 微服务
(待续)
上世纪90年代流行的分布式技术,如DCOM,CORBA,RMI,范式是RPC,但各系统数据类型不一致,实现/调用机制不同,各系统间互通不可能。XML的出现,让数据类型一致了,SOAP的出现,让各系统可以相互调用了。Simple Object Access Protocol的原意是XML-RPC,但人们很快就发现方法调用太狭隘,而消息传递更加通用。WSDL即支持rpc/encoded也支持document/literal,但前者已成为历史遗留。
webservices是soa的道成肉身,rpc方式的webservices是历史遗留。
rest是roa的道成肉身。
(待续)
参考资料:
Webservice RPC风格 SOAP,REST风格 各之间的对比
什么是分布式系统,如何学习分布式系统
http://www.sohu.com/a/257413172_624053
https://en.wikipedia.org/wiki/List_of_web_service_frameworks