`

理解本真的REST架构风格

    博客分类:
  • HttP
阅读更多

引子

在移动互联网、云计算迅猛发展的今天,作为一名Web开发者,如果您还没听说过“REST”这个buzzword,显然已经落伍了。夸张点说,甚至“出了门都不好意思跟别人打招呼”。尽管如此,对于REST这个泊来品的理解,大多数人(包括一些资深的架构师)仍然停留在“盲人摸象”的阶段。常常听到各种各样关于REST的说法,例如:有人说:“我们这套新的API决定不用Web Service(SOAP+WSDL),而是直接使用HTTP+JSON,也就是用RESTful的方式来开发。” 不用SOAP,甚至也不用XML,就自动变成了RESTful了。还有人认为:REST与传统的Web Service其实没有本质区别,只是对于URI的构造方式提出了更多要求,而这些要求Web Service完全都可以实现。潜台词是:既生瑜,何生亮。Web Service已经足够好了,干嘛还要再折腾什么REST。这些对于REST的不同说法,果真如此吗?REST究竟是什么?是一种新的技术、一种新的架构、还是一种新的规范?

对于这些问题笔者先不解答,为了深入理解REST是什么,我们需要回顾一下Web发展的最初年代,从源头上讲讲REST是怎么得来的。

Web技术发展与REST的由来

 

Web(万维网World Wide Web的简称)是个包罗万象的万花筒,不同的人从不同的角度观察,对于Web究竟是什么会得出大不相同的观点。作为Web开发者,我们需要从技术上来理解Web。从技术架构层面上看,Web的技术架构包括了四个基石:

  • URI
  • HTTP
  • HyperText(除了HTML外,也可以是带有超链接的XML或JSON)
  • MIME

这四个基石相互支撑,促使Web这座宏伟的大厦以几何级数的速度发展了起来。在这四个基石之上,Web开发技术的发展可以粗略划分成以下几个阶段:

  1. 静态内容阶段:在这个最初的阶段,使用Web的主要是一些研究机构。Web由大量的静态HTML文档组成,其中大多是一些学术论文。Web服务器可以被看作是支持超文本的共享文件服务器。
  2. CGI程序阶段:在这个阶段,Web服务器增加了一些编程API。通过这些API编写的应用程序,可以向客户端提供一些动态变化的内容。Web服务器与应用程序之间的通信,通过CGI(Common Gateway Interface)协议完成,应用程序被称作CGI程序。
  3. 脚本语言阶段:在这个阶段,服务器端出现了ASP、PHP、JSP、ColdFusion等支持session的脚本语言技术,浏览器端出现了Java Applet、JavaScript等技术。使用这些技术,可以提供更加丰富的动态内容。
  4. 瘦客户端应用阶段:在这个阶段,在服务器端出现了独立于Web服务器的应用服务器。同时出现了Web MVC开发模式,各种Web MVC开发框架逐渐流行,并且占据了统治地位。基于这些框架开发的Web应用,通常都是瘦客户端应用,因为它们是在服务器端生成全部的动态内容。
  5. RIA应用阶段:在这个阶段,出现了多种RIA(Rich Internet Application)技术,大幅改善了Web应用的用户体验。应用最为广泛的RIA技术是DHTML+Ajax。Ajax技术支持在不刷新页面的情况下动态更新页面中的局部内容。同时诞生了大量的Web前端DHTML开发库,例如Prototype、Dojo、ExtJS、jQuery/jQuery UI等等,很多开发库都支持单页面应用(Single Page Application)的开发。其他的RIA技术还有Adobe公司的Flex、微软公司的Silverlight、Sun公司的JavaFX(现在为Oracle公司所有)等等。
  6. 移动Web应用阶段:在这个阶段,出现了大量面向移动设备的Web应用开发技术。除了Android、iOS、Windows Phone等操作系统平台原生的开发技术之外,基于HTML5的开发技术也变得非常流行。

从上述Web开发技术的发展过程看,Web从最初其设计者所构思的主要支持静态文档的阶段,逐渐变得越来越动态化。Web应用的交互模式,变得越来越复杂:从静态文档发展到以内容为主的门户网站、电子商务网站、搜索引擎、社交网站,再到以娱乐为主的大型多人在线游戏、手机游戏。

 

在互联网行业,实践总是走在理论的前面。Web发展到了1995年,在CGI、ASP等技术出现之后,沿用了多年、主要面向静态文档的HTTP/1.0协议已经无法满足Web应用的开发需求,因此需要设计新版本的HTTP协议。在HTTP/1.0协议专家组之中,有一位年轻人脱颖而出,显示出了不凡的洞察力,后来他成为了HTTP/1.1协议专家组的负责人。这位年轻人就是Apache HTTP服务器的核心开发者Roy Fielding,他还是Apache软件基金会的合作创始人。

Roy Fielding和他的同事们在HTTP/1.1协议的设计工作中,对于Web之所以取得巨大成功,在技术架构方面的因素做了一番深入的总结。Fielding将这些总结纳入到了一套理论框架之中,然后使用这套理论框架中的指导原则,来指导HTTP/1.1协议的设计方向。HTTP/1.1协议的第一个草稿是在1996年1月发布的,经过了三年多时间的修订,于1999年6月成为了IETF的正式规范(包括了RFC 2616以及用于对客户端做身份认证的RFC 2617)。HTTP/1.1协议设计的极为成功,以至于发布之后整整10年时间里,都没有多少人认为有修订的必要。用来指导HTTP/1.1协议设计的这套理论框架,最初是以备忘录的形式在专家组成员之间交流,除了IETF/W3C的专家圈子,并没有在外界广泛流传。Fielding在完成HTTP/1.1协议的设计工作之后,回到了加州大学欧文分校继续攻读自己的博士学位。第二年(2000年)在他的博士学位论文Architectural Styles and the Design of Network-based Software Architectures中,Fielding更为系统、严谨地阐述了这套理论框架,并且使用这套理论框架推导出了一种新的架构风格,并且为这种架构风格取了一个令人轻松愉快的名字“REST”——Representational State Transfer(表述性状态转移)的缩写。

在笔者看来,Fielding这篇博士论文在Web发展史上的价值,不亚于Web之父Tim Berners-Lee关于超文本的那篇经典论文。然而遗憾的是,这篇博士论文在诞生之后的将近5年时间里,一直没有得到足够的重视。例如Web Service相关规范SOAP/WSDL的设计者们,显然不大理解REST是什么,HTTP/1.1究竟是一个什么样的协议、为何要设计成这个样子。

这种情况在2005年之后有了很大的改善,随着Ajax、Ruby on Rails等新的Web开发技术的兴起,在Web开发技术社区掀起了一场重归Web架构设计本源的运动,REST架构风格得到了越来越多的关注。在2007年1月,支持REST开发的Ruby on Rails 1.2版正式发布,并且将支持REST开发作为Rails未来发展中的优先内容。Ruby on Rails的创始人DHH做了一个名为“World of Resources”的精彩演讲,DHH在Web开发技术社区中的强大影响力,使得REST一下子处在Web开发技术舞台的聚光灯之下。

今天,各种流行的Web开发框架,几乎没有不支持REST开发的了。大多数Web开发者都是通过阅读某种REST开发框架的文档,以及通过一些例子代码来学习REST开发的。然而,通过例子代码来学习REST有非常大的局限性。因为REST并不是一种具体的技术,也不是一种具体的规范,REST其实是一种内涵非常丰富的架构风格。通过例子代码来学习REST,除了学习到一种有趣的Web开发技术之外,并不能全面深入的理解REST究竟是什么。甚至还会误以为这些简单的例子代码就是REST本身,REST不过是一种简单的Web开发技术而已。就像盲人摸象一样,有的人摸到了象鼻子、有的人摸到了象耳朵、有的人摸到了象腿、有的人摸到了象尾巴。他们都坚信自己感觉到的大象,才是最真实的大象,而其他人的感觉都是错误的。

对于不理解REST的Web开发者,人们习惯于展示一些例子代码来让他们理解REST,笔者不赞同上述做法。如果Web开发者想要深入理解REST是什么,就很难避开Fielding的这篇博士论文。笔者在本文中对于REST是什么的介绍,也是基于Fielding的博士论文的。尽管如此,笔者强烈建议本文的读者亲自去通读一下Fielding的博士论文,就像想要了解孔子的思想应该直接去读《论语》等著作,而不是首先去读其他人的转述一样。笔者在本文中也仅仅是努力不做一个把经书念错了的歪嘴和尚而已。那么,下面我们言归正传。

在Fielding的这篇名为Architectural Styles and the Design of Network-based Software Architectures的博士论文(中文版名为《架构风格与基于网络的软件架构设计》)中,提出了一整套基于网络的软件(即所谓的“分布式应用”)的设计方法,值得所有分布式应用的开发者仔细阅读、深入体会。

在论文的前三章中,Fielding在批判性继承前人研究成果的基础上,建立起来一整套研究和评价软件架构的方法论。这套方法论的核心是“架构风格”这个概念。架构风格是一种研究和评价软件架构设计的方法,它是比架构更加抽象的概念。一种架构风格是由一组相互协作的架构约束来定义的。架构约束是指软件的运行环境施加在架构设计之上的约束。

在论文的第四章中,Fielding研究了Web这样一个分布式系统对于软件架构设计提出了哪些需求。在第五章中,Fielding将第四章Web提出的需求具体化为一些架构约束,通过逐步添加各种架构约束,推导出来了REST这种新的架构风格。

REST架构风格的推导过程如下图所示:

图1:REST所继承的架构风格约束(原图可在这里下载

在图1中,每一个椭圆形里面的缩写词代表了一种架构风格,而每一个箭头边的单词代表了一种架构约束。

REST架构风格最重要的架构约束有6个:

  • 客户-服务器(Client-Server)

通信只能由客户端单方面发起,表现为请求-响应的形式。

  • 无状态(Stateless)

通信的会话状态(Session State)应该全部由客户端负责维护。

  • 缓存(Cache)

响应内容可以在通信链的某处被缓存,以改善网络效率。

  • 统一接口(Uniform Interface)

通信链的组件之间通过统一的接口相互通信,以提高交互的可见性。

  • 分层系统(Layered System)

通过限制组件的行为(即,每个组件只能“看到”与其交互的紧邻层),将架构分解为若干等级的层。

  • 按需代码(Code-On-Demand,可选)

支持通过下载并执行一些代码(例如Java Applet、Flash或JavaScript),对客户端的功能进行扩展。

在论文中推导出的REST架构风格如下图所示:

图2:REST架构风格(原图可在这里下载

 

而HTTP/1.1协议作为一种REST架构风格的架构实例,其架构如下图所示:

图3:一个基于REST的架构的过程视图(原图可在这里下载

用户代理处在三个并行交互(a、b和c)的中间。用户代理的客户端连接器缓存无法满足请求,因此它根据每个资源标识符的属性和客户端连接器的配置,将每个请求路由到资源的来源。请求(a)被发送到一个本地代理,代理随后访问一个通过DNS查找发现的缓存网关,该网关将这个请求转发到一个能够满足该请求的来源服务器,服务器的内部资源由一个封装过的对象请求代理(object request broker)架构来定义。请求(b)直接发送到一个来源服务器,它能够通过自己的缓存来满足这个请求。请求(c)被发送到一个代理,它能够直接访问WAIS(一种与Web架构分离的信息服务),并将WAIS的响应翻译为一种通用的连接器接口能够识别的格式。每一个组件只知道与它们自己的客户端或服务器连接器的交互;整个过程拓扑是我们的视图的产物。

通过比较图2和图3,读者不难发现这两张图中的架构是高度一致的。对于HTTP/1.1协议为何要设计成这个样子,读者想必已经有所领悟。

在论文的第六章中,Fielding对于到2000年为止在Web基础架构协议的设计和开发方面的一些经验教训进行了深入的分析。其中,“HTTP不是RPC”、“HTTP不是一种传输协议”两部分值得读者反复阅读。时至13年之后的今日,对于HTTP协议的误解仍然广泛存在。

以上简要介绍了Fielding博士论文中的内容。为了帮助读者仔细阅读Fielding的博士论文,笔者整理了一套Fielding博士论文的导读,将在本专栏后续文章中载出。

REST详解

REST究竟是什么?因为REST的内涵非常丰富,所以很难用一两句话解释清楚这个问题。

首先,REST是Web自身的架构风格。REST也是Web之所以取得成功的技术架构方面因素的总结。REST是世界上最成功的分布式应用架构风格(成功案例:Web,还不够吗?)。它是为 运行在互联网环境 的 分布式 超媒体系统量身定制的。互联网环境与企业内网环境有非常大的差别,最主要的差别是两个方面:

  • 可伸缩性需求无法控制:并发访问量可能会暴涨,也可能会暴跌。

  • 安全性需求无法控制:无法控制客户端发来的请求的格式,很可能会是恶意的请求。

而所谓的“超媒体系统”,即,使用了超文本的系统。可以把“超媒体”理解为超文本+媒体内容。

REST是HTTP/1.1协议等Web规范的设计指导原则,HTTP/1.1协议正是为实现REST风格的架构而设计的。新的Web规范,其设计必须符合REST的要求,否则整个Web的体系架构会因为引入严重矛盾而崩溃。这句话不是危言耸听,做个类比,假如苏州市政府同意在市区著名园林的附近大型土木,建造大量具有后现代风格的摩天大楼,那么不久之后世界闻名的苏州园林美景将不复存在。

上述这些关于“REST是什么”的描述,可以总结为一句话:REST是所有Web应用都应该遵守的架构设计指导原则。当然,REST并不是法律,违反了REST的指导原则,仍然能够实现应用的功能。但是违反了REST的指导原则,会付出很多代价,特别是对于大流量的网站而言。

要深入理解REST,需要理解REST的五个关键词:

  1. 资源(Resource)
  2. 资源的表述(Representation)
  3. 状态转移(State Transfer)
  4. 统一接口(Uniform Interface)
  5. 超文本驱动(Hypertext Driven)

什么是资源?

资源是一种看待服务器的方式,即,将服务器看作是由很多离散的资源组成。每个资源是服务器上一个可命名的抽象概念。因为资源是一个抽象的概念,所以它不仅仅能代表服务器文件系统中的一个文件、数据库中的一张表等等具体的东西,可以将资源设计的要多抽象有多抽象,只要想象力允许而且客户端应用开发者能够理解。与面向对象设计类似,资源是以名词为核心来组织的,首先关注的是名词。一个资源可以由一个或多个URI来标识。URI既是资源的名称,也是资源在Web上的地址。对某个资源感兴趣的客户端应用,可以通过资源的URI与其进行交互。

什么是资源的表述?

资源的表述是一段对于资源在某个特定时刻的状态的描述。可以在客户端-服务器端之间转移(交换)。资源的表述可以有多种格式,例如HTML/XML/JSON/纯文本/图片/视频/音频等等。资源的表述格式可以通过协商机制来确定。请求-响应方向的表述通常使用不同的格式。

什么是状态转移?

状态转移(state transfer)与状态机中的状态迁移(state transition)的含义是不同的。状态转移说的是:在客户端和服务器端之间转移(transfer)代表资源状态的表述。通过转移和操作资源的表述,来间接实现操作资源的目的。

什么是统一接口?

REST要求,必须通过统一的接口来对资源执行各种操作。对于每个资源只能执行一组有限的操作。以HTTP/1.1协议为例,HTTP/1.1协议定义了一个操作资源的统一接口,主要包括以下内容:

  • 7个HTTP方法:GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS

  • HTTP头信息(可自定义)

  • HTTP响应状态代码(可自定义)

  • 一套标准的内容协商机制

  • 一套标准的缓存机制

  • 一套标准的客户端身份认证机制

REST还要求,对于资源执行的操作,其操作语义必须由HTTP消息体之前的部分完全表达,不能将操作语义封装在HTTP消息体内部。这样做是为了提高交互的可见性,以便于通信链的中间组件实现缓存、安全审计等等功能。

什么是超文本驱动?

“超文本驱动”又名“将超媒体作为应用状态的引擎”(Hypermedia As The Engine Of Application State,来自Fielding博士论文中的一句话,缩写为HATEOAS)。将Web应用看作是一个由很多状态(应用状态)组成的有限状态机。资源之间通过超链接相互关联,超链接既代表资源之间的关系,也代表可执行的状态迁移。在超媒体之中不仅仅包含数据,还包含了状态迁移的语义。以超媒体作为引擎,驱动Web应用的状态迁移。通过超媒体暴露出服务器所提供的资源,服务器提供了哪些资源是在运行时通过解析超媒体发现的,而不是事先定义的。从面向服务的角度看,超媒体定义了服务器所提供服务的协议。客户端应该依赖的是超媒体的状态迁移语义,而不应该对于是否存在某个URI或URI的某种特殊构造方式作出假设。一切都有可能变化,只有超媒体的状态迁移语义能够长期保持稳定。

一旦读者理解了上述REST的五个关键词,就很容易理解REST风格的架构所具有的6个的主要特征:

  • 面向资源(Resource Oriented)

  • 可寻址(Addressability)

  • 连通性(Connectedness)

  • 无状态(Statelessness)

  • 统一接口(Uniform Interface)

  • 超文本驱动(Hypertext Driven)

这6个特征是REST架构设计优秀程度的判断标准。其中,面向资源是REST最明显的特征,即,REST架构设计是以资源抽象为核心展开的。可寻址说的是:每一个资源在Web之上都有自己的地址。连通性说的是:应该尽量避免设计孤立的资源,除了设计资源本身,还需要设计资源之间的关联关系,并且通过超链接将资源关联起来。无状态、统一接口是REST的两种架构约束,超文本驱动是REST的一个关键词,在前面都已经解释过,就不再赘述了。

从架构风格的抽象高度来看,常见的分布式应用架构风格有三种:

  • 分布式对象(Distributed Objects,简称DO)

架构实例有CORBA/RMI/EJB/DCOM/.NET Remoting等等

  • 远程过程调用(Remote Procedure Call,简称RPC)

架构实例有SOAP/XML-RPC/Hessian/Flash AMF/DWR等等

  • 表述性状态转移(Representational State Transfer,简称REST)

架构实例有HTTP/WebDAV

DO和RPC这两种架构风格在企业应用中非常普遍,而REST则是Web应用的架构风格,它们之间有非常大的差别。

REST与DO的差别在于:

  • REST支持抽象(即建模)的工具是资源,DO支持抽象的工具是对象。在不同的编程语言中,对象的定义有很大差别,所以DO风格的架构通常都是与某种编程语言绑定的。跨语言交互即使能实现,实现起来也会非常复杂。而REST中的资源,则完全中立于开发平台和编程语言,可以使用任何编程语言来实现。

  • DO中没有统一接口的概念。不同的API,接口设计风格可以完全不同。DO也不支持操作语义对于中间组件的可见性。

  • DO中没有使用超文本,响应的内容中只包含对象本身。REST使用了超文本,可以实现更大粒度的交互,交互的效率比DO更高。

  • REST支持数据流和管道,DO不支持数据流和管道。

  • DO风格通常会带来客户端与服务器端的紧耦合。在三种架构风格之中,DO风格的耦合度是最大的,而REST的风格耦合度是最小的。REST松耦合的源泉来自于统一接口+超文本驱动。

REST与RPC的差别在于:

  • REST支持抽象的工具是资源,RPC支持抽象的工具是过程。REST风格的架构建模是以名词为核心的,RPC风格的架构建模是以动词为核心的。简单类比一下,REST是面向对象编程,RPC则是面向过程编程。

  • RPC中没有统一接口的概念。不同的API,接口设计风格可以完全不同。RPC也不支持操作语义对于中间组件的可见性。

  • RPC中没有使用超文本,响应的内容中只包含消息本身。REST使用了超文本,可以实现更大粒度的交互,交互的效率比RPC更高。

  • REST支持数据流和管道,RPC不支持数据流和管道。

  • 因为使用了平台中立的消息,RPC风格的耦合度比DO风格要小一些,但是RPC风格也常常会带来客户端与服务器端的紧耦合。支持统一接口+超文本驱动的REST风格,可以达到最小的耦合度。

比较了三种架构风格之间的差别之后,从面向实用的角度来看,REST架构风格可以为Web开发者带来三方面的利益:

  • 简单性

采用REST架构风格,对于开发、测试、运维人员来说,都会更简单。可以充分利用大量HTTP服务器端和客户端开发库、Web功能测试/性能测试工具、HTTP缓存、HTTP代理服务器、防火墙。这些开发库和基础设施早已成为了日常用品,不需要什么火箭科技(例如神奇昂贵的应用服务器、中间件)就能解决大多数可伸缩性方面的问题。

  • 可伸缩性

充分利用好通信链各个位置的HTTP缓存组件,可以带来更好的可伸缩性。其实很多时候,在Web前端做性能优化,产生的效果不亚于仅仅在服务器端做性能优化,但是HTTP协议层面的缓存常常被一些资深的架构师完全忽略掉。

  • 松耦合

统一接口+超文本驱动,带来了最大限度的松耦合。允许服务器端和客户端程序在很大范围内,相对独立地进化。对于设计面向企业内网的API来说,松耦合并不是一个很重要的设计关注点。但是对于设计面向互联网的API来说,松耦合变成了一个必选项,不仅在设计时应该关注,而且应该放在最优先位置。

有的读者可能会问:“你说了这么多,REST难道就没有任何缺点了吗?”当然不是,正如Fielding在博士论文中阐述的那样,评价一种软件架构的优劣,不能脱离开软件的具体运行环境。永远不存在适用于任何运行环境的、包治百病的银弹式架构。笔者在前面强调过REST是一种为运行在互联网环境中的Web应用量身定制的架构风格。REST在互联网这个运行环境之中已经占据了统治地位,然而,在企业内网运行环境之中,REST还会面临DO、RPC的巨大挑战。特别是一些对实时性要求很高的应用,REST的表现不如DO和RPC。所以需要针对具体的运行环境来具体问题具体分析。但是,REST可以带来的上述三方面的利益即使在开发企业应用时,仍然是非常有价值的。所以REST在企业应用开发,特别是在SOA架构的开发中,已经得到了越来越大的重视。本专栏将有一篇文章专门介绍REST在企业级应用中与SOA的结合。

 

 

http://www.infoq.com/cn/articles/understanding-restful-style

分享到:
评论

相关推荐

    二十四节气之霜降介绍.pptx

    二十四节气之霜降介绍.pptx

    整理PhotoShop美图的基础知识.doc

    整理PhotoShop美图的基础知识.doc

    Qt开发上位机:固高八轴运动控制卡与多米诺喷码机的集成应用

    内容概要:本文详细介绍了基于Qt框架开发的上位机软件,用于与固高八轴运动控制卡和多米诺喷码机进行通信与控制。主要内容涵盖硬件接口连接、喷码机功能实现、光学点定位、二维码读码与等级评测的技术细节,并展示了相关源码片段。此外,还讨论了多语言和多样式切换的功能实现,以满足不同用户的个性化需求。 适合人群:具有一定Qt开发经验的工程师和技术爱好者,尤其是从事工业自动化和机器视觉领域的专业人士。 使用场景及目标:适用于需要开发高效、稳定的上位机控制系统的企业和个人开发者。主要目标是掌握Qt框架在工业控制中的应用,提高系统的精度和稳定性,提升用户体验。 其他说明:文中提供的源码片段有助于读者理解和实践Qt与硬件设备的交互过程,进一步加深对Qt开发的理解。

    力士乐伺服编程调试软件中文版使用指南:IndraWorks MTX13V16与driver Top详解,IndraWorks DS英文版操作须知 代码分析

    内容概要:本文详细介绍了力士乐伺服编程调试三款软件——IndraWorks MTX13V16、driver Top 和 IndraWorks DS 的功能特点及其使用体验。这三款软件均适用于 Windows 7 和 Windows 10 系统,提供设备连接、参数设置、程序编写和调试等功能。IndraWorks MTX13V16 界面简洁,操作便捷,支持程序调试和优化;driver Top 注重用户体验,支持多种编程语言,提供丰富调试信息;IndraWorks DS 虽为英文版,但在中文说明书的帮助下易上手,响应速度快。所有软件均具备代码分析和仿真功能,提高编程调试工作的效率和准确性。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对力士乐伺服编程调试感兴趣的用户。 使用场景及目标:① 提供详细的软件安装和使用指南,帮助用户快速上手;② 分享编程调试经验,提升工作效率;③ 探讨不同软件的特点,便于用户根据需求选择合适的工具。 其他说明:文中提到的三款软件均为力士乐公司产品,在工业自动化领域应用广泛,能够满足不同的编程调试需求。

    基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)

    基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计),个人经导师指导并认可通过的高分设计项目,评审分98分,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!主要针对计算机相关专业的正在做大作业、毕业设计的学生和需要项目实战练习的学习者,资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoo

    教师面试试讲答辩小学英语听说课Hereisaredhat.docx

    教师面试试讲答辩小学英语听说课Hereisaredhat.docx

    数据库课程设计安排.doc

    数据库课程设计安排.doc

    机器学习(预测模型):一个关于城市自行车出行的数据集

    一个关于城市自行车出行的数据集,它记录了城市中自行车租赁服务的详细出行信息。该数据集通常包含多个字段,例如每次骑行的起始时间、结束时间、出发地点和到达地点的地理坐标(如经度和纬度)、骑行时长、自行车编号、用户类型(如注册会员或临时用户)等。这些丰富的数据维度为研究城市交通模式、居民出行习惯以及自行车租赁服务的运营效率提供了宝贵的信息。 数据集的规模可能因城市大小和数据收集时间跨度而异,但通常包含数万甚至数十万条记录。通过分析这些数据,可以发现城市中某些区域的骑行热度较高,例如商业区或旅游景点附近,这些地方可能是人们使用自行车的高频区域。同时,骑行时间的分布也能揭示出人们的出行规律,例如在工作日的早晚高峰时段,骑行量可能会显著增加,而在周末或节假日,骑行的目的地可能会更多地集中在休闲娱乐场所。 此外,该数据集还可以用于评估自行车租赁服务的运营状况,比如通过分析不同时间段的骑行时长和频率,了解自行车的使用效率和周转情况。对于城市规划者来说,这些数据有助于优化自行车道的布局,改善交通拥堵,促进绿色出行。而对于研究人员,它可以作为研究城市交通、环境影响以及社会行为模式的有力工具。总之,该数据集是一个极具价值的数据资源,能够为多个领域的研究和决策提供支持。

    基于UDS的BootLoader上位机源代码:ISO15765通信,PeakCAN、ZJG CAN支持,S-record格式解析,可二次开发扩展

    内容概要:本文详细介绍了基于UDS协议的BootLoader上位机源代码的实现方法及其扩展应用。主要内容涵盖:使用C#实现支持ISO15765通信的多厂商CAN卡适配器,如PeakCAN和ZJG CAN;S-record格式的正确解析与处理,确保地址连续性避免ECU故障;以及通过反射机制动态加载UDS服务进行功能扩展。此外,还讨论了调试技巧,如CAN报文日志记录和性能优化策略,如Pipeline模式批量请求处理。 适合人群:熟悉C#编程语言并对汽车电子控制系统有一定了解的研发人员和技术爱好者。 使用场景及目标:适用于开发车载刷写工具的专业人士,旨在帮助他们快速构建稳定可靠的BootLoader上位机系统,同时提供灵活的二次开发接口以满足特定项目需求。 其他说明:文中提供了大量实用代码片段作为示例,便于读者理解和实践相关概念和技术细节。

    操作系统课后答案详解.doc

    操作系统课后答案详解.doc

    基于Vivado的RISC-V 32位单周期处理器CPU设计与实现:SystemVerilog代码解析及学习指南

    内容概要:本文详细介绍了基于Vivado平台的RISC-V 32位单周期处理器CPU的设计与实现。该处理器采用SystemVerilog编写,结构简单明了,分为四个主要模块:取指令、译指、执行和写回。文中提供了详细的代码片段,如寄存器堆设计、指令译码、存储器接口以及ALU模块的实现,并解释了各个模块的工作原理。此外,文章还讨论了一些常见的设计陷阱和技术细节,如异步读同步写的寄存器设计、指令编码方式、存储器冲突处理等。附赠的《RISC-V手册中文版》和指令集文档为初学者提供了宝贵的学习资料。 适合人群:具备基本硬件描述语言基础的电子工程学生、嵌入式系统开发者及对RISC-V架构感兴趣的初学者。 使用场景及目标:① 学习RISC-V架构的基本概念和指令集;② 掌握SystemVerilog编程技巧;③ 理解单周期处理器的工作流程及其内部模块的协同工作;④ 提高硬件设计和仿真的能力。 其他说明:文章强调了动手实践的重要性,鼓励读者通过修改测试用例并观察波形图的变化来加深对CPU工作原理的理解。同时提醒读者注意一些常见问题,如字节序问题和溢出处理。

    数据通信基础知识.pptx

    数据通信基础知识.pptx

    混合动力系统Simulink建模:能量管理和功率分配的两种电电混动模型解析

    内容概要:本文详细介绍了两种用于混合动力系统的Simulink模型,分别是侧重于能量管理和功率分配的电电混动模型。能量管理模型主要关注长期的能量平衡,通过模糊控制模块和SOC窗口机制确保电池健康运行;而功率分配模型则专注于实时的功率流计算,采用最小二乘法进行约束优化,以实现实时的扭矩分配。文中还提到了两者在实际应用中的挑战,如调参难度、计算延迟以及低温环境下的性能调整等问题。此外,文章强调了将这两种模型结合起来进行联合仿真的重要性和复杂性,特别是时钟同步的问题。 适合人群:从事混合动力系统研究和开发的技术人员,尤其是熟悉Simulink工具的工程师。 使用场景及目标:帮助研究人员更好地理解和掌握混合动力系统中能量管理和功率分配的关键技术和难点,为实际项目提供理论支持和技术指导。 其他说明:文章不仅提供了详细的模型介绍,还分享了一些实际测试中的经验和教训,有助于读者避免常见错误并提高模型的鲁棒性。

    Day2-Java思维笔记

    Day2-Java思维笔记

    基于MATLAB的BP神经网络用于数据分类预测与故障信号诊断的技术实现 - 数据分类

    内容概要:本文档详细介绍了利用MATLAB实现BP神经网络进行数据分类预测和故障信号诊断的方法。首先,文档解释了如何准备和预处理数据,包括加载、分割以及归一化操作。然后,构建了一个双隐层的BP神经网络模型,指定了各层的激活函数和训练算法,并设置了训练参数。接下来,进行了模型训练并展示了如何评估模型性能,包括计算准确率、绘制混淆矩阵和误差分布直方图。最后,提供了优化模型的一些建议,如调整隐层数量、更换训练算法或增加数据量。 适用人群:适用于具有一定MATLAB编程基础和技术背景的研究人员、工程师或学生,特别是那些对机器学习、神经网络及其应用感兴趣的群体。 使用场景及目标:该方法可用于各种需要分类预测的任务,尤其是工业设备故障检测等领域。主要目的是帮助用户快速理解和掌握BP神经网络的工作原理及其具体实现方式,同时提供实用的操作指南以便于实际项目中的应用。 其他说明:文中提供的代码可以直接运行,并附带详细的注释,便于读者理解每一步骤的功能和意义。此外,还给出了针对不同情况下的改进措施,使得该解决方案更具灵活性和适应性。

    智能驾驶领域基于深度学习与单目摄像头测距的前车碰撞预警(FCW)源码解析

    内容概要:本文详细介绍了基于深度学习和单目摄像头测距的前车碰撞预警(FCW)系统的技术要点及其源码。主要内容涵盖单目测距、多目标跟踪和车辆检测三大核心技术,这些都是智能ADAS系统的重要组成部分。文中还特别强调了不同软件版本之间的兼容性问题,如GPU和CPU版本的具体配置,包括Anaconda、CUDA、cuDNN、TensorFlow、OpenCV和Keras等工具和技术栈的选择。此外,提供了相关代码片段作为示例,帮助读者更好地理解和应用这些技术。 适合人群:对智能驾驶感兴趣的研究人员、工程师以及希望深入了解FCW系统内部机制的专业人士。 使用场景及目标:适用于需要开发或改进智能驾驶辅助系统的企业和个人开发者,旨在提高车辆行驶安全性,减少交通事故发生率。 阅读建议:由于涉及到较多的技术细节和代码实现,建议读者具备一定的编程基础和机器学习背景,在阅读过程中结合实际案例进行练习,以便更好地掌握所学知识。

    发送和接收文件LocalSend-1.17.0-android

    文件发送和接收,快捷高效便利,安卓版

    欧姆龙PLC NJ-1400基于EtherCat总线的电池生产线自动化控制方案详解

    内容概要:本文介绍了欧姆龙PLC NJ-1400在电池生产线中的应用,重点讲解了EtherCat总线控制24个伺服轴和6个扫描枪的技术实现。文中详细描述了PLC配置、ST语言编程、FB块设置、远程IO终端连接及详细的IO表说明。此外,还涵盖了生产线各环节的工艺流程、位置变量定义及其重要性。最后提出了项目实施中的注意事项和优化建议。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是熟悉PLC编程和EtherCat总线技术的专业人士。 使用场景及目标:适用于需要深入了解PLC和EtherCat总线在复杂工业环境中的实际应用情况的人群。目标是帮助读者掌握大型电池生产线自动化控制的关键技术和最佳实践。 阅读建议:建议读者仔细研读PLC配置部分,特别是ST语言编程和FB块的具体实现方法。同时关注IO表和工艺流程的详细介绍,以便更好地理解和应用于实际工作中。

    电力系统无功优化中遗传算法及改进算法的应用研究——以14节点和33节点系统为例 无功优化

    内容概要:本文详细介绍了遗传算法及其改进版本在电力系统无功优化中的应用,特别是针对标准14节点和33节点系统。文中首先阐述了无功优化的基本概念,即通过调整发电机端电压、变压器变比、电容器容量等参数来减少网损、电压偏差和无功偏差。接着解释了遗传算法的工作原理以及其在处理复杂、非线性优化问题时的优势。随后,作者通过具体的案例分析,展示了遗传算法在这两个节点系统中的应用效果,证明了其有效性。最后讨论了改进后的遗传算法所带来的性能提升,强调了其在全球最优解搜索方面的优势。此外,还提供了MATLAB伪代码,帮助读者更好地理解和实现这一方法。 适用人群:从事电力系统研究和技术开发的专业人士,尤其是那些关注无功优化和智能电网发展的研究人员和技术人员。 使用场景及目标:适用于希望深入了解遗传算法在电力系统无功优化中应用的研究人员和技术人员。目标是在实际项目中应用遗传算法及其改进版本,以提高电力系统的经济性和安全性。 其他说明:本文不仅提供了理论分析,还包括了详细的实验数据和MATLAB伪代码,有助于读者快速掌握遗传算法的具体实现步骤。同时,也为后续研究提供了有价值的参考方向。

Global site tag (gtag.js) - Google Analytics