资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,二级,三级,四级,五级,2021/8/21,柳伟卫,分布式系统开发实战,#,单击此处编辑母版标题样式,单击此处编辑母版文本样式,二级,三级,四级,五级,2021/8/21,柳伟卫,分布式系统开发实战,#,分布式系统开发实战,第,1,章 分布式系统概述,本章学习,什么是分布式系统,分布式系统常用术语,集中式系统与分布式系统,分布式系统特征,设计分布式系统所面临的挑战,柳伟卫,分布式系统开发实战,2,1.1,什么是分布式系统,分布式系统原理与范型,:“,分布式系统是,若干,独立计算机的集合,这些计算机对于用户来说就像,单个,相关系统,”。,硬件独立;软件统一。,柳伟卫,分布式系统开发实战,3,1.2,分布式系统常用术语,节点(,Node,),是指一个可以独立按照分布式协议完成一组逻辑的程序个体。在具体的工程项目中,一个节点往往是一个操作系统上的进程。节点是一个完整的、不可分的整体,是执行分布式任务的最小的单元。,在这个高可用的分布式系统中,相同功能的程序往往会部署到不同的节点中。这种模式也称为“,副本(,Replica,),”。副本指在分布式系统中为数据或服务提供的冗余,因此可分为数据副本和服务副本。,相同功能程序的副本,统称为该功能的,集群,。,节点与节点之间是完全独立、相互隔离的,节点之间传递信息的唯一方式是网络,通信(,Communication,),节点可以通过将数据写入某台机器的本地,存储(,Storage,),设备来保存数据。通常的存储设备可以是磁盘、,SSD,、文件,也可以是关系型数据库、,NoSQL,数据库、文件存储系统等。,柳伟卫,分布式系统开发实战,4,1.2,分布式系统常用术语,如果某个节点负责存储、读取数据,则该节点为有,状态,的节点,反之称为无状态的节点。,异常,主要是针对某个节点而言的。异常可能是由网络故障引起的,也可能是程序自身引起的。需要注意的是,在高可用的分布式系统中,单个节点的异常,并不一定会影响整个分布式系统。分布式系统往往会设计一定的,容错性,。,常见的,性能,指标有:吞吐能力、响应延迟、并发能力。,分布式系统为了提高可用性,总是不可避免地使用副本的机制,从而引发副本,一致性,的问题。,柳伟卫,分布式系统开发实战,5,1.3,集中式系统与分布式系统,集中式系统的优点,:,便于维护,操作简单。,集中式系统的缺陷,:容易,造成单点故障,;,系统进行扩展和升级往往也比较麻烦,。,柳伟卫,分布式系统开发实战,6,1.3,集中式系统与分布式系统,分布式系统是通过中间软件来对现有计算机的硬件能力和相应的软件功能进行重新配置和整合。,分布式系统优点,:硬件成本低;易于维护;高可用性。,柳伟卫,分布式系统开发实战,7,1.4,分布式系统特征,可用性,可扩展性,高并发,透明性,开放性,安全性,柳伟卫,分布式系统开发实战,8,1.5,设计分布式系统所面临的挑战,如何将系统拆分为子系统?,如何规划子系统间的通信?,如何考虑通信过程中的安全?,如何让子系统可以扩展?,如何保证子系统的可靠性?,如何实现数据的一致性?,柳伟卫,分布式系统开发实战,9,1.6,本章小结,本章介绍了分布式系统的基本概念,包括分布式系统的常用术语及分布式系统的基本特征。同时,也抛出了设计分布式系统时所需要关注的重点和难点,为下一步的学习指明了方向。,柳伟卫,分布式系统开发实战,10,1.7,习题,什么是分布式系统?,如何理解分布式系统的“硬件独立,软件统一”?,分布式系统有哪些特征?请列举出至少五个。,柳伟卫,分布式系统开发实战,11,分布式系统开发实战,第,2,章 节点,本章学习,节点上的进程、线程、纤程的概念及其之间关系,网络通信常见的异常场景,柳伟卫,分布式系统开发实战,13,2.1,什么是线程,线程是程序执行流的最小单元。,一个标准的线程由线程,ID,、当前指令指针(,PC,)、寄存器集合和堆栈组成。,线程是进程中的一个实体,是被系统独立调度和分派的基本单位。,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。,一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。,由于线程之间的相互制约,致使线程在运行中呈现出间断性。,柳伟卫,分布式系统开发实战,14,典型的线程拥有三种基本状态,就绪;,阻塞;,运行。,柳伟卫,分布式系统开发实战,15,2.2,进程和线程,进程有一个独立的执行环境。,进程通常有一个完整的、私人的基本运行时资源。,特别是每个进程都有自己的内存空间。,进程往往被视为等同于程序或应用程序。,支持进程间通信(,Inter Process Communication,,,IPC,),。,线程有时被称为轻量级进程(,Lightweight Process,,,LWP,)。,创建一个新的线程比创建一个新的进程需要更少的资源。,线程不像进程那样彼此隔离以及受到操作系统的自动保护,所以在多线程程序开发过程中需要开发人员做更多的努力。,柳伟卫,分布式系统开发实战,16,2.3,线程和纤程,某些编程语言中提供了“,纤程,”(,Fiber,)的概念,比如,Golang,的,goroutine,,,Erlang,风格的,actor,。,Java,语言虽然没有定义纤程,但仍有一些第三方库可供选择,比如,Quasar,。纤程可以理解为是比线程更加细颗粒度的并发单元。,由于纤程是以用户方式代码来实现的,并不受操作系统内核管理。,纤程采用了非抢占式调度方式,而线程是抢占式调度的。,一个线程可以包含一个或多个纤程。,使用纤程可以获得更高的并发量,但同时也要面临着自己实现调度纤程的复杂度。,柳伟卫,分布式系统开发实战,17,2.4,编程语言中的线程对象,提供,Runnable,对象,继承,Thread,类,柳伟卫,分布式系统开发实战,18,2.5,节点之间的通信,消息丢失,消息乱序,数据错误,不可靠的,TCP,柳伟卫,分布式系统开发实战,19,2.6,本章小结,本章介绍了节点上的进程、线程、纤程的概念及其之间关系。在实际编程中,大多数编程语言都提供了线程。本章也以,Java,语言为例提供了线程编程的范例。,在本章的最后探讨了节点之间的通信。网络通信往往是不可靠的,因此设计分布式系统时需要考虑众多的通信异常的场景。,柳伟卫,分布式系统开发实战,20,2.7,习题,请简述线程和进程的关系。,请简述线程和纤程的关系。,请用你熟悉的编程语言编写一个线程操作的示例。,请列举节点之间的通信常见的异常场景。,柳伟卫,分布式系统开发实战,21,分布式系统开发实战,第,3,章 通信,进程间的通信是一切分布式系统的核心。如果没有通信机制,分布式系统的各个子系统将是“一盘散沙”,毫无作用。,柳伟卫,分布式系统开发实战,23,本章学习,网络通信的基础知识,。,常用的通信方式。,柳伟卫,分布式系统开发实战,24,3.1,进程间通信,进程间通信(,Inter-Process Communication,,,IPC,)指至少两个进程或线程间传送数据或信号的一些技术或方法。,每个进程彼此是隔离的。为了能使不同的进程互相访问资源并进行协调工作,才有了进程间通信。,这些进程可以运行在同一计算机上或网络连接的不同计算机上。进程间的通信技术包括消息传递、同步、共享内存和远程过程调用。,进程间通信是一种标准的,UNIX,通信机制。,进程间通信可以分为本地过程调用和远程过程调用。,柳伟卫,分布式系统开发实战,25,3.1.1,本地过程调用的概念,本地过程调用(,Local Procedure Call,,,LPC,)是指被调用的过程(函数)与调用过程处于同一个进程中。,柳伟卫,分布式系统开发实战,26,3.1.2,本地过程调用的实现,服务端进程建立命名服务器连接端口对象,并等待客户端连接;,客户端通过向这一端口发送消息来建立连接;,如果服务端同意建立连接,便会建立两个无名端口:,客户端连接端口:客户线程由此向服务端发送数据;,服务端连接端口:服务端由此向客户端发送数据;每个客户端都分配一个独立的接口;,服务端持有一个服务连接端口的句柄,同时客户端也持有一个客户连接端口的句柄,这样进程间通信的通道就建立了。,柳伟卫,分布式系统开发实战,27,3.2,远程过程调用,RPC是远程过程调用(Remote Procedure Call)的缩写形式。,RPC,是指计算机,A,上的进程,调用另外一台计算机,B,上的进程,其中,A,上的调用进程被挂起,而,B,上的被调用进程开始执行,当值返回给,A,时,,A,进程继续执行。调用方可以通过使用参数将信息传送给被调用方,而后可以通过传回的结果得到信息。而这一过程,对于开发人员来说是透明的。,远程过程调用采用客户机,/,服务器(,C/S,)模式。请求程序就是一个客户机,而服务提供程序就是一台服务器。,和常规或本地过程调用一样,远程过程调用是同步操作,在远程过程结果返回之前,需要暂时中止请求程序。使用相同地址空间的低权进程或低权线程允许同时运行多个远程过程调用。,柳伟卫,分布式系统开发实战,28,3.2.1,远程过程调用原理,柳伟卫,分布式系统开发实战,29,3.2.2,如何实现远程过程调用,如何传递参数,如何表示数据,如何选用传输协议,出错时会发生什么,远程调用的语义是什么,远程调用的性能怎么样,远程调用安全吗,远程过程调用的优点,柳伟卫,分布式系统开发实战,30,3.2.3,远程过程调用,API,名称服务操作,绑定操作,终端操作,安全操作,国际化操作(可能),封送处理,/,数据转换操作,存根内存管理和垃圾收集,程序标识操作,对象和函数的标识操作,柳伟卫,分布式系统开发实战,31,3.2.4,远程过程调用发展历程,第一代,RPC,第二代,RPC,支持对象,第三代,RPC,以及,Web Services,柳伟卫,分布式系统开发实战,32,3.3,常用网络,I/O,模型,阻塞,I/O,;,非阻塞,I/O,;,I/O,复用(,select,和,poll,);,信号驱动,I/O,(,SIGIO,);,异步,I/O,(,Posix.1,的,aio_,系列函数)。,柳伟卫,分布式系统开发实战,33,3.3.1,阻塞,I/O,模型,阶段,1,:等待数据就绪。网络,I/O,的情况就是等待远端数据陆续抵达;磁盘,I/O,的情况就是等待磁盘数据从磁盘上读取到内核态内存中。,阶段,2,:数据复制。出于系统安全,用户态的程序没有权限直接读取内核态内存,因此内核负责把内核态内存中的数据复制一份到用户态内存中。,柳伟卫,分布式系统开发实战,34,3.3.2,非阻塞,I/O,模型,socket,设置为,NONBLOCK,(非阻塞)就是告诉内核,当所请求的,I/O,操作无法完成时,不要将进程睡眠,而是立刻返回一个错误码(,EWOULDBLOCK,),这样请求就不会阻塞;,I/O,操作函数将不断地测试数据是否已经准备好,如果没有准备好,继续测试,直到数据准备好为止。整个,I/O,请求的过程中,虽然用户线程每次发起,I/O,请求后可以立即返回,但是为了等到数据,仍需要不断地轮询、重复请求,这是对,CPU,时间的极大浪费。,数据准备好了,从内核复制到用户空间。,柳伟卫,分布式系统开发实战,35,3.3.3 I/O,复用模型,I/O,复用会用到,select,或者,poll,函数,在这两个系统调用中的某一个上阻塞,而不是阻塞于真正的,I/O,系统调用。,同时对多个读操作、多个写操作的,I/O,函数进行检测,直到有数据可读或可写时,才真正调用,I/O,操作函数。,柳伟卫,分布式系统开发实战,36,3.3.4,信号驱动,I/O,模型,允许,socket,进行信号驱动,I/O,,并通过调用,sigaction,来安装一个信号处理函数,进程继续运行并不阻塞。,当数据准备好时,进程会收到一个,SIGIO,信号,可以在信号处理函数中调用,recvfrom,来读取数据报,并通知主循环数据已准备好被处理,也可以通知主循环,让它来读取数据报。,柳伟卫,分布式系统开发实战,37,3.3.5,异步,I/O,模型,异步,I/O,是,POSIX,规范定义的。通常,这些函数会通知内核来启动操作并在整个操作(包括从内核复制数据到我们的缓存中)完成时通知我们。,该模式与信号驱动,I/O,(,SIGIO,)模型的不同点在于,驱动,I/O,(,SIGIO,)模型告诉我们,I/O,操作何时可以启动,而异步,I/O,模型告诉我们,I/O,操作何时完成。,调用,aio_read,函数,告诉内核传递描述字、缓存区指针、缓存区大小、文件偏移,然后立即返回,我们的进程不阻塞于等待,I/O,操作的完成。当内核将数据复制到缓存区后,才会生成一个信号,来通知应用程序。,柳伟卫,分布式系统开发实战,38,3.4 I/O,操作中的常用术语,阻塞,是指,I/O,操作需要彻底完成后才返回到用户空间;,非阻塞,是指,I/O,操作被调用后立即返回给用户一个状态值,无须等到,I/O,操作彻底完成。,同步,是指用户线程发起,I/O,请求后需要等待或者轮询内核,I/O,操作完成后才能继续执行;,异步,是指用户线程发起,I/O,请求后仍继续执行,当内核,I/O,操作完成后会通知用户线程,或者调用用户线程注册的回调函数。,柳伟卫,分布式系统开发实战,39,3.5,实战:在,Java,中实现常用网络,I/O,模型,Java OIO,Java NIO,Java AIO,柳伟卫,分布式系统开发实战,40,3.6,事件驱动,所谓事件驱动,简单地说就是你点什么按钮(即产生什么事件),电脑执行什么操作(即调用什么函数)。,事件驱动的核心自然是事件。,事件驱动程序的基本结构是由一个事件收集器、一个事件发送器和一个事件处理器组成。,事件收集器专门负责收集所有事件,包括来自用户的(如鼠标、键盘事件等)、来自硬件的(如时钟事件等)和来自软件的(如操作系统、应用程序本身等)。,事件发送器负责将收集器收集到的事件分发到目标对象中。,事件处理器做具体的事件响应工作,它往往要到实现阶段才完全确定。,对于框架的使用者来说,他们唯一能够看到的是事件处理器。这也是他们所关心的内容。,柳伟卫,分布式系统开发实战,41,3.6.1,事件驱动编程,事件驱动编程通常只是用一个执行过程,,CPU,之间不是并发的,在处理多任务的时候,事件驱动编程是使用协作式处理任务,而不是多线程的抢占式。,事件驱动简洁易用,只需要注册感兴趣的事件,在回调中设计逻辑就可以了。,在调用的过程中,事件循环器(,Event Loop,)在等待事件的发生,跟着调用处理器。事件处理器不是抢占式的,处理器一般只有很短的生命周期。,柳伟卫,分布式系统开发实战,42,3.6.2,事件循环的实现,事件循环(,Event Loop,)是一个程序结构,用于等待和发送消息和事件。,事件驱动编程的代码核心就是,事件循环器,。,基于事件驱动主要有两种设计模式:,Reactor,和,Proactor,。,柳伟卫,分布式系统开发实战,43,3.6.3 Reactor,模型,柳伟卫,分布式系统开发实战,44,3.6.4 Proactor,模型,柳伟卫,分布式系统开发实战,45,3.7,本章小结,本章介绍了节点之间的通信方式,包括本地过程调用、远程过程调用、以及在通信过程中所要设计的,I/O,操作。同时介绍了常见的,I/O,模块,包括,OIO,、,NIO,、,AIO,、,Reactor,、,Proactor,等。,本章也以,Java,语言为例提供了常用网络,I/O,模型的范例。,柳伟卫,分布式系统开发实战,46,3.8,习题,请简述本地过程调用和远程过程调用调用的概念及两者之间的区别。,请列举常见的远程过程调用实现方式有哪些?,请列举常见的常用网络,I/O,模型有哪些?他们之间有什么区别?,请简述阻塞和非阻塞、同步和异步之间的区别。,请用你熟悉的编程语言编写一个简单的,Echo,服务器示例。,请简述,Reactor,和,Proactor,的区别。,柳伟卫,分布式系统开发实战,47,分布式系统开发实战,第,4,章 并发与并行,分布式系统的一个重要特征就是计算能力是可以并发或者并行的。在分布式系统中,往往会将一个大任务进行分解,而后下发给不同的节点去计算,从而节省整个任务的计算时间,柳伟卫,分布式系统开发实战,49,本章学习,并发,并行,柳伟卫,分布式系统开发实战,50,4.1,并发与并行的区别,并发是同一时间应对(,dealing with,)多件事情的能力;并行是同一时间动手做(,doing,)多件事情的能力。,并发(,concurrency,)属于问题域(,problem domain,),并行(,parallelism,)属于解决域(,solution domain,)。,并行和并发的区别在于有无状态,并行计算适合无状态应用,而并发解决的是有状态的高性能;有状态要着力解决并发计算,无状态要着力并行计算,云计算要能做到这两种计算自动伸缩扩展。,柳伟卫,分布式系统开发实战,51,4.2,线程与并发,多个线程也可以被同时调度到多个,CPU,上运行。,多线程编程使得程序任务并发成为了可能。,并发控制主要是为了解决多个线程之间资源争夺等问题。,并发一般发生在数据聚合的地方,只要有聚合,就有争夺发生,传统解决争夺的方式采取线程锁机制,这是强行对,CPU,管理线程进行人为干预,线程唤醒成本高,新的无锁并发策略来源于异步编程、非阻塞,I/O,等编程模型。,柳伟卫,分布式系统开发实战,52,4.3,并发带来的风险,安全性问题,活跃度问题,性能问题,柳伟卫,分布式系统开发实战,53,4.4,解决并发风险,同步(,Synchronization,),原子访问(,Atomic Access,),柳伟卫,分布式系统开发实战,54,4.5,提升系统并发能力,无锁化设计,缓存,更细颗粒度的并发单元,柳伟卫,分布式系统开发实战,55,4.6,本章小结,本章介绍了并发与并行的概念。通过并发与并行,使分布式系统计算大型任务成为了可能。但需要注意的是,使用多线程编程来实现并发时,需要考虑并发所带来的风险,诸如安全性问题、活跃度问题以及性能问题等。,本章也介绍了避免并发问题的一些方式,同时也介绍了常用的提升并发能力的方案。,柳伟卫,分布式系统开发实战,56,4.7,习题,请简述并发与并行的区别。,请简述并发可能会带来哪些风险。,请简述如何来避免并发可能带来的风险。,请列举提升系统并发能力的方案有哪些。,柳伟卫,分布式系统开发实战,57,分布式系统开发实战,第,5,章 面向对象的分布式架构,面向对象编程是非常流行的编程模式,因此,在分布式系统中,基于对象来设计分布式架构是自然而然的。,柳伟卫,分布式系统开发实战,59,本章学习,面向对象的分布式架构,柳伟卫,分布式系统开发实战,60,5.1,基于对象的分布式架构,在基于对象的分布式系统中,对象的概念在分布式实现中起着极其关键的作用。从原理上来讲,所有的一切都可以被作为对象抽象出来,而客户端将以调用对象的方式来获得服务和资源。,分布式对象之所以成为重要的范型,是因为它相对比较容易地把分布的特性隐藏在对象接口后面。此外,因为对象实际上可以是任何事务,所以它也是构建系统的强大范型。,柳伟卫,分布式系统开发实战,61,5.2,常用的分布式对象系统,微软,DCOM,CORBA,Java RMI,柳伟卫,分布式系统开发实战,62,5.3,分布式对象系统优缺点,主要优点是支持面向对象编程。,只支持针对特定的平台。以微软,DCOM,(,COM+,)、,Java RMI,为例,这些分布式对象系统只能在特定的平台下才能使用,比如微软,DCOM,(,COM+,)只能在微软的操作系统下才能使用,而,RMI,只能在,Java,平台下使用。,规范复杂,实现困难。典型的例子是,CORBA,,虽然,CORBA,的规范非常完善,也号称支持跨平台,但允许,CORBA,本身的复杂性,导致了厂商在实现,CORBA,时产生了非常大的差异,导致了不同的,CORBA,实现之间会出现缺乏互操作性的现象。同时,,CORBA,过于复杂,导致能很好使用,CORBA,的人很好。这也是为什么,CORBA,无法继续流行的原因。,柳伟卫,分布式系统开发实战,63,5.4,实战:基于,Java RMI,实现分布式对象通信,同步(,Synchronization,),原子访问(,Atomic Access,),柳伟卫,分布式系统开发实战,64,5.5,本章小结,本章介绍了基于对象的分布式系统架构及常用的分布式对象系统,包括微软,DCOM,(,COM+,)、,CORBA,、,Java RMI,。,同时我们也认识到分布式对象系统有其优点也有其缺点,在实际应用中,要根据实际的场景来考虑哪种分布式对象系统技术。比如,在特定的平台,我们可以使用与该平台所对应的分布式对象系统技术,比如针对微软平台,我们可以使用,DCOM,(,COM+,)技术;在,Java,平台,我们可以使用,Java RMI,技术。如果平台具有多样性,或者没有办法统一到相同的技术上来,那么可以选择使用跨平台的分布式技术,比如,CORBA,。,柳伟卫,分布式系统开发实战,65,5.6,习题,请简述基于对象的分布式架构的实现原理。,常用的分布式对象系统有哪些?他们具有怎么样的特点?又有哪些不足?,请用你熟悉的技术编写一个应用,以实现分布式对象的通信。,柳伟卫,分布式系统开发实战,66,分布式系统开发实战,第,6,章 面向服务的分布式架构,面向对象的分布式架构有其限制,比如与平台强关联、实现复杂等。因此,近些年来,面向服务的分布式架构逐渐兴起。,柳伟卫,分布式系统开发实战,68,本章学习,面向服务的分布式架构,柳伟卫,分布式系统开发实战,69,6.1,什么是面向服务的架构,可重用:一个服务创建后能用于多个应用和业务流程。,松耦合:服务请求者到服务提供者的绑定与服务之间应该是松耦合的。因此,服务请求者不需要知道服务提供者实现的技术细节,例如程序语言、底层平台等,只需要知道服务名与服务接口即可。服务的部署、迁移、扩容极其便利。,明确定义的服务接口:服务交互必须是明确定义的。,SOA,服务组件提供标准周知的服务接口,服务请求者根据服务名、标准服务接口来获取服务。,Web,服务描述语言(,Web Services Description Language,,,WSDL,)用于描述服务请求者所要求的绑定到服务提供者的细节。,WSDL,不包括服务实现的任何技术细节。服务请求者不知道也不关心服务究竟是由哪种程序设计语言编写的。,基于开放标准:当前,SOA,的实现形式基于开放标准,例如,公有,Web Service,协议,或私有开放服务标准协议。可以采用第一代,Web Service,定义的,SOAP,、,WSDL,和,UDDI,以及第二代,Web Service,定义的,WS-*,实现。,无状态的服务设计:服务应该是独立的、自包含的请求,在实现时它不需要获取从一个请求到另一个请求的信息或状态。服务不应该依赖于其他服务的上下文和状态。当产生依赖时,它们可以定义成通用的业务流程、函数和数据模型。,柳伟卫,分布式系统开发实战,70,6.2 SOA,的基本概念,应用程序前端,业务流程的所有者;,服务,提供业务的功能,可以供应用程序前端或者其他服务使用;,实现,提供业务的逻辑和数据;,合约,为服务客户指定功能、使用和约束;,接口,物理地公开功能;,服务库,存储,SOA,中各个服务的服务合约;,服务总线,将应用程序前端和服务连在一起。,柳伟卫,分布式系统开发实战,71,6.3,基于,Web,服务的,SOA,XML-RPC,SOAP,Microsoft.NET Remoting,柳伟卫,分布式系统开发实战,72,6.3.4 Java,中的,XML Web,服务,柳伟卫,分布式系统开发实战,73,6.3.5,超越,SOAP,AJAX,XML-RPC,REST,柳伟卫,分布式系统开发实战,74,6.3.6 SOA,的演变,REST,风格的架构,微服务架构,Serverless,架构,柳伟卫,分布式系统开发实战,75,6.4 Web,服务的分类,“大”,Web,服务:使用遵循简单对象访问协议(,SOAP,)标准的,XML,消息,RESTful Web,服务:也简称为,REST,服务。,柳伟卫,分布式系统开发实战,76,6.4.3 Web,服务技术选型,选择使用“大”,Web,服务和,RESTful Web,服务是要针对具体的场景的。,“大”,Web,服务:解决企业计算中常见的高级,QoS,需求。,RESTful Web,服务:适用移动,App,、云计算、,Cloud Native,、微服务等架构。,柳伟卫,分布式系统开发实战,77,6.5,实战:基于,JAX-WS,实现,Web,服务,柳伟卫,分布式系统开发实战,78,6.6,本章小结,本章介绍了什么是面向服务的架构,以及实现面向服务的架构技术,包括,XML-RPC,、,SOAP,、,Microsoft.NET Remoting,、,Java,等。其中,,Web,服务又可以分为“大”,Web,服务、,RESTful Web,服务。,在本章也演示了如何通过,Java,技术来实现,Web,服务。,柳伟卫,分布式系统开发实战,79,6.7,习题,请简述什么是面向服务的架构。,实现面向服务的架构技术有哪些?,Web,服务的分类有哪些?分别有哪些区别?,请用你熟悉的技术实现一个,Web,服务,柳伟卫,分布式系统开发实战,80,分布式系统开发实战,第,7,章 面向消息的分布式架构,对于实时、高并发、高可用这类接口而言,采用消息通信的方式更为合适。,柳伟卫,分布式系统开发实战,82,本章学习,面向消息的分布式架构,柳伟卫,分布式系统开发实战,83,7.1,什么是面向消息的分布式架构,消息中间件往往会支持多种语言的客户端(比如,Java,、,C,、,C+,、,C#,、,Ruby,等),支持多种协议(,HTTP,、,TCP,、,SSL,、,NIO,、,UDP,等)。,消息中间件支持异步通信,从而可以极大提升通信效率。,柳伟卫,分布式系统开发实战,84,7.1.1,常用术语,T,opic,(主题),按照分类对信息源进行维护。实际应用中一个业务一个,topic,。,Producer,(生产者),把发送消息到,topic,中的进程叫作生产者。,Consumer,(消费者),把从,topic,中订阅消息的进程叫作消费者。,Broker,(服务),集群中的每个服务叫作,broker,。,柳伟卫,分布式系统开发实战,85,7.1.2,使用场景,异步通信,解耦,数据缓冲,多种消息推送模型,强顺序,持久化消息,支持分布式,柳伟卫,分布式系统开发实战,86,6.3.5,超越,SOAP,AJAX,XML-RPC,REST,柳伟卫,分布式系统开发实战,87,7.1.3,常用技术,RabbitMQ,以高效而著称;,Apache Kafka,能够支持各种强大的消息模式,而被互联网公司广泛采用;,Apache ActiveMQ,是,Java,语言编写的,能够支持全面的,JMS,和,J2EE,规范;,RocketMQ,则是来自阿里巴巴的“国货精品”,,柳伟卫,分布式系统开发实战,88,7.3,消息通信常用模式,消息中间件不管是在企业级应用中还是在互联网产品中,其应用的场景非常广泛。以,RabbitMQ,为例,总结了消息通信常用模式。,柳伟卫,分布式系统开发实战,89,7.3.1,工作队列,工作队列(,Work Queues,)又叫作任务队列(,Task Queues,),背后主要的思想是避免立即处理一个资源密集型任务所造成的长时间等待。相反我们可以计划着让任务后续执行。我们将任务封装成消息发送到队列中。一个,worker,(工作者)进程在后台运行,获取任务并最终执行任务。当运行多个,worker,(工作者)时,所有的任务将会被它们所共享。,柳伟卫,分布式系统开发实战,90,7.3.2,发布,/,订阅,定义了如何向一个内容节点发布和订阅消息,内容节点也叫主题(,topic,),主题是为发布者(,publisher,)和订阅者(,subscribe,)提供传输的中介。,发布,/,订阅模型使发布者和订阅者之间不需要直接通信(如,RMI,)就可保证消息的传送,有效解决了系统间耦合问题。该模式同时也定义了一种一对多的依赖关系,让多个订阅者对象同时监听某一个主题对象。,柳伟卫,分布式系统开发实战,91,7.3.3,路由,路由(,Routing,)意味在消息订阅中,可选择性地只订阅部分消息,柳伟卫,分布式系统开发实战,92,7.3.4,主题,主题(,Topic,)类型的,exchange,拥有比,direct,类型更多的灵活性。,柳伟卫,分布式系统开发实战,93,7.3.5 RPC,柳伟卫,分布式系统开发实战,94,7.4,了解,JMS,规范,JMS,(,Java Message Service,,,Java,消息服务)应用程序接口,是一个,Java,平台中关于面向消息中间件的,API,,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。,Java,消息服务是一个与具体平台无关的,API,,绝大多数面向消息中间件提供商都对,JMS,提供支持。,柳伟卫,分布式系统开发实战,95,7.5,实战:基于,JMS,的消息发送和接收,柳伟卫,分布式系统开发实战,96,7.6,本章小结,出于对实时、高并发、高可用等方面的需求,面向消息的分布式架构得以流行。本章节介绍了消息中的常用概念及常见的消息中间件产品,并且也对大部分市面上流行的中间件产品的工作模式进行了总结,归纳了消息通信常用模式。,由于,Java,语言的流行,我们也介绍了,Java,领域的消息通信规范,JMS,,并手把手带大家实现了一个基于,JMS,的消息发送和接收示例。,柳伟卫,分布式系统开发实战,97,7.7,习题,请简述面向消息的分布式架构有哪些特点。,常用的消息中间件产品有哪些?,请简述消息通信常用模式。,请简述,JMS,消息风格有哪些?,请用你熟悉的消息中间件技术编写一个应用,以实现消息发送和接收。,柳伟卫,分布式系统开发实战,98,分布式系统开发实战,第,8,章,REST,风格的架构,本章学习,RESTful Web,服务,RESTful Web,架构风格,柳伟卫,分布式系统开发实战,100,8.1,什么是,REST,REST API,不应该依赖于任何通信协议,尽管要成功映射到某个协议可能会依赖于元数据的可用性、所选的方法等。,REST API,不应该包含对通信协议的任何改动,除非是补充或确定标准协议中未规定的部分。,REST API,应该将大部分的描述工作放在定义用于表示资源和驱动应用状态的媒体类型上,或定义现有标准媒体类型的扩展关系名和(或)支持超文本的标记。,REST API,绝不应该定义一个固定的资源名或层次结构(客户端和服务器之间的明显耦合)。,REST API,永远也不应该有那些会影响客户端的“类型化”资源。,REST API,不应该要求有先验知识(,prior knowledge,),除了初始,URI,和适合目标用户的一组标准化的媒体类型(即,它能被任何潜在使用该,API,的客户端理解)。,柳伟卫,分布式系统开发实战,101,8.2 REST,设计原则,通过,URI,来标识资源,统一接口,资源多重表述,无状态,柳伟卫,分布式系统开发实战,102,8.3,成熟度模型,柳伟卫,分布式系统开发实战,103,8.4 REST API,管理,使用的名词而不是动词,GET,方法和查询参数不能改变资源状态,使用名词复数,使用子资源来表达资源间的关系,使用,HTTP header,来序列化格式,使用,HATEOAS,约束,提供过滤、排序、字段选择、分页,API,版本化,充分使用,HTTP,状态码来处理错误,柳伟卫,分布式系统开发实战,104,8.5,常用技术,JAX-RS,规范,Jersey,Apache CXF,Spring Web MVC,柳伟卫,分布式系统开发实战,105,8.6,实战:基于,Java,实现,REST API,柳伟卫,分布式系统开发实战,106,8.7,本章小结,本章介绍了,REST,风格的架构,其中包括,REST,风格的概念、,REST,设计原则、,REST,成熟度模型、,REST API,管理等方面的内容。,同时,针对,Java,领域,着重讲解了,Java,实现,REST,所需要的常用技术,并列举了丰富的案例。,柳伟卫,分布式系统开发实战,107,8.8,习题,请简述,REST,风格的架构的特征。,设计,REST,风格的架构应该遵循哪些原则?,请简述成熟度模型的级别及其特点。,如何才能正确管理,REST API,?,请用你熟悉的编程语言,实现一个,REST,服务。,柳伟卫,分布式系统开发实战,108,分布式系统开发实战,第,9,章 微服务架构,本章学习,什么是微服务?,微服务架构与传统的,SOA,架构有什么区别?,何时应该采用微服务架构?,如何构建微服务?,柳伟卫,分布式系统开发实战,110,9.1,什么是微服务架构,简言之,微服务架构风格就像是把小的服务开发成单一应用的形式,运行在其自己的进程中,并采用轻量级的机制进行通信(一般是,HTTP,资源,API,)。这些服务都是围绕业务能力来构建的,通过全自动部署工具来实现独立部署。这些服务可以使用不同的编程语言和不同的数据存储技术,并保持最小化集中管理。,柳伟卫,分布式系统开发实战,111,9.2,微服务架构与,SOA,架构的区别,微服务架构(,MSA,)与面向服务架构(,SOA,)有相似之处,比如,都是面向服务,通信大多基于,HTTP,协议。通,常传统的,SOA,意味着大而全的单体架构(,Monolithic Architecture,)的解决方案。单体架构有时也被称为“单块架构”,这种架构风格会让设计、开发、测试、发布都增加了难度,其中任何细小的代码变更,都将导致整个系统需要重新测试、部署。,而微服务架构恰恰把所有服务都打散,设置合理的颗粒度,各个服务间保持低耦合,每个服务都在其完整的生命周期中存活,将互相之间的影响降到最低。,SOA,需要对整个系统进行规范,而,MSA,的每个服务都可以有自己的开发语言、开发方式、灵活性大大提高。,柳伟卫,分布式系统开发实战,112,9.3,何时采用微服务架构,微服务不是“银弹”,何时采用微服务还需考虑企业自身的需求。,在开发应用的初期,我们通常不会遇到采用微服务这种方法来试图解决问题的情况。而且,使用这个精细、分布式的架构将会拖慢开发进度。,另一个挑战是如何将系统分隔为微服务。,柳伟卫,分布式系统开发实战,113,9.4,常用技术,Jetty HTTP Server,Tomcat,柳伟卫,分布式系统开发实战,114,9.5,实战:基于,Spring Boot,实现微服务,柳伟卫,分布式系统开发实战,115,9.6,微服务与通信,HTTP,通信,消息通信,事件驱动的通信,柳伟卫,分布式系统开发实战,116,9.7,了解,CQRS,CQRS,(,Command Query Responsibility Segregation,,命令查询职责分离)旨在从业务上分离命令和查询的行为。,逻辑更加清晰,便于对不同部分进行针对性的优化。,柳伟卫,分布式系统开发实战,117,9.8,实战:基于,CQRS,微服务通信,柳伟卫,分布式系统开发实战,118,9.9,本章小结,本章介绍了微服务架构的概念及构建微服务常用的技术。,同时,也介绍了在微服务中常用的三种通信方式:,HTTP,、消息、事件驱动。在微服务中,我们可以使用,CQRS,来降低构建微服务通信的复杂度。,柳伟卫,分布式系统开发实战,119,9.10,习题,请简述微服务架构的概念。,请简述实现微服务架构有哪些常用的技术。,在微服务架构中,常用的通信方式有几种?各有哪
展开阅读全文