摘要:相信未来REST规范将会变得更加流行和普及。

本文分享自华为云社区《云原生时代,远程服务调用和RESTful,如何分析和抉择?》,作者:breakDawn 。

随着云原生的概念越来越火,服务的架构应该如何发展和演进,成为很多程序员关心的话题。大名鼎鼎的《深入理解java虚拟机》一书作者于21年推出了新作《凤凰架构》,从这本书中可以看到当前时下很多最新的技术或者理念。

本博文将沉淀发布这本书的学习笔记和思考。 如果希望了解更加详细的内容,欢迎购买该书继续详细学习。

访问远程服务

1 远程服务调用

这一个章节主要讲解rpc的设计理念和发展历史。
先是讲解了IPC(进程间通信)所需要的各个必要因素
接着解释RPC 是IPC的一种特例(这是最初科学家们的想法)
但PRC存在很多可靠性的问题,并不能直接等同IPC的扩展。

接着提出了RPC的三个基本问题:

  1. 如何表示数据
    即序列化协议, 有grpc的proto-buffer、json、xml、java-rmi基于java自带序列化之列的
  2. 如何传递数据
    基于什么网络协议传输
    java-rmi的远程协议
    JSON-RPC协议
    SOAP协议(web service 简单对下访问)
  3. 如何表示方法
    如何定义方法,如何在不同语言、不同系统环境中保证 方法签名唯一。
    需要对接口描述定义语言有一个选型

再后面讲解了rpc的发展历史
CORBA的使用过于复杂,被抛弃
SOAP使用xml很简单,但是性能奇差
可以看出RPC想同时满足简单、普适、高性能是很难的
于是得出一个结论:

不存在完美的RPC框架

最近几年的RPC框架更倾向于往高层次、插件化发展。
即不再独立解决RPC的所有问题,而是提供一些扩展点由用户自己选择(比如dubbo)
可以任意切换json或者fastjson等序列化方式
可以切换传输协议等。

2 REST

rest并不是一种远程调用协议, 他只能说是一种风格。
REST的传输效率提升潜力有限,但是可以简化调用。

2.1 REST核心概念(基于HTTP超文本传输协议)

  • 资源
    资源指你希望获取或者修改的东西、信息本身,他的表现形式可以不同,但是里子是相同的
  • 表征
    就是表现资源的形式,用html还是pdf来返回
  • 状态
    指的是服务端对某次会话是否持有状态。
    例如读下一篇文章时,当前文章id由服务端存储还是浏览器存储,这就是有状态和无状态的区别。
  • 转移
    就是服务端提供的行为逻辑, 通常叫做 资源的转移
  • 统一接口
    就是HTTP协议里提供的GET\HEAD\POST\PUT\DELETE\TRACE\OPTIONS这七种操作,通过这些操作触发转移
  • 超文本驱动
    浏览器的行为经常是通过服务端返回的url或者各种信息触发了驱动行为
  • 自描述消息
    为了方便客户端识别表征,返回类似于Content-Type等内容,方便用何种字符集处理

2.2 REST核心设计原则

  1. 客户端与服务端分离
    服务端不处理渲染, 由客户端来处理
  2. 无状态
    尽可能希望服务端不要存储rest会话状态,达到分布式的高价值回报。
    但是不太可能特别是客户端持有会话数量级很大的情况下,所以仍旧会持有一定状态
  3. 可缓存
    服务端的应答中要直接或者间接告知客户端是否可以缓存,缓存多久
  4. 分层系统
    客户端不需要知道是否真的连接到了最终的服务器
    代表是CDN内容分发网络
  5. 统一接口
    面向资源编程
    系统设计时聚焦在资源而不是行为上
    例如面向行为时, 登录就是login接口,注销就是logout接口
    而面向资源时,登录就是PUT Session, 注销就是DELETE Session
  6. 按需代码
    客户端的代码可以有一部分让服务端发回进行装载。

2.3 REST的好处

  • 降低服务接口的学习成本
  • 资源天然具有集合与层次接口
    这样很多资源可以很容易组合在一起并让使用者想到接口url是什么
    例如获取 用户 icyfenix的购物车中的第2本书,这个是有层次的,那么接口就是GET /user/icyfenix/cart/2
  • REST绑定于HTTP协议,HTTP又是大家非常熟悉的

2.4 RMM(Richardson提出的restful成熟度模型)

第0级:完全不rest

提供的api定义里总是包含了各种动作,例如
/queryXXX
/applyXXX
类似于RPC的行为接口
坏处是一旦要提供其他对XXX的操作,必须重新编写接口,无法对XXX的查询能力进行复用!

第1级:开始引入资源的概念

api的endpoint定义应该围绕名词+资源id而不是动词来定义。
POST /doctors/mjones 获取医生的档期
POST /schedules/{id} 触发对这个id的调度

第2级: 引入统一接口,映射到HTTP方法上

上面的method都是POST,实际上可以把HTTP方法的method、返回码都给利用上

  • 对一个资源的增加用POST,删除用DELETE,更新用PUT
  • 依赖HTTP的返回码定义资源可能的异常情况。例如201代表创建成功,409代表冲突(被人抢先预约)
  • 利用HTTP自带的认证和授权信息。

第3级:超文本控制,转移行为通过响应控制

第2级里, 所有接口的定义仍然需要使用者自己查询文档来记忆和应用
实际上应该只需要一个操作起始入口, 例如获取医生的档期接口
这个接口要返回的body里,已经告知了对应资源的名称,例如档期资源的key就叫做schedules
那么就能马上知道下一个接口查询用schedules了!
这样代码里可以做好适配,当你要把档期的key名做修改时,客户端代码根本不用变动!

2.2.4 REST的不足和争议

1.restful面向资源编程只适合做CRUD,不适合过于复杂的业务逻辑

  • 面向过程编程,以算法和处理过程为中心,这符合计算机世界中主流的交互方式
  • 面向对象编程,将数据和对象行为统一起来,因为这符合现实世界的主流交互方式
  • 面向资源编程,数据作为主体,行为看成统一接口,为了符合网络世界的主流交互方式

2.rest不利于事务支持
作者不同意这个观点, 认为不会有阻碍,取决于系统的事务设计

3.rest没有传输可靠性支持
虽然确实没有类似于重发等机制的保证,但rest接口一般尽可能要求幂等性,来做到应用代码做重发时可以不用担心重复的问题

4.缺少对资源做部分或者批量处理的能力
rest语义里不能涵盖这种情况,得定义特殊的接口或者参数,那么低3级里面就不能涵盖了。

相关思考

基于REST的规范,调用者可以非常快速地理解自己需要的接口内容是什么样的,例如华为云当前的很多云服务公开接口都会基于REST理念进行开放, 并且各云服务的开放接口都会集成到API Explorer和华为云SDK中心供开发者直接调用,这些平台提供了丰富的接口文档和示例代码,帮助开发者更快地上手和使用 REST 接口。

相信未来REST 规范将会变得更加流行和普及。随着云计算和大数据技术的不断发展,REST 接口将会被广泛应用于各种领域,例如医疗、金融、电商等。REST 接口的开放性、可扩展性和易用性,将会为开发者带来更加高效、便捷和可靠的开发体验。

点击关注,第一时间了解华为云新鲜技术~

读书笔记丨远程服务调用和RESTful,如何分析和抉择?的更多相关文章

  1. 机器学习实战 - 读书笔记(11) - 使用Apriori算法进行关联分析

    前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第11章 - 使用Apriori算法进行关联分析. 基本概念 关联分析(associat ...

  2. 【读书笔记】Cronjob原理及源码分析

    原文链接:https://mp.weixin.qq.com/s?__biz=MzI0NjI4MDg5MQ==&mid=2715291842&idx=1&sn=e605f9b40 ...

  3. R in action读书笔记(13)第十章 功效分析

    功效分析 功效分析可以帮助在给定置信度的情况下,判断检测到给定效应值时所需的样本量.反过来,它也可以帮助你在给定置信度水平情况下,计算在某样本量内能检测到给定效应值的概率.如果概率低得难以接受,修改或 ...

  4. <<Java RESTful Web Service实战>> 读书笔记

    <<Java RESTful Web Service实战>> 读书笔记 第一章   JAX-RS2.0入门 REST (Representational State ransf ...

  5. spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法

    spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法 前言 本篇接着<spring boot / cloud ...

  6. 读书笔记_MVC__关于通过js构建ORM,实现Model层

    最近一直在学习MVC构建富应用的WEB程序,自己一直对MVC的设计模式理解的不是十分透彻,终于在研读了github上Spine的源码之后,对构建Model层有了一点自己的理解. 本文仅为个人理解,如有 ...

  7. 《android开发艺术探索》读书笔记(二)--IPC机制

    接上篇<android开发艺术探索>读书笔记(一) No1: 在android中使用多进程只有一种方法,那就是给四大组件在AndroidMenifest中指定android:process ...

  8. head first java读书笔记

    head first java读书笔记 1. 基本信息 页数:689 阅读起止日期:20170104-20170215 2. 标签 Java入门 3. 价值 8分 4. 主题 使用面向对象的思路介绍J ...

  9. 《大型网站系统与Java中间件》读书笔记 (中)

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 回顾上一篇: <大型网站系统与Java中间件& ...

  10. 《C#本质论》读书笔记(18)多线程处理

    .NET Framework 4.0 看(本质论第3版) .NET Framework 4.5 看(本质论第4版) .NET 4.0为多线程引入了两组新API:TPL(Task Parallel Li ...

随机推荐

  1. 14.9 Socket 高效文件传输

    网络上的文件传输功能也是很有必要实现一下的,网络传输文件的过程通常分为客户端和服务器端两部分.客户端可以选择上传或下载文件,将文件分块并逐块发送到服务器,或者从服务器分块地接收文件.服务器端接收来自客 ...

  2. TIOBE 11月榜单:Java和 C# 之间的差距缩小到0.7

    TIOBE 公布了 2023 年 11 月的编程语言排行榜. 虽然这期重点介绍的是Kotlin,本月,它的排名上升了 0.17%,从第 18 位上升到第 15 位,前进了 3 位. TIOBE的10月 ...

  3. 文心一言 VS 讯飞星火 VS chatgpt (136)-- 算法导论11.3 2题

    二.用go语言,假设将一个长度为r的字符串散列到m 个槽中,并将其视为一个以 128 为基数的数,要求应用除法散列法.我们可以很容易地把数 m 表示为一个 32 位的机器字,但对长度为r的字符串,由于 ...

  4. 四载磨砺,一群青年“识瘤者”以AI助力医疗创新

    ​​本文分享自华为云社区<[先锋开发者云上说]四载磨砺,一群青年"识瘤者"以AI助力医疗创新>,作者:Gauss松鼠会小助手2 . 一群青年"识瘤者" ...

  5. Codeforces Round #706 (Div. 2) A-D题解

    写在前边 链接:Codeforces Round #706 (Div. 2) \(A,B,C,D\),这场有点简单,不过由于A写炸了后边题连看都没看就溜了,就从上大分变成了掉大分 A. Split i ...

  6. [AI]探寻高等生命的多面驱动

    引子 意识从来是一个前沿课题,充满了学术大神,也充满了神棍.对于意识的讨论和研究需要保持开放的思想,也要遵守理性的严格的方法.我们不是着急去推翻什么或者声称发现了什么,我们大部分要做的事情是把实验多重 ...

  7. docker制作compose

    第一步,先了解Compose是什么? Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排. Compose有两个重要的概念 1.项目 :由一组关联的应用 ...

  8. serdes IP集成使用常见踩坑问题

    1.不支持小数分频,或者小数分频后频偏过大部分速率配置无法使用. 2.CDR 不稳定,经常无法锁定,或者温变时出现失锁情况,以及cdr lock信号无法准备上报状态. 3.CORE内部多个lane之间 ...

  9. 循环依赖导致编译或者服务启动报错问题:The dependencies of some of the beans in the application context form a cycle

    错误如图: 我的是服务器启动服务时报错: ***************************APPLICATION FAILED TO START************************* ...

  10. tomcat服务器报错

    看问题 报错信息里面说 tomcat目录下conf下的aaa.xml报错 根据目录找到aaa.xml发现aaa.xml里面是空的,删除了之后就不报错了 不知道为啥这个就会报错,以前也出现过没有解决,这 ...