发表于: 2017-12-06 23:00:05
1 681
今天完成的事情:
一.学习使用javaRMI和springRMI
1.什么是JavaRMI
JavaRMI是Java的一组拥护开发分布式应用程序的API。RMI使用Java语言接口定义了远程对象,它集合了Java序列化和Java远程方法协议(Java Remote Method Protocol)。简单地说,这样使原先的程序在同一操作系统的方法调用,变成了不同操作系统之间程序的方法调用,由于J2EE是分布式程序平台,它以RMI机制实现程序组件在不同操作系统之间的通信。
2.为什么使用RMI
RMI是j2ee的网络机制,允许编写分布式对象,使得对象的通信范围能够在内存中,跨java虚拟机,跨物理设备.
RMI的优点:
可以像使用本地的对象一样,使用远程对象,实现分布式
3.具体使用
javaRMI包含一个服务端程序和客户端程序
服务端程序
++javaRMI不需要使用jar包,它是jdk自带的功能
++编写实体类,因为到时候信息在stub,和skeleton之间传输信息的时候都是用流的形式,保存不了对象的状态,所以必须要对对象进行序列化,实体类首先Serializable类.
然后还需要自己指定serialversionUID的值
serialversionUID:它是根据类的类名,接口名,成员方法属性等通过特定算法生成一个64位的哈希字段,
java的序列化机制是通过运行时判断类是serialversionUID来验证版本的一致性.假如不自己指定uid,序列化是会自动生成一个uid.假如类变化,生成的uid会不一样,这样在反序列化的时候会报错,但是假如指定uid,这样就就保证是同一个版本的,保险.
++接口类需要继承Remote类然后接口中的方法需要抛出RemoteException异常
++实现类要继承UnicastRemoteObject类
++编写服务端入口类
/**实例化远程对象*/
UserService userService=new UserServiceImpl();
UserService1 userService1=new UserService1Impl();
/**实例化一个registy注册表实例,然后指定注册表监听端口*/
LocateRegistry.createRegistry(11233);
/**将远程对象已以对象名--地址绑定到注册表中,可以一个端口绑定多个service*/
Naming.bind("rmi://127.0.0.1:11233/userService",userService);
Naming.bind("rmi://127.0.0.1:11233/userService1",userService1);
/**使用javaRMI要抛出三个异常*/
}catch (RemoteException e){
System.out.println("创建远程对象异常异常");
e.printStackTrace();
}catch (AlreadyBoundException e){
System.out.println("重复绑定异常");
e.printStackTrace();
}catch (MalformedURLException e){
System.out.println("指定的URI发生错误的异常");
e.printStackTrace();
}
客户端程序
++和上面一样要有一个实体类(实现序列化),一个接口(继承Remote和抛出RemoteException).首先根据ip+port找到注册表,根据服务类实例化对象名在注册表中查到对应的对象并强转相应类型.接下来直接使用就可以了
try {
UserService userService=(UserService) Naming.lookup("rmi://127.0.0.1:11233/userService");
UserService1 userService1=(UserService1) Naming.lookup("rmi://127.0.0.1:11233/userService1");
User user=new User(1L,"张全蛋",14);
System.out.println(userService.getUser(user));
userService1.getUser();
}catch (Exception e){
e.printStackTrace();
}
二.springRMI
1.什么是springRMI
springRMI就是对javaRMI的封装
2.使用SpringRMI
服务端
++依赖jar包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-remoting</artifactId>
<version>2.0.8</version>
</dependency>
++配置spring配置文件
使用RmiServiceExporter类将service暴露给客户端,供其调用
<!--将服务类注册为一个bean-->
<bean id="userService" class="com.mycom.myapp.service.impl.UserServiceImpl"/>
<bean id="userService1" class="com.mycom.myapp.service.impl.UserService1Impl"/>
<!--使用RmiServiceExporter类将service暴露给客户端,供其调用-->
<bean id="serviceExporter" class="org.springframework.remoting.rmi.RmiServiceExporter">
<!--将服务类注入-->
<property name="service" ref="userService"/>
<!--指定注册表中服务名-->
<property name="serviceName" value="userService"/>
<!--指定service对应的类-->
<property name="serviceInterface" value="com.mycom.myapp.service.UserService"/>
<!--服务注册端口-->
<property name="registryPort" value="18080"/>
<!--服务数据传输端口-->
<property name="servicePort" value="18080"/>
</bean>
++实体类(实现序列化,uid) 接口,实现列(不需要继承Remote,抛出异常)
++加载spring配置文件
客户端
++依赖jar包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-remoting</artifactId>
<version>2.0.8</version>
</dependency>
++配置spring配置文件
将一个serviceUrl和serviceInterface注入给RmiProxyFactoryBean,即可进行远程方法调用
<bean id="rmiServiceProxy" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl" value="rmi://127.0.0.1:18080/userService"/>
<property name="serviceInterface" value="com.mycom.myapp.service.UserService"/>
</bean>
++实体类,接口同
++加载spring配置文件,直接使用
三.分布式和集群
分布式是加快单个请求的处理时间.
+分布式是将一个业务拆成多个子业务部署在不同的服务器上.
+分布式是个工作方式
+
集群是增加单位时间内处理的请求数
+集群是同一个业务部署在不同的服务器上
+集群是个物理形态
https://www.zhihu.com/question/20004877
明天计划完成的事情:明天先把分布式再整理一下,然后学习tuscany和SCA的概念,有时间的话复习spring+mybatis整合和正则表达式.
和成延商量任务交接
遇到的问题:知识点都只在懂一点的层次.仍需努力
收获:学习RMI,分布式集群
评论