1.用例图:
2.时序图:
3.梗概:
a.动态代理:被调用者带有接口的定义,接口的实现在调用者处,被调用者通过动态代理触发网络IO,请求调用者查找对应的接口并调用
b.网络IO:远程调用的本质是分离思想,把计算的服务分离,那么分离则需要一个媒介沟通,那么这个媒介可以看出是网络IO(本地的两个进程也可以看成是网络IO传送)。
c.序列化方式和协议:不同的远程调用可能会使用到不同序列化方法和传送协议。
4.例子:
a.编写服务端(被调用者):
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>hessian_server</groupId>
<artifactId>hessian_server</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.caucho</groupId>
<artifactId>hessian</artifactId>
<version>4.0.38</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.7</version>
<configuration>
<connectors>
<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
<port>8080</port>
<maxIdleTime>30000</maxIdleTime>
</connector>
</connectors>
<webAppSourceDirectory>${project.basedir}/web
</webAppSourceDirectory>
<contextPath>/web</contextPath>
</configuration>
</plugin>
</plugins>
</build>
</project>
~主要注意引入hessian的依赖
定义接口:
package org.gaaidou.service;
public interface PersonService {
String say(String name);
}
~这个接口调用者和被调用者需要用到同一个接口
接口的实现:
package org.gaaidou.service.impl;
import org.gaaidou.service.PersonService;
public class PersonServiceImpl implements PersonService {
public String say(String name) {
System.out.println("传入参数:" + name);
return "我的名字是" + name;
}
}
编写web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>hessian</servlet-name>
<servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
<init-param>
<param-name>home-api</param-name><!--接口声明-->
<param-value>org.gaaidou.service.PersonService</param-value>
</init-param>
<init-param>
<param-name>home-class</param-name><!--接口实现-->
<param-value>org.gaaidou.service.impl.PersonServiceImpl</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>hessian</servlet-name>
<url-pattern>/hessian</url-pattern>
</servlet-mapping>
</web-app>
~不难看出,hessian在这里通过home-api和home-class进行接口和实现的映射
整体代码结构:
2.编写客户端(调用者):
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>hessian_client</groupId>
<artifactId>hessian_client</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.caucho</groupId>
<artifactId>hessian</artifactId>
<version>4.0.38</version>
</dependency>
</dependencies>
</project>
编写测试:
package org.gaaidou;
import com.caucho.hessian.client.HessianProxyFactory;
import org.gaaidou.service.PersonService;
import java.net.MalformedURLException;
public class Main {
public static void main(String[] args) throws MalformedURLException {
//hessian访问地址
String url = "http://localhost:8080/web/hessian";
//接口的动态代理工厂
HessianProxyFactory factory = new HessianProxyFactory();
PersonService personService = (PersonService) factory.create(PersonService.class, url);
System.out.println(personService.say("Mike"));
}
}
代码结构:
3.运行:
服务端用maven的jetty插件运行
客户端直接运行main函数
服务端运行结果:
客户端运行结果: