上述我们已经提到了,RPC的设计的核心内容包括四个:通信方式+传输协议+序列化方式+远程服务类代理。
远程服务类代理的最终目的就是要向本地方法那样调用去调用远端的服务和方法。
Hession是比较久远的一个技术,包含了上述的四个核心问题。他在做代理设计的时候,HessionProxyFactory做服务代理。将服务端提供的API包中的Service接口也就是Service.class传入到方法当中。另外就是远端服务的URL
我们使用这个HessionProcyFactory创建代理的时候,只要是提供了这些参数,HessionProcyFactory就可以创建出具体的代理对象。
我们建立一个项目rpc-lesson作为父项目,将src删除掉,仅仅起到一个管理的作用,我们在父项目中的pom中进行依赖管理。
创建一个web模块。搞定父子项目配置。通过web maven创建的web的servlet的scheme有点老,咱们重新创建一个web.xml换个新版本即可。
引入依赖的时候,我们需要引入一个Javax.servlet这样的jar
这个jar的scope属性是provided,编译需要此包,但是部署到运行环境的时候是不会将这个jar包带到Tomcat当中的,因为Tomcat当中的lib当中已经提供了这个jar包,是不需要我们提供的,但是我们编写代码和编译代码的时候是需要这个东西的。
引入核心的jar包,我们需要引入Hessian的jar包,最终的pox如下:
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.13.1version>
<scope>testscope>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>3.1.0version>
<scope>providedscope>
dependency>
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-apiartifactId>
<version>1.7.32version>
dependency>
<dependency>
<groupId>ch.qos.logbackgroupId>
<artifactId>logback-classicartifactId>
<version>1.2.9version>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.22version>
dependency>
<dependency>
<groupId>com.cauchogroupId>
<artifactId>hessianartifactId>
<version>4.0.38version>
dependency>
dependencies>
开发服务注意:
1:我们当前的服务是提供service
2:必须定义接口
3:必须将自定义的数据类型实现序列化接口
具体代码如下:
@Data
@ToString(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
private String name;
private String password;
}
@Slf4j
public class UserServiceImpl implements UserService {
@Override
public boolean login(String name, String password) {
log.debug("login method invoke name {} password {}", name, password);
return false;
}
@Override
public void register(User user) {
log.debug("register method invoke {} ", user);
}
}
<servlet>
<servlet-name>userServiceRPCservlet-name>
<servlet-class>com.caucho.hessian.server.HessianServletservlet-class>
<init-param>
<param-name>home-apiparam-name>
<param-value>com.suns.service.UserServiceparam-value>
init-param>
<init-param>
<param-name>home-classparam-name>
<param-value>com.suns.service.UserServiceImplparam-value>
init-param>
servlet>
<servlet-mapping>
<servlet-name>userServiceRPCservlet-name>
<url-pattern>/userServiceRPCurl-pattern>
servlet-mapping>
public static void main(String[] args) throws MalformedURLException {
HessianProxyFactory hessianProxyFactory = new HessianProxyFactory();
//创建远端RPC服务的代理对象
String URL = "http://localhost:8989/rpc-hessian/userServiceRPC";
UserService userService = (UserService) hessianProxyFactory.create(UserService.class, URL);
// 向调用本地方法一样的去调用远端的服务。
boolean userServiceRet = userService.login("xiaohei", "123456");
log.debug("userServiceRet value is {} ", userServiceRet);
}
RPC一定是走网络的远程过程调用,一定有两个JVM进程实例。
这就证明此时确实RPC通信成功了。完成了基于网络,两个JVM实例之间的网络通讯。
如果需要暴露其他的服务,重新来一遍即可了。
我们这里只关注客户端部分是如何创建代理对象的。
稍后补充
稍后补充