本地代码执行
诸如C之类的高级语言中的函数将被汇编为Assembly中的过程 。 它们增加了一个间接级别,使我们不必考虑内存地址。
诸如Java之类的面向对象语言中的方法和多态性增加了另一种间接性 ,使我们不必考虑一组相似功能的特定变体。
尽管有这些间接方式,但方法基本上仍然是过程调用,告诉计算机将执行流从一个内存位置切换到另一个内存位置。 所有这些都是在同一台计算机上运行的同一进程中发生的。
远程执行代码
这与将执行切换到另一个进程或另一台计算机根本不同。 特别是后者非常不同,因为另一台计算机甚至可能没有相同的操作系统,程序可以通过该操作系统访问内存。
因此,尝试尽可能隐藏这种差异的远程代码执行机制(例如RMI或SOAP )在很大程度上失败并不奇怪。 这种技术采用了所谓的远程过程调用 (RPC)。
我们必须区分本地过程调用和远程过程调用的原因之一是RPC的速度慢得多。
对于大多数实际应用程序,这将改变您进行的调用的性质:您将希望进行较少的远程调用,而这些调用的粒度更粗。
另一个原因是本质上组织性比技术性强。
当您调用的代码位于另一台计算机上的另一个进程中时,该另一个进程很可能是由其他人编写和部署的。 为了使这两段代码能够很好地协作,需要某种形式的协调。 这就是我们为耦合付出的代价。
通过界面协调变更
我们还可以在单个过程中看到此问题,例如,当代码部署在不同的jar文件中时。 如果升级代码所依赖的第三方jar文件,则可能需要更改代码以使一切正常。
这种协调令人讨厌。 如果我们只需部署该jar的最新安全补丁程序而不必担心破坏我们的代码,那就更好了。 幸运的是,如果我们谨慎的话,我们可以。
Java之类的语言接口将代码的公共部分和私有部分分开。
客户所依赖的是公共部分,因此您必须以谨慎的方式开发接口,以避免破坏客户。
相反,私有部分可以随意更改。
从界面到服务
在OSGi中 ,接口是所谓的微服务的基础 。 通过在注册表中发布服务,我们可以使客户端无需知道哪个对象实现了给定的接口。 换句话说,客户端可以发现提供服务的对象的身份。 服务注册表成为我们访问功能的入口。
这些接口被称为微服务是有原因的:它们是构成面向服务的体系结构 (SOA)的服务的微型版本。
将微服务直接扩展到“ SOA服务”会导致RPC样式的实现,例如使用SOAP。 但是,我们早先已经确定RPC不是调用远程代码的最佳方法。
输入REST。
RESTful服务
代表性状态转移 (REST)是一种体系结构样式,将Web的优点带入了程序世界。
不能否认Web的可伸缩性,因此这是一个有趣的角度。
与其解释REST通常通过探索其体系结构约束来完成,不如将其与微服务进行比较。
设计良好的RESTful服务具有单个入口点,例如微服务注册表。 该入口点可以采用家庭资源的形式。
我们像访问任何其他资源一样访问主页资源:通过表示。 表示形式是我们需要解释的一系列字节。 这种解释的规则由媒体类型给出。
如今,大多数RESTful服务都基于JSON或XML表示。 资源的媒体类型与对象的接口进行比较。
一些接口包含使我们能够访问其他接口的方法。 同样,资源的表示形式可能包含指向其他资源的超链接 。
基于代码的服务与基于数据的服务
REST和SOAP之间的区别现在变得显而易见。
在SOAP中,就像在微服务中一样,该接口由方法组成。 换句话说,它是基于代码的。
另一方面,在REST中,接口由代码和数据组成。 我们已经看过数据:媒体类型描述的表示形式。 该代码是统一接口 ,这意味着所有资源都相同(统一)。
实际上,统一接口由HTTP方法 GET,POST,PUT和DELETE组成。
由于统一接口对于所有资源都是固定的, 因此任何RESTful服务中的真正汁液都不在代码中,而在数据中:媒体类型 。
正如有发展Java接口的规则一样,也有发展媒体类型的规则,例如, 基于XML的媒体类型 。 (由此得出结论, 您不能对基于XML的媒体类型使用XML模式验证 。)
统一资源标识符
到目前为止,我还没有提到统一资源标识符 (URI)。 许多所谓的RESTful服务的文档可能会让您觉得它们很重要。
但是,由于URI标识资源,因此它们在微服务中的等效项是实现接口的对象的标识。
希望这表明客户端不必关心URI。 仅本地资源的URI很重要。
家庭资源的表示形式包含指向其他资源的链接。 这些链接的含义由链接关系指示。
通过了解链接关系,客户端可以决定要遵循的链接,并从表示形式中发现其URI。
服务版本
我们应尽可能遵循不断发展的媒体类型的规则,而不引入任何重大变化。
但是,有时这是不可避免的。 然后,我们应该创建该服务的新版本。
由于URI不是RESTful API的公共接口的一部分,因此它们不是中继版本信息的正确工具。 可以通过与微服务进行比较来得出指示API主要(即不兼容)版本的正确方法。
每当服务引入重大更改时,都应更改其接口。 在RESTful API中,这意味着更改媒体类型。 然后,客户端可以使用内容协商来请求其理解的媒体类型。
你怎么看?
对于基于数据的接口(如媒体类型),情况并非如此。
随着RESTful服务变得越来越流行,这是需要填补的空白。 以后我会回到这个话题。
您如何设计服务? 您如何记录它们?
翻译自: https://www.javacodegeeks.com/2013/09/rest-101-for-developers.html