博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring之HttpInvoker
阅读量:6290 次
发布时间:2019-06-22

本文共 2948 字,大约阅读时间需要 9 分钟。

  一、HttpInvoker是常用的Java同构系统之间方法调用实现方案,是众多Spring项目中的一个子项目。顾名思义,它通过HTTP通信即可实现两个Java系统之间的远程方法调用,使得系统之间的通信如同调用本地方法一般。

  二、他有点类似于Java的服务远程调用RMI,但是两个基于的协议不一样。RMI是直接服务器直接的调用,需要防火墙单独放开端口。而HttpInvoker是基于http协议进行远程方法调用的。需要容器支持。

  三、RMI的实现过程参考:

  四、我这里中间件使用的是jetty来嵌入启动的,可以参考jetty的启动方式:

  五、HttpInvoker实现例子:

  1、服务端:

  1)提供远程调用的借口和实现类

package com.pinnet.remote;public interface IRemoteService {    String show();}
package com.pinnet.remote.impl;import com.pinnet.remote.IRemoteService;public class RemoteServiecImpl implements IRemoteService {    public String show() {        System.out.println("show");        return "show";    }}

  2)服务端bean的配置

  3)有人会问相对于RMI怎么没有注册端口,因为这里是基于http协议,所以,是使用web服务的容器接口

  2、客户端:

  端口:是服务端的容器端口,接口是公用的

  3、测试:

public static void main(String[] args) {        ApplicationContext client = new ClassPathXmlApplicationContext("spring-httpinvoker-client.xml");        IRemoteService remoteService = (IRemoteService) client.getBean("remoteService");        String show = remoteService.show();        System.out.println(show);    }

  服务端:

  

  客户端:

  

  六、HttpInvoker源码分析(来至:)

  1、服务端

  1)服务端主入口由HttpInvokerServiceExporter实现,它的工作大致流程如下

   

  2)HttpInvokerServiceExporter实现了HttpRequestHandler,这使得其拥有处理HTTP请求的能力,按照Spring MVC的架构,它将被注册到HandlerMappingBeanNameMapping中,这设计到Spring MVC如何处理请求,可以关注我的相关文章。服务端的重要任务就是读取并解析RemoteInvocation,再返回RemoteInvocationResult,剩下的都只是标准IO流的读写。

  2、客户端
  1)客户端的实现也很好理解,主入口为
HttpInvokerProxyFactoryBean, 和Spring用到的众多设计相同,该类的结构使用了模板设计方法,该类提供实现了几个模板方法,整体逻辑由父类
HttpInvokerClientInterceptor的实现,主要流程如下
  

  2)我们最关心的是当我们调用接口的方法时,HttpInvoker是如何做到调用到远方系统的方法的,其实HttpInvokerProxyFactoryBean最后返回的是一个代理类(Cglib Proxy或者Jdk Proxy),我们调用接口的任何方法时,都会先执行HttpInvokerClientInterceptorinvoke()方法。

public Object invoke(MethodInvocation methodInvocation) throws Throwable {        if (AopUtils.isToStringMethod(methodInvocation.getMethod())) {            return "HTTP invoker proxy for service URL [" + this.getServiceUrl() + "]";        } else {            RemoteInvocation invocation = this.createRemoteInvocation(methodInvocation);            RemoteInvocationResult result = null;            try {                result = this.executeRequest(invocation, methodInvocation);            } catch (Throwable var5) {                throw this.convertHttpInvokerAccessException(var5);            }            try {                return this.recreateRemoteInvocationResult(result);            } catch (Throwable var6) {                if (result.hasInvocationTargetException()) {                    throw var6;                } else {                    throw new RemoteInvocationFailureException("Invocation of method [" + methodInvocation.getMethod() + "] failed in HTTP invoker remote service at [" + this.getServiceUrl() + "]", var6);                }            }        }    }

  六、本博客后面源码部分,部分来至

 

 

转载地址:http://lyuta.baihongyu.com/

你可能感兴趣的文章
mysql性能的检查和调优方法
查看>>
项目管理中的导向性
查看>>
Android WebView 学习
查看>>
(转)从给定的文本中,查找其中最长的重复子字符串的问题
查看>>
HDU 2159
查看>>
spring batch中用到的表
查看>>
资源文件夹res/raw和assets的使用
查看>>
UINode扩展
查看>>
LINUX常用命令
查看>>
百度云盘demo
查看>>
概率论与数理统计习题
查看>>
初学structs2,简单配置
查看>>
Laravel5.0学习--01 入门
查看>>
时间戳解读
查看>>
sbin/hadoop-daemon.sh: line 165: /tmp/hadoop-hxsyl-journalnode.pid: Permission denied
查看>>
@RequestMapping 用法详解之地址映射
查看>>
254页PPT!这是一份写给NLP研究者的编程指南
查看>>
《Data Warehouse in Action》
查看>>
String 源码浅析(一)
查看>>
Spring Boot 最佳实践(三)模板引擎FreeMarker集成
查看>>