http://blog.csdn.net/fiboliu/article/details/50340011

WebX RPC顾名思义,是基于webx框架之上支持异步请求的一种扩展,是轻量级的RPC框架。

WebX RPC说明

1.1、意义

1. 对webx框架的扩展,使webx能够更好的支持ajax请求
2. 统一各个站点对webx ajax的使用规范

1.2、不解决的问题

1. 不提供类似DWR框架的client端js输出
2. 不是一个REST的实现(**?**)

1.3、应用范围 & 特性

  • 应用范围: 
    1. 需要使用ajax技术的webx项目 
    2. 已经用过ajax在webx当中的项目

  • 特性: 
    1. 支持annotation的数据绑定和验证 
    2. 统一的错误处理流程 
    3. 支持json、xml、jsonp的输出格式 
    4. 可扩展MimeResult自定义输出格式 
    5. 可扩展RPCResultGenerator来完成对生成结果的自定义包装 
    6. 提供全局的拦截器和方法级别的拦截器 
    7. 框架内置的XSS和CSRF安全过滤器 [前端如何实现]

1.4、快速开始

  • 添加Maven库依赖pom.xml 片段:

<dependency><groupId>com.alibaba.platform.shared</groupId><artifactId>webx3.extension.rpc</artifactId><version>0.2.6</version></dependency><!--fasttext配置 begin --><dependency><groupId>com.alibaba.platform.shared</groupId><artifactId>fasttext.all</artifactId><version>1.3</version></dependency>

配置Web-RPC的基础服务

  • pipeline.xml中增加对RPC的拦截支持,pipeline.xml片段

<when><pl-conditions:target-extension-condition extension="json,jsonp,xml,xhtml" /><valve class="com.alibaba.citrus.extension.rpc.integration.RPCServiceHandlerValve" /></when>
  • 在webx-component.xml中配置以下服务,Spring配置文件片段

<!-- ===================================================  --><!-- WebX3 RPC 服务配置 (开始)--><!-- ===================================================  --><!-- RPC 数据绑定服务 --><beans:bean id='rpcDatabindService' class='com.alibaba.citrus.extension.rpc.databind.RPCDatabindServiceImpl'><beans:property name="registry"><beans:bean id='databinderRegistry' class='com.alibaba.nonda.databind.impl.DatabinderRegistryImpl'><beans:property name="binderFactories"><beans:list><beans:bean class="com.alibaba.citrus.extension.rpc.databind.RPCDatabinderFactory"/></beans:list></beans:property></beans:bean></beans:property></beans:bean><!-- RPC 数据验证服务 --><beans:bean id='rpcValidateService' class="com.alibaba.nonda.integration.webx3.validation.ValidateService4WebX3" /><!-- RPC URL与组件的映射服务 --><beans:bean id='rpcUrlComponentMapping' class="com.alibaba.citrus.extension.rpc.impl.URLComponentMappingImpl"><!-- 标识RPC服务的命名空间(通过不同的namespace来模板化不同的业务) --><beans:property name="namespace" value="${component}" /><!--  是否启用URL的驮峰转换,缺省为true --><beans:property name="useCamelCaseURL" value="false" /></beans:bean><!-- RPC 处理请求的核心服务 --><beans:bean id='rpcServiceHandler' class="com.alibaba.citrus.extension.rpc.impl.RPCServiceHandlerImpl"><!-- 示例:覆盖缺省的 resultGenerator --><beans:property name="resultGenerator"><beans:bean class="com.alibaba.sample.showcase.web.rpc.common.generator.MyCustomResultGenerator" /></beans:property><!-- 示例:添加全局自定义的Interceptor --><beans:property name="interceptors"><beans:list><beans:bean class="com.alibaba.sample.showcase.web.interceptors.SecurityInterceptor" /></beans:list></beans:property><!-- 示例:配置全局的属性过滤器 --><beans:property name="propertyFilters"><beans:list><!-- Trim2Null过滤器  --><beans:bean class="com.alibaba.citrus.extension.rpc.response.impl.Trim2NullPropertyFilter" /></beans:list></beans:property><!-- xssType配置选择项有两种: 1.delete会直接删除xss标签 2.escape会将xss标签做转义输出  系统默认delete--><beans:property name="xssType" value="escape" /></beans:bean>

在webx-应用模块.xml中增加对RPC类型组件的扫瞄支持 
webx-应用模块.xml中的module-loader片段

<!-- 装载模块。 --><services:module-loader><ml-factories:class-modules><ml-factories:search-packages type="$1" packages="xxx.yyy.module.*" /></ml-factories:class-modules><ml-adapters:adapter class="com.alibaba.citrus.extension.rpc.integration.RPCModuleAdapterFactory" /></services:module-loader>

1.5、编写一个HelloRPCService类:

在module目录下添加新的package:rpc,编写对应的服务类。映射的实现可以参看上面配置文件的 rpcUrlComponentMapping部分. 
例如对于:HelloRPCService.java 类

 @WebResource("hello")    public class HelloRPCService { // some fields// getter & setter @ResourceMapping("/loadUser")      public  String loadUser() {        return  user;}

访问的URL为: 
http://localhost:8081/hello/loadUser.json (输出json格式) 
http://localhost:8081/hello/loadUser.xml (输出xml格式) 
参数传递: 
public Object groupQuery(@RequestParam(name=”id”) Integer id, HttpSession session) { 

RPC返回的参数类型,一般采用JSON的方式传回,如何返回复杂的JSON数据结构,例如: 
{“data”:[ 
{}, 
{}, 
{} 
], 
“totalCount”:50, 
“pageSize”:10, 
“currentPage”:1 

针对这样的数据结构,产生结果时,采用Map

1.6、高级应用

1.6.1、定义自己的result generator

result generator代码示例: 
public class ErrorMessageResultGenerator implements RPCResultGenerator { 
private static final Logger logger = LoggerFactory.getLogger( ErrorMessageResultGenerator.class ); 
/** 
* code

* 500: RPC服务异常

* 404: 没有匹配的RPC服务

* rpc_system_exception: RPC框架异常

* rpc_invalid_arg: 数据绑定异常

* null: 数据验证异常 
*/ 
private static final Map

1.6.2、RPC Wraper对所有的RPC请求进行统一的包装,RPC Wraper

web-app.xml //针对应用的xml配置

示例程序的RPC Wraper:

package com.tmall.mastermind.web.rpcwraper;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import phoenix.exception.DSLServiceException;
import com.alibaba.common.lang.StringUtil;
import com.tmall.mastermind.app.auth.service.api.AccessControlSwitcherService;
import com.tmall.mastermind.exception.MastermindException;
import com.tmall.mastermind.exception.MastermindExceptionType;
import com.tmall.mastermind.web.helper.BUCUserInfoHelper;
@Slf4j
public class RpcResultWraper {
@Resource
AccessControlSwitcherService accessControlSwitcherService;public Object doWrap(ProceedingJoinPoint pjp) throws MastermindException {Map<String, Object> result = new HashMap<String, Object>();try {rpcSwitcher(pjp);return pjp.proceed();} catch (MastermindException me) {result.put("result", "false");result.put("errorMsg", me.getErrorMsg());return result;} catch (DSLServiceException e) {result.put("result", "false");result.put("errorMsg", "系统繁忙~" + MastermindExceptionType.TIME_OUT.getMsg());log.error("erro on :" + pjp.getClass(), e);result.put("debugMsg", e.getMessage());return result;} catch (Throwable e) {result.put("result", "false");result.put("errorMsg", "系统开小差了~" + MastermindExceptionType.EXECUTION_FAILED);log.error("erro on :" + pjp.getClass(), e);result.put("debugMsg", e.getMessage());return result;}
}/*** rpc访问控制开关* * @param pjp* @throws MastermindException*/
private void rpcSwitcher(ProceedingJoinPoint pjp) throws MastermindException {if (!accessControlSwitcherService.isSwitcherEnabled()) return;String url = getRequestUrl(pjp.getTarget());if (StringUtil.isEmpty(url)) {return;}log.info("rpcSwitcher: get request url:" + url);String empId = BUCUserInfoHelper.getEmpId(getRequest(pjp.getTarget()));if (StringUtil.isEmpty(empId)) {log.error("rpcSwitcher error!! get empty empId from request");throw new MastermindException(MastermindExceptionType.EXECUTION_FAILED, "无法获取用户信息");}accessControlSwitcherService.checkWhiteList(url, empId);
}private String getRequestUrl(Object target) {HttpServletRequest request = getRequest(target);if (null == request) {return "";}return new String(((HttpServletRequest) request).getRequestURL());
}private HttpServletRequest getRequest(Object t) {Field field = null;try {field = t.getClass().getDeclaredField("request");} catch (Exception e) {log.error("rpcSwitcher error!! RPC-Object does not have request object", e);return null;}if (null == field) {return null;}HttpServletRequest request = null;boolean save = field.isAccessible();field.setAccessible(true);try {request = (HttpServletRequest) field.get(t);} catch (Exception e) {log.error("rpcSwitcher error!! could not get request from field", e);}field.setAccessible(save);return request;
}
}

1.6.3、RPC timeout

1.7、WebX RPC原理

Pipeline任务的分发处理,RPC Service Handler, 处理的关键点,结果集合的重新生成,包括JSON、XML格式的结果集合。同时可以自己定义结果的生成集合。 
RPC和Web服务区分 WebX的不同于Rest服务是一种RPC实现这种区分在于分布系统中的两种实现,一种是Web Service,一种是RPC实现。Web服务遵循SOAP协议。 
RPC客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。 
Web Service本身其实是在实现应用程序间的通信。我们有两种应用程序通信的方法:RPC远程过程调用和消息传递。使用RPC的时候,客户端的概念是调用服务器上的远程过程,通常方式为实例化一个远程对象并调用其方法和属性。RPC系统试图达到一种位置上的透明性:服务器暴露出远程对象的接口,而客户端就好像在本地使用的这些对象的接口一样,这样就隐藏了底层的信息,客户端也就根本不需要知道对象是在哪台机器上。 
Web Service是构造分布式、模块化应用程序和面向服务应用集成的最新技术和发展趋势。Web服务是基于Web容器的,使用Servlet来实现。 
RPC OVER HTTP Microsoft RPC-over-HTTP 部署(RPC over HTTP)允许RPC客户端安全和有效地通过Internet 连接到RPC 服务器程序并执行远程过程调用。这是在一个名称为RPC-over-HTTP 代理,或简称为RPC 代理的中间件的帮助下完成的。 
RPC代理运行在IIS计算机上。它接受来自Internet 的RPC 请求,在这些请求上执行认证,检验和访问检查,如果请求通过所有的测试,RPC 代理将请求转发给执行真正处理的RPC 服务器。通过RPC over HTTP,RPC客户端不和服务器直接通信,它们使用RPC 代理作为中间件。 
WebX的实现也是类似的,是一种RPC over HTTP的实现。

转载于:https://my.oschina.net/tangxi/blog/638827

WebX RPC说明相关推荐

  1. RPC 笔记(05)— socket 通信(单线程服务器)

    1. Python 标准库 1.1 socket 提供 RPC 服务的网络通信功能,方便用户编写 tcp/udp 相关的代码.两个不同机器的进程需要通信时,可以通过 socket 来传输数据. ​ 客 ...

  2. RPC 笔记(03)— gRPC 概念、安装、编译、客户端和服务端示例

    1. gRPC 概念 gRPC 是 Google 开源的一款高性能的 RPC 框架.GitHub 上介绍如下: gRPC is a modern, open source, high-performa ...

  3. RPC 笔记(01)— RPC概念、调用流程、RPC 与 Restful API 区别

    1. 基本概念 PRC 远程过程调用 Remote Procedure Call,其就是一个节点请求另外一个节点提供的服务.当两个物理分离的子系统需要建立逻辑上的关联时,RPC 是牵线搭桥的常见技术手 ...

  4. RPC远程调用通俗理解

    先从一个案例来讲RPC(文章来自程序人生微信号) 查看全文 http://www.taodudu.cc/news/show-64152.html 相关文章: linux下yum错误:[Errno 14 ...

  5. TVM交叉编译和远程RPC

    TVM交叉编译和远程RPC 本文介绍了TVM中使用RPC的交叉编译和远程设备执行. 使用交叉编译和RPC,可以在本地计算机上编译程序,然后在远程设备上运行它.当远程设备资源受到限制时(如Raspber ...

  6. RPC(远程过程调用协议)介绍

    RPC框架解释 谁能用通俗的语言解释一下什么是RPC框架? -远程过程调用协议RPC(Remote Procedure Call Protocol) 首先了解什么叫RPC,为什么要RPC,RPC是指远 ...

  7. 轻量级分布式 RPC 框架

    RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样. RPC 可基于 HTTP 或 TCP 协议,Web Servi ...

  8. windows下rpc框架thrift的环境配置

    windows下rpc框架thrift的环境配置 引用链接: https://www.cnblogs.com/49er/p/7193829.html 最近在弄windows下 的Facebook的rp ...

  9. SpringBoot整合Grpc实现跨语言RPC通讯

    什么是gRPC gRPC是谷歌开源的基于go语言的一个现代的开源高性能RPC框架,可以在任何环境中运行.它可以有效地连接数据中心内和跨数据中心的服务,并提供可插拔的支持,以实现负载平衡,跟踪,健康检查 ...

  10. gitlab报错 fatal: index-pack failed error: RPC failed; result=18, HTTP code = 200解决方案

    gitlab报错 "fatal: index-pack failed error: RPC failed; result=18, HTTP code = 200",如下图 这个问题 ...

最新文章

  1. mysql 开启远程
  2. 机器学习之SVM原理与案例
  3. 你用过这种奇葩的C#注释吗?如何看待
  4. 【Android Protobuf 序列化】Protobuf 使用 ( Protobuf 源码分析 | 创建 Protobuf 对象 )
  5. 小程序笔记一:基础设置
  6. pytorch离线安装(探索尝试版本)
  7. 小小攻城师,步步达成梦想!
  8. oracle 快照用途,Oracle快照原理及实现总结
  9. Warning: mysqli::__construct(): php_network_getaddresses: getaddrinfo failed:
  10. pandas中DataFrame对象to_csv()方法中的encoding参数
  11. docker搭建私有仓库笔记
  12. 通俗讲解比特币的原理及运作机制
  13. 用MACD决策树模型预测股票趋势
  14. 百度地图 变黑问题 解决方法
  15. redis.exceptions.ResponseError: Command # 2 (HDEL select_6 1) of pipeline caused error: WRONGTYPE Op
  16. Office2013 Visio2013 Project2013零售版与VL版互相转换
  17. 无干扰网络收音机:Radium for Mac
  18. css:flex布局子元素宽度被压缩问题
  19. 项目4-分数类和整型数的四则运算
  20. 【Cicadaplayer】播放器的时间戳

热门文章

  1. VS2010/MFC编程入门之三十二(常用控件:标签控件Tab Control 上)
  2. 基于考研的C语言与数据结构指北
  3. 高等代数-三-消元法
  4. 遗传算法详解及matlab代码实现
  5. Oracle所有分析函数
  6. 挑战程序设计竞赛——抽签Ⅱ
  7. rfid 物流业务信息系统介绍
  8. c语言课程设计--太空战机,基于Funcode平台的软件课程设计
  9. 人工智能——前言概述
  10. SAP BW报表使用操作手册——基础操作