- 浏览: 3507489 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
wanglf1207:
EJB的确是个不错的产品,只是因为用起来有点门槛,招来太多人吐 ...
weblogic-ejb-jar.xml的元素解析 -
qwfys200:
总结的不错。
Spring Web Flow 2.0 入门 -
u011577913:
u011577913 写道也能给我发一份翻译文档? 邮件437 ...
Hazelcast 参考文档-4 -
u011577913:
也能给我发一份翻译文档?
Hazelcast 参考文档-4 -
songzj001:
DbUnit入门实战
远程服务调用框架设计与实现
Auther: cenwenchu
Email: wenchu.cenwc@alibaba-inc.com
Version: 0.1
Date: 2007-6-22
SVN: http://svn.alibaba-inc.com/repos/opentech/sandbox/remoting/trunk
目的
为远程服务调用提供统一的框架,该框架集中解决远程调用过程中的三方面问题:
a. 应用透明性:应用的接口和实现不依赖于框架的实现。框架可以透明的切换各种远程调用技术,而上层应用的接口和实现不用做任何调整。
b. 安全性:安全性主要包括两个方面:身份及签名验证 ( 防篡改伪造 ) ;数据传输保密性 ( 防监听 ) ; IP 认证。
c. 调用频度控制:为保证服务可用,需要对于调用频度根据一定的规则进行控制。
实现技术
由于调用双方都是基于 Java 的应用,实现技术上建议采用基于 Spring 的 Remoting 框架,这样可以实现应用透明性,接口开发人员不用考虑远程调用等与业务无关的技术细节。基于 Spring 框架并进行扩展,我们可以在框架层次实现安全性和调用频度限制。
由于调用双方不在一个局域网环境内,因此在具体通讯协议上,最佳选择即为 Http 。因此我们推荐的实现技术包括: Spring Remoting + Spring HttpInvoker ,以及 Spring Remoting + Hessian 。
安全性包括身份验证和数据传输安全两个方面,身份验证可以根据调用双方的信任程度以及性能要求确定采用对称加密或者非对称加密,当前提供了三种验证措施,用户名加密认证, IP 认证,以及消息数字摘要加密验证,该验证可以在 Spring Remoting 基础上进行扩展。数据传输安全则主要是担心数据在传输过程中被截获,对于基于 Http 的传输,使用 Https 即可 ( 无需在框架或者应用层支持 ) 。
调用频度控制,则可以应用 AOP 技术,对于调用进行截获和统计,根据一定的规则,判断调用是否符合控制策略。
接口定义和实现规范
接口定义和实现为简单的 POJI 和 POJO 即可,不过为了满足远程调用的需要,需要保证所有参数和返回值都是可序列化的,另外,鉴于部分远程调用技术的序列化机制的特殊性 ( 例如 Hessian) ,数据类型应尽可能简单。此外,基于性能考虑,远程接口调用方式适用于中低频度的小数据量的调用,对于大批量数据同步或者相当高频度的调用,远程接口调用方式并不合适。
设计实现
基本类图
图 1 远程服务发布类结构图
针对 Hessian 和 HttpInvoker 两种远程服务调用的方式封装了对于安全控制的两个安全发布类,具体的安全配置以及安全操作都在 RemoteContractTemplate 中,这样可以方便扩展任何安全的需求变更,并且对原有任何的 Exporter 做了安全切面处理,防止过度耦合。
图 2 远程服务调用类结构图
远程服务调用对于不同的方法调用需要不同的定制,这里针对 Hessian 和 HttpInvoker 采用了替换植入内部处理类的方式, Hessian 植入了新的 HessianProxyFactory 用来生成新的 HessianProxy 来植入安全机制, HttpInvokerFactoryBean 植入了新的 HttpInvokerRequestExecutor 来植入安全机制,同样安全配置以及操作都封装在 RemoteContractTemplate 中,集中控制和配置,方便扩展和管理。
基本流程图
图 3 基本流程图
如 上图所示,用户发起请求调用远程服务,首先是创建远程服务代理,然后通过植入安全信息将请求发送到远程服务发布处理类中,首先检查安全信息,如果通过安全 检测就进入方法调用拦截器中检验类似于频率之类的限制过程中,通过拦截器的检测就可以调用真正的远程服务,并且获得结果,将结果返回并封装安全信息返回给 服务调用代理,代理首先检测是否有合法的安全信息,如果通过安全信息认证,将结果返回给客户端。
具体的配置和使用
这里通过一个 Demo 来说明如何使用这个远程服务调用框架。
假定一个售票管理服务要发布,售票管理服务结构图如下:
图 4 售票管理服务结构图
服务类接口为 TicketManage ,实现类是 TicketManageImpl 。测试调用类为 TicketManageClient 。接口和接口的实现类就是按照普通的 Java 规范来实现即可, TicketManageClient 根据你选择不同的服务调用方式来编写代码,这里用到了 Hessian 和 HttpInvoker 两种方式,代码如下:
public static void main(String[] args)
{
ApplicationContext ctx = new ClassPathXmlApplicationContext( "ticket.xml" );
TicketManage ticketManage = (TicketManage)ctx.getBean( " ticketService " ); //hession 调用的配置
Ticket ticket = ticketManage.buyTicket(20);
System. out .println( "ticket seat: " + ticket.getSeat());
int returncost = ticketManage.returnTicket(ticket);
System. out .println( "return ticket, get back cost :" + returncost);
TicketManage httpTicketManage = (TicketManage)ctx.getBean( "ticketHttpService" ); //HttpInvoke 调用的配置
ticket = httpTicketManage.buyTicket(30);
System. out .println( "ticket seat: " + ticket.getSeat());
returncost = httpTicketManage.returnTicket(ticket);
System. out .println( "return ticket, get back cost :" + returncost);
}
ticket.xml 是客户端的 spring 配置文件,具体的内容如下:
<?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-autowire="byName">
<!—- 安全模版配置类,参数在后面会有详细解释 -->
<bean id="remoteContractTemplate" class="com.alibaba.common.remoting.util.RemoteContractTemplate" init-method="init">
<property name="encryptKeyPath" value="file:c:\\key.ky" />
<property name="decryptKeyPath" value="file:c:\\key.ky" />
<property name="algonrithm" value="RSA"/>
<property name="needMD" value="true"/>
<property name="needUserAuth" value="true"/>
<property name="user">
<list>
<value>taobao</value>
<value>zhifubao</value>
<value>b2b</value>
</list>
</property>
<property name="owner" value="alisoft"/>
<property name="connectTimeout" value="6"/>
<property name="readTimeout" value="0"/>
<property name="needIPAuth" value="true"/>
<property name="ipList">
<list>
<value>10.0.26.23</value>
<value>10.0.0.42</value>
</list>
</property>
</bean>
<!—- 需要植入到 HttpInvokerProxyFactoryBean 的安全请求处理类 -->
<bean id="securityHttpInvokerRequestExecutor" class="com.alibaba.common.remoting.http.SecurityHttpInvokerRequestExecutor">
<property name="remoteContractTemplate" ref="remoteContractTemplate" />
</bean>
<!—- 发布服务的 Bean -->
<bean id="ticketHttpService" class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
<property name="serviceUrl" value="http://localhost:80/remote-examples/remote/TicketHttpService"/>
<property name="serviceInterface" value="com.alibaba.common.remoting.test.TicketManage"/>
<property name="httpInvokerRequestExecutor" ref="securityHttpInvokerRequestExecutor"/>
</bean>
<!—- Hessian 的安全代理工厂类 Bean -->
<bean id="securityHessianProxyFactory" class="com.alibaba.common.remoting.hessian.SecurityHessianProxyFactory">
<property name="remoteContractTemplate" ref="remoteContractTemplate" />
</bean>
<bean id="ticketService" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
<property name="serviceUrl" value="http://localhost:80/remote-examples/remote/TicketService"/>
<property name="serviceInterface" value="com.alibaba.common.remoting.test.TicketManage"/>
<property name="proxyFactory" ref="securityHessianProxyFactory"/>
</bean>
</beans>
上面的 xml 中蓝色的内容需要根据具体的情况作修改,黑色的内容则不需要修改。
安全模版配置类参数具体说明:下面是代码中的说明,大家一看就应该明白了
private String encryptKeyPath ; //encryptKey 的路径
private String decryptKeyPath ; //decryptKey 的路径
private Key encryptKey ; // 根据 encryptKey 的路径生成的 key
private Key decryptKey ; // 根据 decryptKey 的路径生成的 key
private String algonrithm ; // 算法
private String needMD ; // 是否需要 MD 校验
private String needUserAuth ; // 是否需要加密
private List<String> user ; // 允许对方访问或者返回结果的用户名
private String owner ; // 自己的签名
private byte [] encrypted ; // 加密后的用户签名,一次加密,多次使用,增加性能提升
private String encoding = "GB2312" ; // 编码方式,加密和 md 的内容的编码方式
private String needIPAuth ; // 是否需要 IP 认证
private List<String> ipList ; // 允许访问的 ip 列表
private int readTimeout = 0; // 读取数据超时时间设置,单位秒
private int connectTimeout = 0; // 连接超时时间设置,单位秒
客户端设置好以后,就需要设置服务端了:
服务端很简单首先是类似于 Spring 的 Hessian 和 HttpInvoker 调用的配置一样,在 WEB-INF/lib 下面放入 toolkit-sandbox-remoting.jar 以及其它以来的 jar ,然后配置 web.xml ,增加如下内容(这都是 spring mvc 框架的配置,大家可以参考 spring 来配置):
<servlet>
<servlet-name>remote</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>remote</servlet-name>
<url-pattern>/remote/*</url-pattern>
</servlet-mapping>
te
发表评论
-
说明SOA监管(SOA Governance)实例(收录备查)
2012-12-19 11:35 1758SOA 已经不是单纯技术问 ... -
Injecting Spring Beans into Java Servlets
2012-11-01 10:21 1943If you are working in a Java ... -
用 HttpServletResponseWrapper 实现 Etag 过滤器
2012-07-09 16:58 3764原文出处:http://blog.chenlb.com/200 ... -
Eclipse Indigo - Cannot install Android ADT Plugin
2012-02-29 01:17 3890When I try to install the And ... -
Eclipse Indigo - Cannot install Android ADT Plugin
2012-02-29 01:13 1996When I try to install the And ... -
[转]mybatis下的分页,支持所有的数据库
2011-07-21 13:21 14844大 家都知道,mybatis的自带分页方法只是逻 ... -
Java framework for text- & console-based forms?
2011-07-21 01:06 1714charva jcurses JNA , ... -
JNA(Java Native Access)学习入门
2011-07-21 01:04 22662Java Native Access 项目 在 ... -
使用IntrospectorCleanupListener 解决quartz引起的内存泄漏
2011-04-20 11:59 13385"在服务器运行过程中,Spring不停的运行的计划任 ... -
DBCP代码研读以及就数据库连接失效的解决
2011-03-31 11:03 3773问题 网上很多评论说DBCP有很多BUG,但是都没有指明是什 ... -
ContextLoaderListener
2010-12-06 15:58 8474(1) org.springframework.web.c ... -
Servlet3.0新功能: 异步处理
2010-12-06 15:22 3190J2EE 6和Glassfish 3V正式发 ... -
Servlet3.0引入的新特性
2010-12-06 15:20 3064Servlet3.0规范的新特性主要是为了3个目的: ... -
100個節點上運行群集亞馬遜EC2上Hazelcast
2010-12-03 23:59 3324本文的目的,適是给妳湮示的細節集群的100個節點。此湮示記錄, ... -
Spring Properties Reloaded
2010-12-02 14:54 4380Spring Properties Reloaded Som ... -
为spring2.5中的jpetstore增加perf4j监控
2010-09-02 13:51 2655perf4j是一款类似于log4j的性能检测工具. 它 ... -
语义网的学习资源大汇集(备忘)
2010-06-23 22:48 1764网上资源 http:/ ... -
使用 JOLAP 实现复杂分析查询
2010-06-06 13:42 1974Shashank Tiwari 在本文中对 ... -
HTML5 Canvas for Internet Explorer
2010-06-04 21:16 1862Canvascape http://www.benjoff ... -
大型网站架构演变和知识体系
2010-06-01 23:47 1986架构演变第一步:物 ...
相关推荐
基于NIO的远程调用框架的设计与实现 master
基于Grpc的分布式远程过程调用框架设计与开发 本文档主要介绍了基于Grpc的分布式远程过程调用框架的设计与开发,该框架旨在解决当前主流远程过程调用框架在传输效率或服务治理方面的不足。通过对Grpc的研究和改进,...
该项目是采用C语言编写的ERPC嵌入式远程调用框架设计源码,集成了48个头文件、14个C源文件、11个动态库文件、10个Markdown文件、8个文本文件、8个归档文件、7个链接库文件、6个Python脚本文件、5个PNG图片文件,以及...
Java远程调用框架是分布式系统中关键的技术,它允许运行在不同计算机上的应用程序相互通信,协同完成任务。本文探讨的是一种基于动态代理的Java远程调用框架,旨在解决传统远程调用技术如RMI(Remote Method ...
EmbedXrpc是一个基于C语言的单片机RPC远程调用框架,旨在简化单片机环境下的远程过程调用开发。该项目采用C#作为IDL(接口定义语言)的实现语言,并结合C#脚本(csscript)进行序列化与反序列化处理。框架通过自动化...
该项目是一款基于Java的高性能分布式服务远程调用框架——motan的设计源码,涵盖744个文件,包括475个Java源文件、54个XML配置文件、51个JavaScript文件、28个CSS文件、22个PNG图像文件、15个HTML文件、14个Markdown...
- 实现服务:服务提供方实现接口并暴露服务。 - 创建客户端:服务消费方创建对应接口的客户端,并通过客户端调用服务。 5. **安全与性能优化** - 身份验证和授权:在远程调用中,安全是重要的一环,可以使用...
当服务启动时,它会在Zookeeper上注册自身的信息,其他服务则可以通过Zookeeper查找并调用这些服务,实现服务间的通信。这种模式增强了系统的容错性和可扩展性,因为服务消费者不再依赖特定的服务实例,而是通过服务...
局域网中远程桌面监控系统的设计与实现 远程桌面监控系统是指通过局域网连接的计算机之间,为了实现远程监控和控制的系统。该系统可以让本地计算机通过局域网访问不同的远程计算机,并对其进行操作。维护人员可以...
gRPC作为一种先进的RPC框架,不仅提供了高效的通信机制,还简化了分布式系统的设计与实现。通过其独特的特性和强大的功能,gRPC已经成为构建现代分布式应用和服务的重要工具之一。无论是对于开发者还是对于最终用户...
"xxl-rpc-master"中的源码可以帮助开发者深入理解其内部实现,包括服务的注册与发现机制、序列化与反序列化过程、以及负载均衡算法的具体实现等。这对于优化自定义的RPC客户端和服务端非常有帮助。 7. **开箱即用*...
该项目为高性能跨语言远程过程调用(RPC)框架的Java实现源码,总计包含777个文件,其中包含502个Java源文件、57个XML配置文件、51个JavaScript文件、28个CSS文件、22个PNG图片文件、15个HTML文件、14个Markdown文件...
### 用Java实现SOAP的XML文档网络传输及远程过程调用(RPC) #### SOAP简介 SOAP(Simple Object Access Protocol,简单对象访问协议)是一种基于XML的协议,它主要用于计算机之间的消息传递,尤其适用于Web服务中...
BRAP(Business Remote Application Protocol)是一个专为Java平台设计的高性能、高可用性的远程调用框架。它旨在简化分布式系统中的服务调用,提供高效、稳定、可扩展的解决方案。在深入探讨BRAP之前,先要理解什么...
总之,Zookeeper 在远程调用框架中的作用是构建一个高效、可靠的分布式服务治理平台,使得服务发现、负载均衡、配置管理和分布式协调变得更加容易和可靠。通过深入理解 Zookeeper 的核心特性和应用场景,开发者可以...
本文将深入探讨在FLEX环境中实现Model-View-Presenter(MVP)模式的应用,以及如何通过ColdFusion进行远程服务调用。MVP模式是一种设计模式,常用于用户界面的架构,旨在分离业务逻辑、用户界面和数据呈现,提高代码...
总之,Spring的HTTP远程调用提供了一种有效的方式,让我们能够在分布式环境中实现服务间的通信。通过合理的配置和服务接口的设计,我们可以构建出灵活、可扩展的应用系统。不过,需要注意的是,HTTP远程调用可能会...
- 实现服务接口,创建`TestHessianImpl`类,这个类会具体执行远程调用所需的操作。如果涉及到实体类(如`User`),这些实体类必须实现`Serializable`接口,以便能够被序列化和反序列化。 2. **实体类设计**: - ...
在IT行业中,远程调用是一种常见的技术,它允许应用程序通过网络接口访问远程系统的服务,而无需关心服务的具体实现。JBoot是一款基于Java的快速开发框架,它提供了对RPC(Remote Procedure Call)的支持,使得...