- 浏览: 31582 次
- 性别:
- 来自: 广州
最新评论
-
meler:
有问题不理解:<value>rmi://serve ...
spring 远程接口访问及集群方案(三) -
djy1135:
东西实在是太多了
【转】Java开源项目(备查)
Spring提供类用于集成各种远程访问技术。这种对远程访问的支持可以降低你在用POJO实现支持远程访问业务时的开发难度。目前,Spring提供对下面四种远程访问技术的支持:
-
远程方法调用(RMI)。通过使用RmiProxyFactoryBean和RmiServiceExporter,Spring支持传统的RMI(使用java.rmi.Remote interfaces 和 java.rmi.RemoteException)和通过RMI调用器(可以使用任何Java接口)的透明远程调用。
-
Spring的HTTP调用器。Spring提供一种特殊的远程调用策略支持任何Java接口(象RMI调用器一样),它允许Java序列化能够通过HTTP传送。对应的支持类是HttpInvokerProxyFactoryBean和HttpInvokerServiceExporter。
-
Hessian。通过使用HessianProxyFactoryBean和HessianServiceExporter,你可以使用Caucho提供的轻量级基于HTTP的二进制协议透明地提供你的业务。
-
Burlap。Burlap是基于XML的,它可以完全代替Hessian。Spring提供的支持类有BurlapProxyFactoryBean和BurlapServiceExporter。
-
JAX RPC (TODO).
当讨论Spring对远程访问的支持时,我们将使用下面的域模型和对应的业务:
// Account domain object public class Account implements Serializable{ private String name; public String getName(); public void setName(String name) { this.name = name; } }
// Account service public interface AccountService { public void insertAccount(Account acc); public List getAccounts(String name); }
// ... and corresponding implement doing nothing at the moment public class AccountServiceImpl implements AccountService { public void insertAccount(Account acc) { // do something } public List getAccounts(String name) { // do something } }
我们先演示使用RMI向远程客户提供业务,并且会谈到使用RMI的缺点。然后我们将继续演示一个Hessian的例子。
使用RMI提供业务
使用Spring的RMI支持,你可以透明地通过RMI提供你的业务。在配置好Spring的RMI支持后,你会看到一个和远程EJB类似的配置,除了没有对安全上下文传递和远程事务传递的标准支持。当使用RMI调用器时,Spring对这些额外的调用上下文提供捕获,所以你可以插入你的安全框架或安全信任逻辑。
使用RmiServiceExporter提供业务
使用RmiServiceExporter,我们可以将AccountServer对象作为RMI对象输出接口。这个接口可以使用RmiProxyFactoryBean访问,或使用简单RMI把该接口当作传统RMI业务来访问。RmiServiceExporter支持通过RMI调用器提供任何非RMI业务。
当然,我们首先得在Spring的BeanFactory中设置我们的业务:
<bean id="accountService" class="example.AccountServiceImpl"> <!-- any additional properties, maybe a DAO? --> </bean>
接下来,我们使用RmiServiceExporter提供我们的业务:
<bean class="org.springframework.remoting.rmi.RmiServiceExporter"> <!-- does not necessarily have to be the same name as the bean to be exported --> <property name="serviceName"><value>AccountService</value></property> <property name="service"><ref bean="accountService"/></property> <property name="serviceInterface"><value>example.AccountService</value></property> <!-- defaults to 1099 --> <property name="registryPort"><value>1199</value></property> </bean>
正如你看到的,我们更换了RMI注册的端口。通常,你的应用服务器会维护RMI注册,我们最好不要干扰它。业务名被用来绑定业务。所以现在,业务就绑定在rmi://HOST:1199/AccountService上。我们将在客户端使用URL来连接业务。
注意:我们漏了一个属性,就是servicePort属性,它缺省值为0。这个意味着该业务使用匿名端口通讯。当然你也可以指定一个端口。
客户端连接业务
我们的客户端是一个使用AccountService管理账户的简单对象:
public class SimpleObject { private AccountService accountService; public void setAccountService(AccountService accountService) { this.accountService = accountService; } }
为了在客户端连接业务,我们建立另一个bean工厂,它包含这个简单对象和业务连接的配置信息:
<bean class="example.SimpleObject"> <property name="accountService"><ref bean="accountService"/></bean> </bean> <bean id="accountService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean"> <property name="serviceUrl"><value>rmi://HOST:1199/AccountService</value></property> <property name="serviceInterface"><value>example.AccountService</value></property> </bean>
这就是我们在客户端访问远程账户业务所需要做的。Spring透明地创建一个调用器,通过RmiServiceExporter远程提供账户业务。在客户端,我们使用RmiProxyFactoryBean来使用该业务。
使用Hessian或Burlap通过HTTP远程调用业务
Hessian提供了一个基于HTTP的二进制远程协议。它由Caucho创建,更多有关Hessian的信息可以访问http://www.caucho.com。
为Hessian建立DispatcherServlet
Hessian使用一个特定的servlet来通过HTTP通讯。使用Spring的DispatcherServlet概念,你可以很容易地创建这样的servlet来提供你的业务。首先我们必须在你的应用中创建一个新的servlet(下面来自web.xml):
<servlet> <servlet-name>remote</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>
你可能熟悉Spring的DispatcherServlet概念,如果是的话,你得在WEB-INF目录下建立一个应用上下文,remote-servlet.xml 。这个应用上下文会在下一节中使用。
使用HessianServiceExporter提供你的bean
在这个新的应用上下文remote-servlet.xml中,我们将创建一个HessianServiceExporter来输出你的业务:
<bean id="accountService" class="example.AccountServiceImpl"> <!-- any additional properties, maybe a DAO? --> </bean> <bean name="/AccountService" class="org.springframework.remoting.caucho.HessianServiceExporter"> <property name="service"><ref bean="accountService"/></property> <property name="serviceInterface"> <value>example.AccountService</value> </property> </bean>
现在我们准备在客户端连接这个业务。我们使用BeanNameUrlHandlerMapping,就不需要指定处理器映射将请求(url)映射到业务上,因此业务提供在http://HOST:8080/AccountService上。
客户端连接业务
我们在客户端使用HessianProxyFactoryBean来连接业务。和RMI例子中的原则一样。我们将创建一个单独的bean工厂或应用上下文,在SimpleObject使用AccountService来管理账户的地方将会提到下列bean:
<bean class="example.SimpleObject"> <property name="accountService"><ref bean="accountService"/></property> </bean> <bean id="accountService" class="org.springframework.remoting.caucho.HessianProxyFactoryBean"> <property name="serviceUrl"><value>http://remotehost:8080/AccountService</value></property> <property name="ServiceInterface"><value>example.AccountService</value></property> </bean>
就是这样简单。
使用Burlap
我们不在这里讨论Burlap,它只不过是Hessian的基于XML实现。因为它和上面的Hessian的例子以相同的方式配置。只要你把Hessian替换成Burlap就可以了。
在通过Hessian或Burlap输出的业务中应用HTTP基本认证
Hessian和Burlap的优点之一就是我们能很容易地应用HTTP认证,因为两者都是基于HTTP的协议。例如,普通的HTTP服务器安全机制可以很容易地通过使用web.xml安全功能来应用。通常,你不会为每个用户都建立不同的安全信任,而是在Hessian/Burlap的ProxyFactoryBean中定义可共享的信任(和JDBC DataSource相类似)。
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"> <property name="interceptors"> <list> <ref bean="authorizationInterceptor"/> </list> </property> </bean> <bean id="authorizationInterceptor" class="org.springframework.web.servlet.handler.UserRoleAuthorizationInterceptor"> <property name="authorizedRoles"> <list> <value>administrator</value> <value>operator</value> </list> </property> </bean>
这个例子中,我们用到了BeanNameUrlHandlerMapping,并设置了一个拦截器,它只允许管理员和操作员调用这个应用上下文中的bean。
注意:当然,这个例子并没有演示灵活的安全设施。如果考虑更灵活的安全设置,可以去看看Acegi Security System,http://acegisecurity.sourceforge.net。
使用HTTP调用器输出业务
和Burlap和Hessian使用自身序列化机制的轻量级协议相反,Spring HTTP调用器使用标准Java序列化机制来通过HTTP输出业务。如果你的参数或返回值是复杂类型,并且不能通过Hessian和Burlap的序列化机制序列化,HTTP调用器就很有优势(参阅下一节,选择远程技术时的考虑)。
实际上,Spring可以使用J2SE提供的标准功能或Commons的HttpClient来实现HTTP调用。如果你需要更先进,更好用的功能,就使用后者。你可以参考jakarta.apache.org/commons/httpclient。
输出业务对象
为业务对象设置HTTP调用器和你在Hessian或Burlap中使用的方式类似。就象Hessian提供HessianServiceExporter,Spring的HTTP调用器提供了org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter。为了输出AccountService,使用下面的配置:
<bean name="/AccountService" class="org.sprfr.remoting.httpinvoker.HttpInvokerServiceExporter"> <property name="service"><ref bean="accountService"/></property> <property name="serviceInterface"> <value>example.AccountService</value> </property> </bean>
在客户端连接业务
同样,从客户端连接业务与你使用Hessian或Burlap时做的类似。使用代理,Spring可以将你的调用翻译成HTTP 的POST请求到指向输出业务的URL。
<bean id="httpInvokerProxy" class="org.sprfr.remoting.httpinvoker.HttpInvokerProxyFactoryBean"> <property name="serviceUrl"> <value>http://remotehost:8080/AccountService</value> </property> <property name="serviceInterface"> <value>example.AccountService</value> </property> </bean>
就象上面说的一样,你可以选择使用你想使用的HTTP客户端。缺省情况下,HttpInvokerPropxy使用J2SE的HTTP功能,但是你也可以通过设置httpInvokerRequestExecutor属性选择使用Commons HttpClient:
<property name="httpInvokerRequestExecutor"> <bean class="org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor"/> </property>
在选择这些技术时的一些考虑
这里提到的每种技术都有它的缺点。你在选择这些技术时,应该仔细考虑你的需要,你所输出的业务和你在远程访问时传送的对象。
当使用RMI时,通过HTTP协议访问对象是不可能的,除非你用HTTP包裹RMI流。RMI是一种很重的协议,因为他支持完全的对象序列化,这样的序列化在要求复杂数据结构在远程传输时是非常重要的。然而,RMI-JRMP只能绑定到Java客户端:它是一种Java-to-Java的远程访问的方案。
如果你需要基于HTTP的远程访问而且还要求使用Java序列化,Spring的HTTP调用器是一个很好的选择。它和RMI调用器使用相同的基础设施,仅仅使用HTTP作为传输方式。注意HTTP调用器不仅只能用在Java-to-Java的远程访问,而且在客户端和服务器端都必须使用Spring。(Spring为非RMI接口提供的RMI调用器也要求客户端和服务器端都使用Spring)
当在异构环境中,Hessian和Burlap就非常有用了。因为它们可以使用在非Java的客户端。然而,对非Java支持仍然是有限制的。已知的问题包括含有延迟初始化的collection对象的Hibernate对象的序列化。如果你有一个这样的数据结构,考虑使用RMI或HTTP调用器,而不是Hessian。
最后但也很重要的一点,EJB优于RMI,因为它支持标准的基于角色的认证和授权,以及远程事务传递。用RMI调用器或HTTP调用器来支持安全上下文的传递是可能的,虽然这不是由核心Spring提供:而是由第三方或在定制的解决方案中插入拦截器来解决的。
发表评论
-
C#客户端调用Axis2 Java webservice int参数传值问题
2012-08-16 09:40 1662现象: 采用C# webservice studio工具调试a ... -
Linux下JfreeChart中文乱码问题解决
2012-07-17 15:28 926JFreeChart和中文验证码的乱码问题和jsp的编码无关, ... -
spring 注解式事务管理
2010-08-16 13:46 1115最近在开发一项目时使用了spring注解式事务管理,现介绍如下 ... -
spring 事务管理
2010-08-16 13:43 833Spring配置文件中关于事务配置总是由三个组成部分,分别是D ... -
[转]关于spring声明式事务管理异常处理的测试和小结(二)
2010-08-16 13:37 1010测试情形二: web层捕获异常并处理,Service捕获异常 ... -
[转]关于spring声明式事务管理异常处理的测试和小结一
2010-08-16 13:36 1074关于spring事务管理以及异常处理的帖子,本论坛争论颇多,各 ... -
jboss4.2.2GA+Cluster+HASingleton
2010-08-03 08:29 1320Here is an outline of the steps ... -
JBOSS 端口修改说明
2010-07-30 16:32 13471.jboss 的端口修改位置总结 Jboss通常占用的端口 ... -
jboss4.0.4 GA+EJB环境部署
2010-07-29 16:44 10971,开发环境 jbossIDE myclipse ... -
EJB3.0与JBOSS4.0.4GA集群部署实战(二)
2010-07-09 14:41 1028环境 MyEclipse5.5 JBoss4.0.4 测试 ... -
EJB3.0与JBOSS4.0.4GA集群部署实战(一)
2010-07-09 14:34 1210EJB中的三种bean 会话bean(session bea ... -
spring 远程接口访问及集群方案(三)
2010-07-09 14:03 3613前两篇文章已经对spring rmi方式的远程接口调用进行了说 ... -
spring 远程接口访问及集群方案(二)
2010-07-09 11:02 1620针对spring远程接口访问,本文给出一个实际的例子供参考,如 ... -
Java应用从集中式步入分布式
2010-07-07 14:02 674记得Martin大叔在《企业 ...
相关推荐
Spring Cloud是一套微服务架构下的分布式系统解决方案,提供了在分布式系统环境下快速构建一些常见模式的工具,如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式...
【基于某SpringCloud微服务系统设计方案】 微服务架构是一种分布式系统设计模式,它提倡将单一应用程序分解为一组小的服务,每个服务都在独立的进程中运行,使用轻量级通信机制(如HTTP RESTful API)。这种架构...
【基于SpringCloud的微服务系统设计方案】 微服务架构是一种现代软件开发的方法,它提倡将单一应用程序分解为一组小的服务,每个服务都运行在独立的进程中,通过轻量级的通信机制,如HTTP RESTful API进行交互。...
Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用、智能容错和恢复机制、以及服务自动注册和发现。 #### 2.2 比较分析 - **服务治理**:Dubbo提供了更完善的服务治理...
总的来说,基于SpringCloud的微服务系统设计方案旨在构建一个高度灵活、可扩展且可靠的分布式系统,通过细致的规划、合理的技术选型和完善的配套服务,克服微服务架构带来的挑战,以实现高效、稳定的业务运营。
Hystrix 是一个延迟和容错库,主要用于隔离远程系统、服务和第三方库的访问点,防止级联故障并在复杂分布式系统中实现弹性。它通过断路器模式、线程池隔离或信号量隔离等技术来实现这些功能。 - **特点**: - **...
本篇文章将深入探讨如何利用SpringBoot、Quartz和MyBatis框架,以及Dubbo和HTTP接口,实现一个动态配置的集群解决方案,旨在提高系统的灵活性和可维护性。 首先,SpringBoot是基于Spring框架的轻量级启动器,它简化...
- **Spring Cloud 上下文:应用程序上下文服务**:Spring Cloud提供了一个上下文服务,用于管理和组织应用中的各种服务组件。 - **引导应用程序上下文**:描述了如何通过配置文件(如`application.yml`或`...
Hystrix是一个延迟和容错库,旨在通过添加延迟容忍和容错逻辑来隔离远程系统、服务和第三方库的访问点,从而阻止级联故障并提供回退选项。 5. **Zuul**:API网关。Zuul提供了动态路由、监控、弹性和安全性的核心特性...
配置中心组件中,SpringCloud Config分为Server和Client两部分,Server负责配置文件的存储及以接口形式提供配置内容,而Client则通过接口获取配置信息。Apollo则是一个功能强大的配置中心,它支持统一界面管理不同...
- **实现**:Spring Cloud Config 通过 Git 或其他版本控制系统存储配置信息,并提供了一个 RESTful 接口供客户端应用获取配置。这种方式可以实现实时更新配置,无需重启服务。 9. **Spring Cloud 的负载均衡机制*...
Spring Cloud 是一套用于构建分布式系统的微服务开发工具包,它提供了微服务架构下的服务注册与发现、配置管理、API网关、智能路由、负载均衡、断路器、数据监控等一整套解决方案。Spring Cloud 的出现使得开发者...
它提供了一整套解决方案,可能包括设备管理、数据采集、数据分析、安全控制、API接口等功能,帮助开发者和企业快速接入和管理各种物联网设备。 **DC3的特点:** 1. **100%开源** - 意味着源代码公开,允许用户自由...
Spring Cloud Config 为微服务架构中的微服务提供了一种中心化的外部配置支持,允许将配置放到远程服务器,集中化管理集群配置。分为服务端和客户端两部分,服务端也称为分布式配置中心,它是一个独立的微服务应用,...
【基于SpringCloud的微服务系统设计方案】 微服务架构是一种分布式系统设计风格,它提倡将单一应用程序分解为一组小的服务,每个服务独立运行在自己的进程中,通过轻量级通信机制(如HTTP API)相互通信。这种架构...
- Hystrix 是一个延迟和容错库,旨在隔离远程系统、服务和第三方库的访问点,当这些点出现故障时停止它们级联失败。 - 它通过快速失败、资源隔离、超时和重试等策略来提高系统的稳定性和响应性。 - 断路器模式...
Spring Boot 实现的云应用开发工具集,它为开发人员提供了在分布式系统(如配置管理、服务发现、断路器、负载均衡、熔断机制、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话以及集群状态等...
Spring Cloud 是一套微服务解决方案,它为开发者提供了在分布式系统(配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态)中快速构建一些常见模式的...