6.4 使用Spring HTTP invoker进行远程调用
Spring 开发小组意识到在RMI服务和基于 HTTP的服务(如Hessian和Burlap)之间的空白。一方面,RMI使用Java标准的对象序列化,但很难穿越防火墙;另一方面, Hessian/Burlap能很好地穿过防火墙工作,但使用自己私有的一套对象序列化机制。
就这样,Spring的HTTP invoker应运而生。HTTP invoker是一个新的远程调用模型,作为Spring框架的一部分,来执行基于HTTP的远程调用(让防火墙高兴的事),并使用Java的序列化机制(让程序员高兴的事)。
使用基于HTTP invoker的服务和使用基于Hessian/Burlap的服务非常相似。为了开始学习HTTP invoker,让我们再来看一下这个支付服务——这一次将作为HTTP invoker支付服务来实现。
6.4.1 通过HTTP访问服务
要 访问RMI服务,得声明一个指向这个服务的 RmiProxyFactoryBean;要访问Hessian服务,得声明一个HessianProxyFactoryBean.;要访问Burlap 服务的话,得用BurlapProxyFactoryBean。把这样千篇一律的用法带到HTTP invoker上,应该也不会带来什么惊奇,那就是访问一个HTTP invoker服务,你需要使用HttpInvokerProxyFactoryBean。
要让支付服务作为一个HTTP invoker服务公开,得配置一个Bean,用HttpInvokerProxyFactoryBean来代理它,如下所示:
<bean id="paymentService" class= "org.springframework.remoting.
➥httpinvoker.HttpInvokerProxyFactoryBean">
<property name="serviceUrl">
<value>http://${serverName}/${contextPath}/pay.service</value>
</property>
<property name="serviceInterface">
<value>com.springinaction.payment.PaymentService</value>
</property>
</bean>
把 这个Bean的定义和那些在6.2.1节、6.3.1节中的比较一下,你会发现几乎没什么变化。serviceInterface属性仍然用来表示这个支 付服务所实现的接口;serviceUrl属性仍然是用来表示远程支付服务的位置。由于HTTP invoker是基于HTTP的,如同Hessian和Burlap一样,serviceUrl就能包含与Hessian和Burlap版本的Bean里 一样的URL。
现在,让我们转到HTTP invoker对话的另一面,看看如何把Bean的功能作为基于HTTP invoker的服务输出。
6.4.2 把Bean作为HTTP服务公开
你 已经看到如何把 PaymentServiceImpl的功能作为RMI服务公开,或者是作为Hessian服务,以及Burlap服务。接下来,我们要把这个支付服务改 写为HTTP invoker服务,用Spring的HttpInvokerServiceExporter来输出这个支付服务。
为了避 免听上去有违反先例的危险,我们必须告诉你,使用HttpInvokerServiceExporter把Bean的方法输出为远程方法,和你已经看到的 其他远程服务的exporter做事的方法非常相像。实际上,就是一样的。举例来说,下面的Bean的定义展示了如何把paymentService Bean作为一个远程的基于HTTP invoker的服务输出:
<bean id="httpPaymentService" class="org.springframework.remoting.
➥httpinvoker.HttpInvokerServiceExporter">
<property name="service">
<ref bean="paymentService"/>
</property>
<property name="serviceInterface">
<value>com.springinaction.payment.PaymentService</value>
</property>
</bean>
有 点奇怪的似曾相识的感觉吗?你很难找出这个 Bean的定义和那些在6.3.2节中的不同来。这里的粗体字不是帮你发现它的,而是惟一的区别就在于使用了 HttpInvokerServiceExporter。否则的话,这个exporter和其他的远程服务的exporter就没什么区别了。
基 于HTTP invoker的服务,顾名思义,是基于HTTP的,就像Hessian和Burlap服务一样。并且,也和 HessianServiceExporter和BurlapServiceExporter那样, HttpInvokerServiceExporter也是一个Spring的Controller。这就意味着你需要建立一个URL处理器,把HTTP URL映射到服务上:
<bean id="urlMapping" class="org.springframework.web.
➥servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/pay.service">httpPaymentService</prop>
</props>
</property>
</bean>
同时你也需要把这个支付服务部署到web应用中,通过在web.xml中配置Spring的DispatcherServlet:
<servlet>
<servlet-name>credit</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>credit</servlet-name>
<url-pattern>*.service</url-pattern>
</servlet-mapping>
这样配置,支付服务便能通过/pay.service获得,和它作为Hessian服务或Burlap服务公开时的URL一样。
Spring的HTTP invoker是作为一个两全其美的远程调用解决方案出现的,把HTTP交流的简单性和Java内置的对象序列化机制结合起来。这让HTTP invoker服务成为一个引人注目的对RMI或是对Hessian/Burlap的替代品。
要记住HTTP invoker有个重大的限制,它是一个只在Spring框架中提供的远程调用解决方案。这就意味着客户端和服务器端都必须是使用Spring的应用。并且,至少就目前而言,也暗示了客户端和服务器端都必须是基于Java的[2]。
到现在为止我们所讨论的所有远程技术中,没有一个受到比Enterprise JavaBean (EJB)更多的关注。甚至可以说,有关EJB的出版物比任何其他Java技术都要多。让我们看一下如何把EJB用到你的Spring应用中。
- 浏览: 397204 次
- 性别:
- 来自: 北京
博客专栏
-
Spring Roo杂谈
浏览量:0
文章分类
- 全部博客 (418)
- SPRING (19)
- WEB前端 (15)
- IBATIS (4)
- HIBERNATE (0)
- JSF (0)
- WEBSERVICES (0)
- DESIGN PATTERN (9)
- UML (3)
- J2SE (30)
- BASIC CONCEPT (2)
- EJB (1)
- interview (71)
- cache (6)
- 设计 (6)
- NONSENSE (1)
- Problems (28)
- time (3)
- Future Problems (2)
- INFO (24)
- Performance (12)
- java (14)
- core (1)
- lib (1)
- famous (9)
- VersionManage (26)
- Big Data (10)
- netty (0)
- exception (1)
- design (1)
- 规则引擎 (3)
- Method (22)
- nosql (14)
- nosql-redis (2)
- DATABASE (32)
- Cluster (6)
- Linux (13)
- 高并发 (2)
- sport (0)
- Arithmetic (8)
- TEST (1)
- Python (7)
- 公共平台 (3)
- spring roo (7)
- server (1)
- Cases (1)
- security (1)
- opensource (8)
- architect (5)
- O2O (0)
- P2P (0)
最新评论
-
liutingna86:
程序没有提取新的链接,只是分析url.txt中链接页面的内容是 ...
Java编程技巧:小爬虫程序(转) -
u013680195:
CSS基础教程17篇 此教程共17篇,由浅到深、循序渐进的讲述 ...
每个Web开发者必备的9个软技能(转) -
zhb8015:
有一个解决的方法:把DTD文件从mybatis.jar中拿出来 ...
求助: exception is java.net.UnknownHostException: mybatis.org -
zhb8015:
问题可能找到了,spring-test对于(@ContextC ...
求助:NoSuchBeanDefinitionException: No bean named 'userService' is defined
发表评论
-
Memcached note
2015-10-14 22:34 644下载并安装Memcache服务器端服务器端主要是安装memc ... -
(转)阿里宝宝的漫漫求职路
2015-10-11 10:34 2685http://hujiaweibujidao.github ... -
Interview questions
2015-08-14 13:58 695yx: 1、hashmap原理,如何存取,为什么初始化为 ... -
gzip压缩
2015-08-04 18:54 632GZIP压缩:将压缩后的文本文件,发送给浏览器,减少流 ... -
eclipse 内置注解设置
2015-07-21 19:12 6431、注释设置 在菜单栏Window--->Pref ... -
程序员7大技能 (转)
2015-07-13 10:11 701源自: http://www.codeceo. ... -
面试题 合集
2015-07-09 18:13 568http://download.csdn.net/album/ ... -
喜欢算法的看这里
2015-07-09 18:10 628纯笔记 !!!哈 http://download.csd ... -
logback
2015-07-07 14:05 823一、logback的介绍 ... -
阿里要求
2015-06-19 23:02 6311、扎实的Java编程基础,熟悉各种设计模式,熟练掌握Spri ... -
spring roo 笔记
2015-06-04 17:31 865对spring roo 的一些总结:源自spring ro ... -
如何成为一名Java冠军程序员?(转)
2015-05-16 16:50 373几个月前 ... -
背包问题
2015-05-14 19:28 721原文地址:http://blog.csd ... -
ascii vs unicode
2015-05-05 16:57 557在没有UNICODE之前,美国人发明了计算机 ... -
面试题
2015-04-28 22:52 453一些面试题,自己总结的,也是自己觉得应该深入理解的 ... -
变量初始化的面试题总结
2015-04-14 12:05 608有一段时间变量的初始化问题一直困扰着我,可能是 ... -
一些面试题 interview questions,最好掌握
2015-04-12 15:05 622自认不是一个基础很好的人,所 ... -
Get vs Post(转)
2015-04-08 19:45 700原文地址:http://www.cnblogs.com/hy ... -
JODD入门
2014-08-14 07:41 1324Jodd是一个普通开源Java包。你可以把Jodd想象成Ja ... -
spring roo 入门
2014-08-02 23:11 1038准备工作: 从Spring官网下载STS ...
相关推荐
总的来说,Java Spring 1.2 Remote Invoke HTTP Invoker是一个强大的远程调用解决方案,它结合了HTTP协议的灵活性和Spring框架的便利性,使开发者能够轻松地构建分布式应用程序。尽管在某些场景下,现代的RPC框架如...
总结来说,Spring HttpInvoke 提供了一种简单的方式实现 RPC,但为了提升效率,我们需要关注数据序列化、异步处理、缓存、HTTP 压缩等多个方面,并结合实际应用场景进行优化。通过持续监控和调优,我们可以构建出...
Spring框架的集成也是许多RPC实现的选择,它提供了强大的依赖注入和管理能力,可以方便地整合各种服务组件,简化RPC框架的开发和使用。 总结以上,Java实现的RPC框架综合运用了JDK动态代理、NIO Socket通信、反射、...
Spring休息祈求者Spring调用程序将远程JSON REST服务绑定到Java接口, 工作方式。 在这些接口上调用方法将向远程服务发出HTTP请求,并将任何对象与JSON(反序列化)。 接口和远程服务之间的具体映射可以通过编程或...
《Spring Boot与Dubbo整合:构建高效分布式服务》 在当今的互联网环境中,微服务架构逐渐成为主流,而Spring Boot和Dubbo则是其中的关键技术组件。Spring Boot以其便捷的启动和管理服务的能力,大大简化了Java应用...
基于Spring的HttpInvoker实现改写服务器端调用: HttpInvoker.invoker 方法,设置InvokerProcess处理客户端调用: ProxyFactory.proxy 方法,生成接口的代理对象,直接调用方法客户端和服务器端的接口和实体类要...
使用ActiveMQ,可以将invoke过程中的代码替换为队列操作,实现异步通信,提高系统性能和可扩展性。 5. **服务治理与监控:** - 为了实现简单的服务治理和监控,通常需要一个注册中心来管理服务提供者和消费者,...
Boot-dubbo 项目整合了最新的 Spring Boot 和功能强大的 RPC 框架 Dubbox,两者都有优点,也都有缺点,最新版本的 Spring Boot 包含了 Metrics 模块Dubbox官方地址:Dubbox:... 1、微内核2、配置简单3、模块化4、开...
在这个场景中,我们有名为"JSimpCalcWebService"的Java Web服务,它可能是由JAX-WS(Java API for XML Web Services)或者早期的JAX-RPC(Java API for XML-based Remote Procedure Calls)创建的。这些服务通常...
当我们使用 dubbo 或者 feign 进行 RPC 调用用时,通常的调用模板方式如下: public BizResponse method(BizRequest request){ RpcRequest rpcRequest = buildRpcRequest(); RpcReponse reuslt = xxxFacade.invoke...
除了基本的调用处理外,JDK动态代理还能应用于很多场景,如Spring AOP中的通知(Advice)、RPC框架中的远程调用等。通过对源码的深入理解,我们可以更灵活地运用动态代理,解决实际开发中的各种问题。 标签“源码”...
它支持多种协议和服务实现方式,包括SOAP、XML-RPC、REST等。CXF的官方网站提供了丰富的资源和支持文档,可以通过以下链接访问:[http://cxf.apache.org/](http://cxf.apache.org/)。 为了开始使用CXF进行...
- **RPC(远程过程调用)**:在分布式系统中,客户端可以通过动态代理与远程服务进行交互。 - **事务管理**:在数据库操作中,可以通过动态代理添加事务控制逻辑。 - **权限控制**:在访问控制方面,动态代理可以...
此外,Spring框架也提供了Spring-WS和Spring-WS-Client模块,使得Web服务的调用更加便捷和灵活。 总的来说,Java调用以WSDL形式发布的Web服务主要依赖于像Apache Axis这样的库,通过创建客户端代理类并设置相应参数...
例如,在Spring框架中,动态代理被用来实现事务管理、日志记录等功能。 #### 六、总结 通过本文的学习,我们可以了解到Java动态代理的基本原理以及其实现过程。动态代理不仅可以用于扩展已有类的功能,还可以简化...
动态代理在很多场景下都非常有用,比如在AOP(面向切面编程)中实现事务管理、日志记录、性能统计等功能,或者在RPC框架中作为服务调用的中介等。 在Java中,动态代理主要有两种实现方式:JDK动态代理和CGLIB库。...
4. 应用场景:动态代理常用于AOP框架,如Spring AOP,它在方法调用前后插入增强代码;也用于RPC框架,如Dubbo,它可以在服务调用前后添加网络通信、序列化等逻辑。 在“反射与动态代理详细文件”中,可能会包含如何...
Dubbox 中的过滤器基于 Spring AOP 实现,通过实现 `com.alibaba.dubbo.rpc.Filter` 接口或使用 SPI 机制来添加自定义过滤器。 下面是一步步实现过滤器功能的步骤: 1. **创建过滤器类**: 创建一个新的 Java 类...
这在很多框架(如Spring AOP)中得到了广泛应用,用来增强目标对象的功能,比如事务管理、日志记录等。 #### 二、Java动态代理原理 Java动态代理的核心类主要有两个:`java.lang.reflect.Proxy` 和 `java.lang....