摘要

在微服务中,restful协议的请求,是描述服务提供者的语言,不仅从语义上可以清晰表达服务的提供的功能,也很好的从格式上描述服务的接口。

正文

笔者最近一直在阅读关于微服务的一些书籍,在微服务中,大家都十分倾向与使用http协议来表达服务之间的连接,相较于普通http请求的描述,使用restful协议描述的http请求,有更好的语义表达,也方便使用者的理解,更能形成一套比较规范的标准,方便公司进行管理和开发。

成熟度模型及理解

Restful的协议在程序中的成熟度,依赖与开发者定义程序的与对业务的理解,没有一家之规,也没有统一的标准,当然,同一公司,不同业务之间,也只能规范统一,而没有统一标准。 参考Leonard Richardson 为REST定义的一个成熟度模型, 大致谈一谈笔者个人的理解。
Level 0 : L0层级服务的客户端只是向服务端点发起HTTP POST/GET请求,进行业务调用,每个请求都指明了需要执行的操作,这个操作针对的目标或者说是业务对象,或者是页面的请求,以及一些必要的参数。在此层级下,最基本的开发,只要理解http编程的人员,都在此层级上可以编写出相应的RESTful接口,当然,前期的web页面,也都可以这么理解,没有什么语义,也没有描述,只能根据开发人员的接口文档,或者现场沟通,才能对此服务进行调用。属于比较初级简单,无序的一个层级。 比如 GET /doctor/select/ /doctor/list 。
Level 1 : L1层级引入资源的概念。要执行对资源的操作,客户端需要发出指定要执行的操作和包含任何参数的请求。在此层级,服务的业务对象,被描述为资源,对资源的操作,通常可以分组为一个资源下的请求,一组请求下的描述,是对某个资源的操作,比如对某个医生查询其擅长的科室,查询其排班时间,预约该医生的诊疗等等请求,都可以分组到对/doctor/{doctorId}/下的资源请求,后台服务可以为资源,页面资源也可以资源,在此基础上,程序可以对请求方进行资源权限的一个校验,是否可以预约某个医生的诊疗等等,用户拥有的权限,与资源访问需要的权限,这些都可以在描述该url时进行说明,也可以通过参数进行描述。在此层级下,请求分组进行描述,一组资源可能需要相应的权限来访问。 比如 Get /doctor/{doctorId}/time GET /doctor/{doctorId}/record POST
Level 2 : L2层级,是在L1层级的基础上,使用动词来执行操作,比如使用GET获取,POST创建,PUT更新,DELETE删除等等,请求查询参数和主体指定操作的参数。此时,可以利用一些基础设施来加速请求的访问,比如使用CDN来缓存GET请求。 比如: GET /doctor/{doctorId}/user PUT /doctor/{doctorId}/user Level 3 : L3层级的服务基于HATEOAS(Hypertext As The Engine Of Application State)原则设计,基本思想是在由GET请求返回的资源信息中包含链接,这些链接能够执行该资源允许的操作。比如:该医生当天的号码资源是否预约完毕,预约完毕后,返回该医生的信息时,则不包含预约的操作或者链接。在此层级下,由于服务返回了可以执行的链接,客户端无需判断当前数据是否可以进行某种操作,也可以直接把权限返回到前端。