java RPC系列之二 HTTPINVOKER
java RPC系列之二 HTTPINVOKER
一、java RPC简单的汇总
java的RPC得到技术,基本包含以下几个,分别是:RMI(远程方法调用) 、Caucho的Hessian 和 Burlap 、Spring的基于HTTP的远程服务、以及使用JAX-RPC和JAX-WS的Web服务。本文主要介绍spring的httpinvoker的基本的配置实现。
二、Spring的httpinvoker的配置实现
基本步骤:
1.定义好服务端需要提供的接口方法(客户端调用的接口);
2.定义好服务端的实现代码;
3.使用spring配置服务端,发布服务到制定端口;
4.使用spring配置客户端的代理bean;
5.定义好服务端和客户端调用的测试代码。
三、Spring的httpinvoker的配置实现的代码如下:
1.定义好ISayHello接口类,服务端和客户端都需要的接口类。
package com.lilin.maven.maven_intf; /**
* @author lilin
*
*/
public interface ISayHello {
/**
* 测试接口接口方法
*/
void sayHello(String name); }
2.定义好服务端的实际实现代码SayHelloService。
package com.lilin.maven.maven_intf; /**
* @author lilin
*
*/
public class SayHelloService implements ISayHello { @Override
public void sayHello(String name) {
System.out.println("hello:" + name);
} }
3.使用spring的配置spring的httpinvoker服务,配置web.xml中的servlet,配置rmi-server.xml文件,将配置的service的bean发布为HTTP服务。
servlet配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>SpringRMI</display-name>
<servlet>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:/remote-servlet.xml</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
rmi-server的配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="sayHello" class="com.lilin.maven.maven_intf.SayHelloService" />
<bean name="/sayHello"
class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
<property name="service" ref="sayHello" />
<property name="serviceInterface" value="com.lilin.maven.maven_intf.ISayHello" />
</bean>
</beans>
4.使用spring配置客户端的代理bean,配置rmi-client.xml,把远程的服务方法配置为bean,可以方便注入。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans>
<bean id="sayHello"
class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
<property name="serviceUrl">
<value>http://localhost:8080/maven-web-in/sayHello</value>
</property>
<property name="serviceInterface">
<value>com.lilin.maven.maven_intf.ISayHello</value>
</property>
</bean> </beans>
5.定义好服务端和客户端调用的测试代码,首先启动服务端,发布HTTP服务,然后启动测试端代码通过HTTP调用远程服务。
服务端:启动server后,可以看到如下信息:
信息: Mapped URL path [/sayHello] onto handler '/sayHello'
2016-3-29 0:38:51 org.springframework.web.servlet.FrameworkServlet initServletBean
信息: FrameworkServlet 'Spring MVC Dispatcher Servlet': initialization completed in 1670 ms
2016-3-29 0:38:51 org.apache.coyote.AbstractProtocolHandler start
信息: Starting ProtocolHandler ["http-bio-8080"]
2016-3-29 0:38:51 org.apache.coyote.AbstractProtocolHandler start
信息: Starting ProtocolHandler ["ajp-bio-8009"]
2016-3-29 0:38:51 org.apache.catalina.startup.Catalina start
信息: Server startup in 5547 ms
则表示当前的发布服务成功!
客户端:获取client配置的bean,直接调用远程服务方法,可以得到正确结果如下:
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.lilin.maven.maven_intf.ISayHello; /**
* 客户端调用类
*
* @author King
*
*/
public class Client {
// 读取配置文件
static ApplicationContext context = new ClassPathXmlApplicationContext(
"remote-client-local.xml"); public static void main(String[] args) {
new Client().sayHello();
} public void sayHello() {
ISayHello sayHello = (ISayHello) context.getBean("sayHello");
sayHello.sayHello("李林");
} }
到此简单的spring的httpinvoker的远程服务调用,基于spring的配置就全部结束了,值得注意的是:
spring的httpinvoker的使用场景:考虑网络限制,并且希望使用基于xml或者专有的java序列化机制时候哦,访问/发布基于spring的服务。
参见的是spring in action 第三版
java RPC系列之二 HTTPINVOKER的更多相关文章
- java RPC系列之一 rmi
java RPC系列之一 rmi 一.java RPC简单的汇总 java的RPC得到技术,基本包含以下几个,分别是:RMI(远程方法调用) .Caucho的Hessian 和 Burlap . ...
- 当我们说线程安全时,到底在说什么——Java进阶系列(二)
原创文章,同步发自作者个人博客,转载请以超链接形式在文章开头处注明出处http://www.jasongj.com/java/thread_safe/ 多线程编程中的三个核心概念 原子性 这一点,跟数 ...
- Java Thread系列(二)线程状态
Java Thread系列(二)线程状态 一.线程的五种状态 新建状态(New):新创建了一个线程对象,尚未启动. 就绪状态(Runnable):也叫可运行状态.线程对象创建后,其他线程调用了该对象的 ...
- Java 设计模式系列(二十)状态模式
Java 设计模式系列(二十)状态模式 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式.状态模式允许一个对象在其内部状态改变的时候改 ...
- Java 设计模式系列(二二)责任链模式
Java 设计模式系列(二二)责任链模式 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求 ...
- Java 集合系列之二:List基本操作
1. Java List 1. Java List重要观点 Java List接口是Java Collections Framework的成员. List允许您添加重复元素. List允许您拥有'nu ...
- java se系列(十二)集合
1.集合 1.1.什么是集合 存储对象的容器,面向对象语言对事物的体现,都是以对象的形式来体现的,所以为了方便对多个对象的操作,存储对象,集合是存储对象最常用的一种方式.集合的出现就是为了持有对象.集 ...
- Java 并发系列之二:java 并发机制的底层实现原理
1. 处理器实现原子操作 2. volatile /** 补充: 主要作用:内存可见性,是变量在多个线程中可见,修饰变量,解决一写多读的问题. 轻量级的synchronized,不会造成阻塞.性能比s ...
- JAVA NIO系列(二) Channel解读
Channel就是一个通道,用于传输数据,两端分别是缓冲区和实体(文件或者套接字),通道的特点(也是NIO的特点):通道中的数据总是要先读到一个缓冲区,或者总是要从一个缓冲区中读入. Channel的 ...
随机推荐
- Day 23 类的继承,派生,组合,菱形继承,多态与多态性
类的继承 继承是一种新建类的方式,新建的类称为子类,被继承的类称为父类 继承的特性是:子类会遗传父类的属性 继承是类与类之间的关系 为什么用继承 使用继承可以减少代码的冗余 对象的继承 python中 ...
- 记一次惊心的网站 TCP 队列问题排查经历
https://blog.csdn.net/chenlycly/article/details/80868990 http://www.mytju.com/classcode/news_readnew ...
- open-ldap schema (2)
schema介绍及用途 schema 是OpenLDAP 软件的重要组成部分,主要用于控制目录树中各种条目所拥有的对象类以及各种属性的定义,并通过自身内部规范机制限定目录树条目所遵循的逻辑结构以及定义 ...
- Atcoder AGC031C Differ By 1 Bit (构造、二进制)
哎呀这个C怎么比B还水....(我现在大概也就会做点这种水题了吧) 题目链接 https://atcoder.jp/contests/agc031/tasks/agc031_c 题目大意 符号约定: ...
- (12)Spring Boot改变JDK编译版本【从零开始学Spring Boot】
Spring Boot在编译的时候,是有默认JDK版本的,如果我们期望使用我们要的JDK版本的话,那么要怎么配置呢? 这个只需要修改pom.xml文件的<build> -- <plu ...
- HDU - 2833 - WuKong
先上题目: WuKong Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- magento 在全站或者某页面增加外联js或者css的方法
1,在整站末尾增加外联资源 找到当前主题的布局文件cms.xml,在<default></default>添加如下代码: <reference name="be ...
- POJ 1175
//本来写了个和1021相同的HASH,但没过,于是,抱着侥幸的心理,把它变成距离的四次方, //我就呵呵了... //这个题,完全靠概率.当然了,如果是把图翻转来比较,也是可以的.但好像很麻烦.. ...
- 谈论java中怎样处理高并发的问题
1 从最基础的地方做起,优化我们写的代码,降低必要的资源浪费. a.避免频繁的使用new对象.对于整个应用仅仅须要存在一个实例的类.我们能够使用单例模式. 对于String连接操作,使 ...
- javascript基础篇--function类型(上)
在js中,function类型实际上是对象,每一个函数都是function类型的一个实例.并且与其它引用类型一样具有属性和方法. 声明 1普通方式 Function sum(num1,num2) { ...