`

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

阅读更多
Rop概述

Rop是Rapid Open Platform的简称,它不同于一般纯技术型的Web Service框架(如CXF,Jersey等),Rop致力于构建开放服务平台的框架,您可以使用Rop开发类似于淘宝开放服务平台这样的服务平台。Rop充分借鉴了当前大型网站的开放服务平台的设计思路,汲取了它们成功的实践经验,对开放服务平台的很多应用层领域问题给出了解决方案,开发者可以直接使用这些解决方案,也可以在此基础上进行个性化扩展。

Rop功能架构


CXF和Jersey是纯技术纯的Web Service框架,而在Rop中,Web Service只是核心,它提供了开发服务平台的诸多领域问题的解决方案:如应用认证、会话管理、安全控制、错误模型、版本管理、超时限制等。
下面通过图1了解一下Rop框架的整体结构:


图1


从图1中,可以看到Rop所提供的大部分功能都是偏“应用层”的,传统技术型的Web Service框架是不会僭越到这些“应用层”的问题的。但是,在实际开发中,这些应用层的问题不但不可避免,而且非常考验开发者的设计经验,此外,这些工作还会占用较大的开发工作量。Rop力图让开发者从这些复杂的工作中解脱出来,让他们可以真正聚焦服务平台业务逻辑的实现上。

Rop技术架构

Rop在技术实现上充分借鉴了Spring MVC的框架设计理念和实现技术,首先RopServlet类似于Spring MVC的DispatcherServlet,是Rop的门面Servlet,负责截获HTTP服务请求转由Rop框架处理。具体技术架构通过图2描述:


图2


Rop的配置信息统一在Spring配置文件中通过rop Schema命名空间定义。ServiceRouter是Rop框架的核心,它负责协调各组件的交互并最终完成服务处理的工作。RopServlet在启动时会从Spring容器中搜索出ServiceRouter的Bean实例并注册之。

在服务请求到达后,RopServlet截获请求并转交给ServiceRouter处理,ServiceRouter将服务请求封装成一个的RopRequestContext对象,RopRequestContext包含了服务请求的所有信息。而后,ServiceRouter使用SecurityManager检查服务请求的安全性,只有通过了SecurityManager的安全检查,才会调用目标服务处理方法执行服务,否则将阻止请求并返回错误响应信息。

完成SecurityManager的安全检查后,ServiceRouter通过ServiceMethodAdapter对目标的服务方法发起调用。由于具体服务方法的签名各不相同,因此必须采用反射机制进行适配调用。当返回响应对象后,ServiceRouter使用RopMarshaller将响应对象编组为特定的响应报文返回给客户端。

您会发现Rop的顶级框架接口类在Spring MVC中都能找到对应的对象:RopServlet对应DispatcherServlet,ServiceMethodAdapter对应HandlerAdapter,RopMarshaller对应ViewResolver,而ServiceRouter承担了HandlerMapping和部分DispatcherServlet的角色。因此,如果您在学习Spring MVC的框架后,理解Rop框架的实现原理将变得非常轻松。

使用Rop开发一个服务

将Rop项目克隆到本地

由于Rop托管在github (www.github.com)中,为了获取最新的Rop项目,必须在您的系统中安装Git客户端软件,我们推荐使用msysgit,它能够让我们在Windows系统中像Linux一样使用Git。
从http://code.google.com/p/msysgit/下载并安装git客户端msysgit,然而在开始菜单中找到并打开Git Bash,在命令窗口运行如下命令:

引用
cd /d/agileSpring/
git clone git@github.com:itstamen/rop.git


第一行命令将当前工作目录移到某个系统目录下,需要注意的是:由于msysgit是在Windows中模拟的Linux环境,所以D:/对应为/d/。第二行命令,从github中克隆一个Rop项目到您本地机中。



使用以下的Maven命令构建rop和rop-sample项目,打开DOS窗口,移到rop及rop-sample项目的pom.xml所在的目录,执行构建命令:
引用
mvn clean install

还可以通过如下Maven命令,启动rop-sample项目(首先移到rop-sample的pom.xml所在的目录):
引用
mvn jetty:run

如果你不想下载最新的Rop项目,上面的过程就可以免除了,您直接在项目的pom.xml中引入Rop类包就可以了,如下所示:
 <dependency>
     <groupId>com.bookegou</groupId>
     <artifactId>rop</artifactId>
     <version>1.0</version>
 </dependency>

Rop的发布包已经发布到Maven的核心仓库中(org.sonatype.oss),因此你可以直接使用在pom.xml引用即可。

开发一个服务方法

rop-sample项目中有一个com.rop.sample.UserService的服务类,我们就通过这个服务类了解开发基于Rop的Web Service服务的过程。

UserService.java
package com.rop.sample;

import com.rop.RopRequest;
import com.rop.annotation.NeedInSessionType;
import com.rop.annotation.ServiceMethod;
import com.rop.annotation.ServiceMethodBean;
import com.rop.sample.response.LogonResponse;
import com.rop.session.SimpleSession;

//①标注Rop的注解,使UserService成为一个Rop的服务Bean
@ServiceMethodBean 
public class UserService {  

//②使该服务方法成为一个Web Service的方法。
@ServiceMethod(method = "user.getSession", version = "1.0",   
needInSession = NeedInSessionType.NO)
public Object getSession(LogonRequest request) {

	//创建一个会话
	SimpleSession session = new SimpleSession();
	session.setAttribute("userName",request.getUserName());
	request.getRequestContext().addSession("mockSessionId1", session);

	//返回响应
	LogonResponse logonResponse = new LogonResponse();
	logonResponse.setSessionId("mockSessionId1");
	return logonResponse;
}


由于ServiceMethodBean注解已经标注了Spring的@Service注解(即org.springframework.stereotype.Service),因此标注@ServiceMethodBean的类也相当于标注了@Service,Rop扩展Spring @Service的目的是为了引入新的功能特性。
在类方法处标注@ServiceMethod,即可将该方法发布成一个Rop的Web Service服务。@ServiceMethod注解拥有丰富的参数,value值是必须的,它用于指定服务方法名称,version用于指定服务方法的版本号,needInSession用于说明该服务方法是否要工作在会话环境中。更多参数的说明,详见本章后续内容,这里只要了解这么多就可以了。

由于任何一个服务方法都是由请求/响应对构成的,所以在Rop的服务方法的签名是有约定的:入参必须为RopRequest接口或其子类,出参可以是任何标注了JSR 222注解的对象。这种约定在一定程度上限制了方法签名的灵活性,但是由于Rop强烈建议对所有请求参数都做服务端校验,因此把参数封装成一个Java类并在类属性中标注JSR 303注解,就可以在参数绑定时实施数据校验了。来看一下LogonRequest的类:

LogonRequest.java
package com.rop.sample.request;
import com.rop.AbstractRopRequest;
import com.rop.annotation.IgnoreSign;
import javax.validation.constraints.Pattern;

public class LogonRequest extends AbstractRopRequest{

    @Pattern(regexp = "\\w{4,30}") 
    private String userName;

    @IgnoreSign
    @Pattern(regexp = "\\w{6,30}") 
    private String password;
   
    //get/setter
}


Rop采用“契约优于配置”的原则:请求参数按名称匹配的方式自动绑定到请求对象的属性上。在请求对象类中,Rop使用JSR 303(Bean Validation )注解描述请求参数的校验规则,如果请求参数值违反了校验规则,Rop将驳回服务请求,直接返回相应的错误报文给客户端。

服务方法必须返回一个响应对象,Rop框架会将其转换成响应报文。在这个例子中,如果服务正常执行,将返回一个LogonResponse的对象。LogonResponse类定义如下:

package com.rop.sample.response;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "logonResponse")
public class LogonResponse{

    @XmlAttribute
    private String sessionId;

    …
}


Rop使用JSR 222(即JAXB)注解描述响应类到响应报文的转换映射关系,响应对象最终将以响应报文的形式(XML或JSON)返回给客户端。

如何在Spring中配置Rop

Rop基于Spring框架工作,可以看成是一个Spring的子项目。Rop提供了一个扩展的Spring Schema命令空间,使用Rop Schema在Spring配置文件配置好Rop环境非常方便:

sampleRopApplicationContext.xml
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:rop="http://www.bookegou.com/schema/rop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-3.1.xsd

       http://www.bookegou.com/schema/rop    ①引入Rop Schema定义文件 
http://www.bookegou.com/schema/rop/rop-1.0.xsd">

    <!--② 扫描Spring Bean-->
    <context:component-scan base-package="com.rop.sample"/>

    <!--③启动Rop框架 -->
    <rop:annotation-driven/>
</beans>


首先,引入Rop的Schema命名空间,如①处所示。由于Rop的服务类必须是一个Bean,所以需要声明Spring的扫描器,将标注了Spring Bean注解的类加载为Spring容器中的Bean。由于@ServiceMethodBean注解本身标注了Spring的@Service,所以所有标注了@ServiceMethodBean的类也会自动成为Spring的Bean。最后,我们通过一个简单<rop:annotation-driven/>即可启动Rop框架,如③所示。

在web.xml配置Rop

由于客户端需要通过HTTP访问Rop服务,因此Rop必须依附于一个Web Servlet容器。和Spring MVC的DispatcherServlet类似,Rop提供了一个com.rop.RopServlet,在web.xml中配置好RopServlet,这样Rop就可以接收HTTP的服务请求了:

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
		  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath*:sampleRopApplicationContext.xml
        </param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>

    <!--①定义一个RopServlet,并指定其映射的URL-->
    <servlet>
        <servlet-name>rop</servlet-name>     
        <servlet-class>
            com.rop.RopServlet
        </servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>rop</servlet-name>
        <url-pattern>/router</url-pattern>
    </servlet-mapping>
</web-app>


由于Rop是基于Spring工作的,因此首先必须在web.xml中配置一个Spring容器,然后再通过RopServlet指定Rop的工作的路径。

引用
值得注意的是,Rop依赖于Spring框架而非Spring MVC框架,因此你的Web应用框架是可以自由选择的,如Struts、JSF等。


访问Rop服务

在rop-sample项目中,我们已经配置maven-jetty-plugin插件,因此IDE的环境下可以直接运行这个插件:jetty->jetty:run 启动rop-sample项目。在控制台中,您将可以看到rop-sample启动的输出信息。(也可以在DOS窗口下执行 mvn jetty:run命令启动)

下面开发一个访问rop-sample服务的客户端程序:

package com.rop.sample;

import com.rop.client.CompositeResponse;
import com.rop.client.DefaultRopClient;
import com.rop.client.RopClient;
import com.rop.client.ClientRequest;
import com.rop.sample.request.LogonRequest;
import com.rop.sample.response.LogonResponse;
import org.testng.annotations.Test;
import static org.testng.Assert.*;

public class UserServiceClient {

    //①
    public static final String SERVER_URL = "http://localhost:8088/router"; 
    public static final String APP_KEY = "00001";
    public static final String APP_SECRET = "abcdeabcdeabcdeabcdeabcde";
    private RopClient ropClient = 
new DefaultRopClient(SERVER_URL, APP_KEY, APP_SECRET);

    @Test
public void createSession() {

        //②构造请求对象
        LogonRequest ropRequest = new LogonRequest();  
        ropRequest.setUserName("tomson");
        ropRequest.setPassword("123456");


        //③对服务发起调用并获取响应结果
        CompositeResponse response = ropClient.buildClientRequest()
                       .get(ropRequest, LogonResponse.class, "user.getSession", "1.0");

        assertNotNull(response);
        assertTrue(response.isSuccessful());
        assertNotNull(response.getSuccessResponse());
        assertTrue(response.getSuccessResponse() instanceof LogonResponse);
        assertEquals(((LogonResponse) response.getSuccessResponse()).getSessionId(), 
                     "mockSessionId1");
    }
}


大凡Web Service框架都会提供服务的客户端,DefaultRopClient即是Rop提供了客户端,您可以非常方便地通过DefaultRopClient以面向对象的方式访问服务获取响应对象,无需关心服务请求和响应报文的底层细节。
运行以上测试方法,通过报文抓取工具,我们可以看到“真实”的底层通信细节,如下图4所示:



由此可见,DefaultRopClient会自动将LogonRequest请求对象拼装成一个请求URL,同时,在接收到响应报文后,会将响应报文反编组成一个响应对象。


  • 大小: 45.2 KB
  • 大小: 52 KB
  • 大小: 71.8 KB
  • 大小: 106.5 KB
分享到:
评论
2 楼 gansuzxd 2015-01-24  
请教一个问题,如果项目由多个子系统构成,后期计划还有业务系统接入,为了扩大生态圈计划建开放平台,有一个问题是对于同一厂商内部各业务系统之间通过开放平台API调用呢还是通过SOA呢?或者说淘宝电商平台网站、订单、商品……多个系统之间是基于开放平台吗?
1 楼 guzhixiong 2013-07-26  
有一个问题,就是加载rop1.0.xsd的时候,tomcat 在启动的时候,总是报
cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'rop:annotation-driven'. 不知道楼主是否碰到过这样的问题

相关推荐

    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等)的服务器和客户端提供了高度可定制化和高性能的...

    pwn学习资料整理——ROP技术(pwn_rop1)

    pwn学习资料整理——ROP技术(pwn_rop1)

    Rop-Fast:快速跳动

    1. **快速开发**:Rop-Fast简化了REST服务的创建过程,提供了一套简洁的API,使开发者可以快速构建服务接口。 2. **Rop框架扩展**:Rop-Fast在原Rop框架上进行了增强,修复了已知的bug,提高了框架的稳定性和可靠性...

    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指令结束,通过巧妙地控制程序的...

Global site tag (gtag.js) - Google Analytics