`

Rop开发手册(5):最简单的服务开放平台框架

阅读更多
引用

Rop,即Rapid Open Platform,是一个参考淘宝开放平台(TOP Taobao Open Platform)的平台设计思路,充分借鉴Spring MVC的技术架构原理开发的一个快速服务开放平台开源框架项目,可以让您迅速构建成熟的SOA服务平台。它不同于传统的SOAP Web Service和Rest Web Service这些Web Service 技术型框架,Rop是一个应用型的Web Service平台框架,它不但可以方便快捷地开发一个个Web Service服务,还提供了服务平台领域问题的整体解决方案。因此,...

传统的Web Service框架帮助你建造房子,而Rop框架帮助您建造城市。

Rop项目文档前后写了一个多月,在写的过程中发现很多功能不完善的,又回过头了改项目,此种反复多次,现在Rop开源项目的文档已经差不多了,将陆续在iteye此发出,希望对大家有帮助。在Rop项目的开发过程中得到了众多iteye网友的有力帮助,收到了很多很好的整改的意见,在此对他们的奉献和帮助表示诚挚的感谢,这些网友包括但不限于:
melin
kellokitty
風一樣的男子
lioliang
木木的爱情童话
devotionalist
ericliang
 

Rop相关资源:
1.github:https://github.com/itstamen/rop
2.群组:http://rop.group.iteye.com/


目录
1.快速了解Rop
2.请求服务模型
3.应用授权及验证
4.服务会话管理
5.错误处理模型
6.响应报文控制
7.文件上传
8.服务安全控制
9.拦截器及事件体系
10.性能调优
11.开发客户端SDK
12.参考资料


错误模型概述

对于服务开放平台来说,不管发生了什么错误,都必须返回相应的错误报文,以便客户端应用能够根据错误报文做出相应的响应。每个服务都可能存在各种错误,如服务参数不合法、访问权限不足、版本不正确、访问超限等等。如果需要开发者自行设计这套错误模型并处理所有这些错误,那将是一项艰巨的工程。

Rop参考TOP建立了一个完整的错误模型,该错误模型拥有强大的表达能力和扩展性,很多错误自动于Rop负责处理,对于业务性的错误,开发者按错误模型构造即可。Rop将开发者从服务错误处理的荆棘丛中解放出来,从而可以将精力集中于具体的业务逻辑的处理上。

Rop的错误模型分为主错误和子错误两个层级,每个错误报文都会对应一个主错误和若干个子错误,主错误描述错误的类型,子错误说明错误的原因。子错误根据责任归属可以划分为ISP(Internet Service Provider)和ISV(Independent Software Vendors)两种类型的错误。如下图所示:

[
img]http://dl.iteye.com/upload/attachment/0072/7375/6baa1f54-0640-3f6a-9fa6-09c12e40f22d.jpg[/img]
图1


ISP代表平台服务提供商一方,如服务内部异常、服务端数据库资源不可用等错误,其责任归属于ISP,这类错误称为ISP错误。ISP错误的错误编码以“isp.”为前缀,如isp.xxx-service-unavailable、isp.xxx-service-timeout等。

ISV代表基于平台服务开发应用的开发者一方,这类错误产生的原因是由于开发者造成的。ISV错误的错误编码以“isv.”为前缀,如isv.invalid-permission、isv.missing-parameter:xxx等。
当服务发生错误时,Rop将返回统一格式的错误报文,它由一个主错误和若干个子错误组成。下面即是一个完整的错误报文:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<error code="33">
    <message>非法的参数</message>
    <solution>请查看根据服务接口对参数格式的要求</solution>
    <subErrors>
        <subError code="isv.invalid-paramete:salary">
            <message>参数salary无效,格式不对、非法值、越界等</message>
        </subError>
        <subError code="isv.invalid-paramete:userName">
            <message>参数userName无效,格式不对、非法值、越界等</message>
        </subError>
    </subErrors>
</error>


<error>代表主错误,它拥有一个对应编码,此外还包括错误消息及解决方法。subErrors元素中包含多个子错误,详细说明是哪些参数违反数据了校验规则,子错误的编码附带了违反校验规则的参数名,对定位错误非常有帮助。

系统级主错误编码

Rop内置定义了一套和业务无关的错误代码体系,我们称这些错误为系统级错误。Rop在i18n/rop/error的国际化资源文件(目前提供了zh_CN和en两个国际化资源文件)中定义了系统级主错误及子错误。

在Rop中,主错误都对应一个唯一的数字编码,目前共包括27个主错误,通过下表进行说明:

表1 系统级主错误编码
错误编码 错误说明 错误编码 错误说明 错误编码 错误说明
1 服务不可用 20 缺少sessionId参数 29 非法的版本参数
2 开发者权限不足 21 无效的sessionId参数 30 不支持的版本号
3 用户权限不足 22 缺少appKey参数 31 无效报文格式类型
4 图片上传失败 23 无效的appKey参数 32 缺少必选参数
5 HTTP方法被禁止 24 缺少签名参数 33 非法的参数
6 编码错误 25 无效签名 34 用户调用服务的次数超限
7 请求被禁止 26 缺少方法名参数 35 会话调用服务的次数超限
8 服务已经作废 27 不存在的方法名 36 应用调用服务的次数超限
9 业务逻辑出错 28 缺少版本参数 37 应用调用服务的频率超限

27个系统级错误可以划分为以下几类:
  • 系统级参数错误:这类错误是由于系统级请求参数缺失或不合法引起的,20~31都是这一类型的错误;
  • 业务级参数错误:业务级参数缺失或不合法而引起的错误,如32和33;
  • 服务访问超限错误:客户端的服务调用超过配额,34~37都是这一类型的错误;
  • 权限不足错误:如2和3的错误都是开发者或应用用户的权限不足,造成服务无法访问的错误;
  • 其它错误:以上类型之外的错误。


系统级子错误编码

子错误的编码是一个格式化的层级编码串,如isp.xxx-service-unavailable、isv.xxx-not-exist:invalid-yyy等,其中xxx和yyy都是变量占位符,会根据具体的错误填写相应的值。

每个子错误都对应一个主错误,而一个主错误可以对应多个子错误。子错误和主错误的映射关系在Rop的com.rop.validation.SubErrors中定义,SubErrors类拥有一个获取子错误对应主错误的静态方法:

public static MainError getMainError(SubErrorType subErrorType, Locale locale)


MainErrorType和SubErrorType的枚举类分别定义了系统级主错误和子错误的编码,主子错误的国际化信息都在i18n/rop/error的国际化资源文件中定义。

ISP子错误编码

Rop目前仅拥有两个ISP的子错误,它们对应的主错误编码为1,即Service Currently Unavailable主错误。这两个ISP子错误分别是:

  • isp.xxx-service-unavailable=调用后端服务{0}抛异常:{1},服务不可用。\n异常信息:\n{2}
  • isp.xxx-service-timeout = 调用{0}服务超时,该服务的超时限制为{1}秒,请和服务平台提供商联系


因服务平台原因产生的任何错误,如数据库连接不上,某个服务资源不可用,内部抛出异常等,都对应isp.xxx-service-unavailable的ISP子错误。其中子错误代码中的xxx会被替换成具体的服务名。如user.get服务对应的子错误码为:isp.user-get-service-unavailable。

isp.xxx-service-unavailable的错误消息是带参数的格式化串,Rop会将引起错误的异常信息格式化到消息内容中。假设我们调用user.getSession服务方法,其内部抛出了IllegalArgumentException,则客户端将得到一个如下的错误报文:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<error code="1">
    <message>Service Currently Unavailable</message>
    <solution>Service Currently Unavailable</solution>
    <subErrors>
        <subError code="isp.user-getSession-service-unavailable">
            <message>
call the back-end service user.getSession thrown
exception:java.lang.IllegalArgumentException, the service is unavailable.
        exception info is :
…
</message>
        </subError>
    </subErrors>
</error>


详细的错误信息不但方便客户端应用的开发者进行问题的定位,还可以充分利用这些错误信息进行用户交互设计和业务逻辑的处理,有效提高服务开放平台的可编程能力。

Rop允许设置服务执行的最大过期时间,即一个服务的执行超过指定限时后,直接返回错误报文,释放服务端资源,以平衡服务平台资源的利用。Rop默认不设置服务过期时间,可通过<rop:annotation-driven/>的service-timeout-seconds属性指定服务执行最大过期时间,单位为秒:

<rop:annotation-driven service-timeout-seconds="10"/>


每个服务方法都可以定义自己的服务过期时间,以覆盖<rop:annotation-driven/>所定义的统一过期时间,来看一个例子:

UserService.java:指定服务过期时间
@ServiceMethod(method = "user.timeout", version = "1.0", timeout = 1) ①
public RopResponse timeoutService(CreateUserRequest request) throws Throwable {
	Thread.sleep(2000);  ②
	CreateUserResponse response = new CreateUserResponse();
	response.setCreateTime("20120101010102");
	response.setUserId("2");
	return response;
}


在①处通过@ServiceMethod的timeout属性为user.timeout服务方法指定的过期时间为1秒。在②处,我们故意让该服务方法睡眠2秒钟,以便超过服务方法过期时间的限制。客户端调用该服务方法后,则返回如下的错误报文:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<error code="1">
    <message>服务不可用</message>
    <solution>服务目前无法使用</solution>
    <subErrors>
        <subError code="isp.user-timeout-service-timeout">
            <message>
调用user.timeout服务超时,该服务的超时限制为1秒,请和服务平台提供商联系。
</message>
        </subError>
    </subErrors>
</error>


ISV子错误编码

在实际应用中,开发者遇到更多的都会是ISV的错误。Rop定义了5个ISV子错误,说明如下:
  • isv.missing-parameter:xxx=缺少必要的参数{0}
  • isv.parameters-mismatch:xxx-and-yyy=传入的参数{0}和{1}不匹配;
  • isv.invalid-paramete:xxx=参数{0}无效,格式不对、非法值、越界等
  • isv.invalid-permission=权限不够、非法访问
  • isv.xxx-not-exist:invalid-yyy=根据{0}查询不到{1}

其中,前3个子错误都是由于业务级参数未能通过合法性校验而引起的。当请求参数对象的属性打上@NotNull的JSR 303注解时,即说明该请求参数是必须的,如果未提供该参数就会报出isv.missing-parameter:xxx子错误,其中xxx为具体的参数名。

Rop将请求参数绑定到请求参数对象属性时,如果发生类型不匹配的错误(如将aaa赋给一个整型的属性),将返回isv.parameters-mismatch:xxx-and-yyy的子错误码,其中xxx为参数名,而yyy为请求参数的值。违反其它校验规则的统一返回isv.invalid-paramete:xxx的子错误,其中xxx为未通过校验的参数名。

可以通过SecurityManager实现类开发服务权限管理逻辑,如果SecurityManager驳回服务的访问,则说明应用或用户的权限不足,不能访问某个受限平台服务,Rop将返回isv.invalid-permission的子错误,
isv.xxx-not-exist:invalid-yyy子错误表示不存在对应某个ID的对象,如根据userId获取用户对象时,如果查不到对应的对象,则返回该子错误。以上我们介绍的4个ISV子错误,ROP都会自动产生,无需服务开发者关注。
而isv.xxx-not-exist:invalid-yyy则需要服务开发者自己负责创建,可以通过Rop的NotExistErrorResponse对象产生该错误。来看一个rop-sample中的例子:

代码清单 UserService.java:模拟返回CreateUserResponse响应
@ServiceMethod(method = "user.get", version = "1.0", httpAction = HttpAction.GET)
public RopResponse getUser(RopRequest request) throws Throwable {
	String userId = request.getRopRequestContext().getParamValue("userId");
	if("9999".equals(userId)){                                              ①
		return new NotExistErrorResponse("user","userId","9999",
request.getRopRequestContext().getLocale());
	}else{
		CreateUserResponse response = new CreateUserResponse();
		//add creaet new user here...
		response.setCreateTime("20120101010102");
		response.setUserId(userId);
		response.setFeedback("user.get");
		return response;
	}
}

NotExistErrorResponse构造函数的第1个入参为对象名,第2个入参为查询使用的属性名,第3个参数为查询的属性值。使用userId值为9999的请求参数调用该服务时,将返回如下的响应报文:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<error code="33">
    <message>Invalid Arguments</message>
    <solution>
check the Required application parameter is valid(refer the subError message)
</solution>
    <subErrors>
        <subError code="isv.user-not-exist:invalid-userId">
            <message>cant find userId by 9999</message>
        </subError>
    </subErrors>
</error>


Rop所定义的子错误码其实是一个模式化串,Rop会根据具体的错误产生相应的编码。这些模式化的子错误码基本上涵盖了各种通用的错误,从模型设计角度上看,这个错误模型是收敛的。因此,使用Rop的平台开发者无需再为设计错误码而烦心了,直接使用这个错误模型即可,大大降低了服务平台设计的难度。

业务级子错误编码

系统级子错误模型是业务无关的通用性错误,在使用Rop开发您的服务平台时,一定会有很多业务相关的错误。如删除一个不允许删除的业务单据,在单据未通过审核时直接审批等等,这些业务相关的错误,称之为业务级子错误。
Rop设计了一个通用的业务级子错误编码: isv.xxx-service-error:yyy,其中xxx为服务方法名(服务方法名的“.”替换成“-”),而yyy为业务错误代码,一般由大写英文字符组成,来看几个具体的业务级子错误编码的示例:
  • isv.order-delete-service-error:ORDER_NOT_ALLOW_DELETE;
  • isv.order-approve-service-error:ORDER_IS_NOT_AUDIT;
  • isv.user-password-change-service-error:PASSWORD_TOO_SIMPLE;


由于业务级子错误是由服务平台开发者自己定义的,因此错误码及错误信息的国际化资源也必须由服务平台开发者提供。rop-sample的业务级子错误国际化资源位于rop-sample项目的i18n/rop/sampleRopError资源文件中。我们来看一下对应zh_CN的资源文件:

引用
isv.user-add-service-error\:USER_NAME_RESERVED= {0} 是预留的用户,请选择其它的用户名.


sampleRopError_zh_CN.properties目前仅定义了一个业务级子错误,可以在该文件中定义任意多个错误。属性值可以使用{n}定义变量占位符,以便在运行其替换成具体的内容。

在属性资源文件中,属性键名如果包含“:”或“=”的字符,必须使用转义符,即在其前面添加“\”字符。如果属性值一行编写不下,可以通过“\”进行分行。具体参见java.util.Properties类的JavaDoc的说明。

必须在<rop:annotation-driven/>中指定业务级子错误资源文件的地址,以便Rop将其加载到框架中:

<rop:annotation-driven ext-error-base-name="i18n/rop/sampleRopError"/>


所有业务级子错误对应的主错误码均为9(业务逻辑出错),Rop提供了一个用于构造业务级错误的响应类,即BusinessServiceErrorResponse,其构造方法如下所示:

public BusinessServiceErrorResponse(String serviceName, String errorCode, Locale locale, 
Object... params)


serviceName为服务方法,即method系统参数对应的值,如“user.get”。errorCode为业务错误代码,如ORDER_NOT_ALLOW_DELETE、ORDER_IS_NOT_AUDIT等,它将用于替换isv.xxx-service-error:yyy中的“yyy”。最后的params用于替换错误消息内容的{n}中。

我们通过rop-sample的一个例子了解业务级子错误的具体使用方法:

代码清单UserService.java:模拟返回CreateUserResponse响应
@ServiceMethod(method = "user.add", version = "1.0")
public RopResponse addUser(CreateUserRequest request) {
	if (reservesUserNames.contains(request.getUserName())) {
 		return new BusinessServiceErrorResponse(
		  request.getRopRequestContext().getMethod(), "USER_NAME_RESERVED",
		  request.getRopRequestContext().getLocale(), request.getUserName());       ①
	} else {
		CreateUserResponse response = new CreateUserResponse();
	     response.setCreateTime("20120101010101");
		response.setUserId("1");
		return response;
	}
}


user.add是一个用于注册新用户的服务,它需要保证新增的用户名不能使用预留的用户名,否则返回一个isv.user-add-service-error:USER_NAME_RESERVED的业务级错误。
假设“jhon”是预留的用户名,如果调用user.add服务时,上传的userName参数是“jhon”,将返回如下的错误响应报文:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<error code="9">
    <message>业务逻辑出错</message>
    <solution>请了解服务调用的前置条件,检查是否满足业务逻辑</solution>
    <subErrors>
        <subError code="isv.user-add-service-error:USER_NAME_RESERVED">
            <message>jhon 是预留的用户,请选择其它的用户名.</message>
        </subError>
    </subErrors>
</error>


  • 大小: 24.8 KB
分享到:
评论

相关推荐

    Rop开发手册

    Rop框架适用于各种服务开放平台的开发,尤其适合那些需要处理复杂应用层面问题的场景,如电商平台、社交媒体平台等。通过利用Rop提供的成熟解决方案,开发者可以减少重复劳动,更加专注于业务逻辑的实现,提高开发...

    ROP(Rest Open Platform)用户开发手册

    Rop,即Rapid Open Platform,是一个参考淘宝开放平台(TOP Taobao Open Platform)的平台设计思路,充分借鉴Spring MVC的技术架构原理开发的一个快速服务开放平台开源框架项目,可以让您迅速构建成熟的SOA服务平台。...

    基于淘宝开放平台开源的rop

    总之,ROP框架为开发者提供了一套全面且易于使用的工具集,不仅降低了构建服务开放平台的门槛,还极大地提高了开发效率。通过借鉴淘宝开放平台的成功实践,ROP框架能够在各种复杂的业务场景下表现出色,为构建高效、...

    rop开放平台

    在描述中提到的“rop开放平台s”可能是这个平台的某种特定版本或服务,但信息过于简略,无法提供更详细的解释。通常,这样的平台可能会提供以下功能: 1. **漏洞分析**:用户可以上传目标二进制文件,平台会分析其...

    Rop framework

    与传统的 WebService 框架(例如 CXF 和 Jersey)不同,Rop 不仅提供了 WebService 的核心功能,还针对服务开放平台中的应用层问题提供了多种解决方案。 **特点**: 1. **易于上手**:Rop 的设计使得开发者能够...

    rop demo完整用例

    本示例是基于Maven构建的ROP框架,Maven是一个流行的Java项目管理工具,它帮助开发者管理和构建项目,依赖管理、构建过程自动化等功能使得开发更加便捷。在本案例中,Maven被用来组织和管理项目的依赖关系,确保所有...

    ROP(Rest Open Platform)开发指南

    ### ROP(Rest Open Platform)开发指南知识点解析 #### 一、REST服务框架的问题域 REST服务框架在解决Web服务的交互过程中面临多种挑战。主要包括: 1. **通讯报文协议**:REST服务通常需要支持多种数据交换格式,...

    ROP(Rest-Open-Platform)开发指南

    #### REST服务框架的问题域与解决方案 REST(Representational State Transfer)是一种轻量级的网络应用程序架构风格,被广泛应用于Web服务中。ROP(Rest-Open-Platform)作为一种面向RESTful服务的开发框架,旨在...

    rop-master.rar

    RopRop 开发类似于淘宝 开发类似于淘宝 开发类似于淘宝 开发类似于淘宝 服务开放平台 服务开放平台 服务开放平台 这样的服务平台 这样的服务平台 这样的服务平台 这样的服务平台 。RopRopRop充分借鉴了当前大型网站...

    ROP : Read origin protocol:ROP 是一种计算协议,用于发现所有读取的来源-开源

    ROP 是一种计算协议,旨在发现所有读数的来源,这些读数源自复杂的 RNA 分子、重组抗体和微生物群落。 ROP 占 poly(A) 和核糖耗竭协议所有读数的 98.8%,而传统的基于参考的协议为 83.8%。 ROP 分析重复、circRNA、...

    rop-sample.rar_.comrop_rop_rop源码下载_taobao netty

    ROP在淘宝的网络通信框架中扮演了重要角色,它允许开发者构建安全且高性能的网络服务。而Netty,作为一个异步事件驱动的网络应用框架,为各种协议(包括TCP、UDP等)的服务器和客户端提供了高度可定制化和高性能的...

    Rop-Fast:快速跳动

    Rop-Fast在Rop的基础上进行了扩展和优化,解决了原始框架中的一些问题,并提供了更友好的API和更快的性能,使得开发人员能够更高效地构建Web服务。 **RESTful服务介绍** REST(Representational State Transfer)是...

    rop-plus:rop框架修改加强版

    `rop-plus`是一个针对Java平台的ROP框架的增强版本,它为开发者提供了更强大的工具和功能,以进行ROP攻击的研究和防御。框架的主要特点可能包括: 1. **gadget库**:`rop-plus`可能包含了一个庞大的Java gadget库,...

    apple-rop:Apple里面集成ROP框架

    在iOS开发中,为了提高代码的安全性和执行效率,开发者们经常使用各种技术手段,其中一种是Return-Oriented Programming(ROP)框架。本文将深入探讨Apple内部集成的陈雄华的ROP框架,以及其在Java环境下的应用。 *...

    Rapid Open Platform

    Rop,即Rapid Open Platform,是一个参考淘宝开放平台(TOP Taobao Open Platform)的平台设计思路,充分借鉴Spring MVC的技术架构原理开发的一个快速服务开放平台开源框架项目,可以让您迅速构建成熟的SOA服务平台。...

    开放平台(Open Platform)

    开放平台是指软件系统或网络服务通过公开其应用程序编程接口(API)或特定函数的方式,允许外部开发者开发的应用程序能够访问和利用该系统的功能或资源,而无需直接修改系统源代码。这种设计方式促进了软件生态系统...

    rop轻松谈.pdf

    ROP輕鬆談 ROP(Return Oriented Programming)是一種exploit技术,該技術通過在程式碼中注入惡意代碼,控制程式的執行流程,達到攻擊的目的。本文將對ROP技術進行詳細的介紹,涵蓋ROP的基本概念、Buffer Overflow...

    rop编程入门

    ROP编程,全称Return-Oriented Programming,是一种高级的计算机安全攻击技术。它的核心思想在于利用程序中已存在的指令片段(称为gadgets)来实现攻击者的目的。这些gadgets以ret指令结束,通过巧妙地控制程序的...

    Nguyen:OptiROP——ROP gadgets搜寻神器

    9月25日,SyScan360 2013国际前瞻信息安全会议在北京国家会议中心举行。安全专家Nguyen Anh Quynh同与会者共同探讨《OptiROP:ROP gadgets搜寻神器》这一议题,并现场传授使用OptiROP的方法。

Global site tag (gtag.js) - Google Analytics