发表于: 2017-12-02 23:00:07
1 735
今日完成的事情:
今天首先是配置了两台server,就是把第一个server完全的copy了一份。修改了一下绑定的端口。然后再client端的spring配置:
<bean id="myRMIClient1" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceInterface" value="com.mmy.service.UserService"/>
<property name="serviceUrl" value="rmi://127.0.0.1:1111/userServiceImpl"/>
<property name="refreshStubOnConnectFailure" value="false"/>
</bean>
<bean id="myRMIClient2" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceInterface" value="com.mmy.service.UserService"/>
<property name="serviceUrl" value="rmi://127.0.0.1:2222/userServiceImpl1"/>
<property name="refreshStubOnConnectFailure" value="false"/>
</bean>
把server1和server2都启动,然后就可以在client端访问。
接着写了一个随机函数,让client可以随机访问两台server,再对随机函数部分进行处理,就可以实现一台server挂掉,不影响第二个server的调用:
具体的代码:
@RequestMapping(value = "/user/list", method = RequestMethod.GET)
public String listUser(Model model) {
int i = (int) (Math.random() * 10);
if (i <= 2) {
try {
List<User> list = rmiUserService1.queryAllUser();
model.addAttribute("list", list);
System.out.println("======connect server1=====");
} catch (Exception e) {
List<User> list = rmiUserService2.queryAllUser();
model.addAttribute("list", list);
System.out.println("======connect server2=====");
}
} else {
try {
List<User> list = rmiUserService2.queryAllUser();
model.addAttribute("list", list);
System.out.println("======connect server2=====");
} catch (Exception e) {
List<User> list = rmiUserService1.queryAllUser();
model.addAttribute("list", list);
System.out.println("======connect server1=====");
}
}
return "listUser";
这里我的每一个接口都写了一边上面的过程,有点复杂,。然后我就试着把重复的代码写出来单独作为一个函数:
public UserService getRmiUserService(){
int i = (int) (Math.random() * 10);
if (i <= 2) {
try {
System.out.println("======connect server1=====");
return rmiUserService1;
} catch (Exception e) {
System.out.println("======connect server2=====");
return rmiUserService2;
}
} else {
try {
System.out.println("======connect server2=====");
return rmiUserService2;
} catch (Exception e) {
System.out.println("======connect server1=====");
return rmiUserService1;
}
}
}
具体的代码如上。
但是这样写失败了。其中一台挂掉的情况下,就会报错,最后只有多谢一些代码了。
最是是部署到服务器上面。
利用shade插件把两台server达成可运行的jar,然后再在服务器上利用java -jar xxxx.jar &让jar可以后台运行。把client打成war,部署到服务器的tomcat,本来以为一切都很顺利,结果跑不出来。
然后百度一通,把server端的spring改写:
<bean id="userServiceImpl" class="com.mmy.serviceImpl.UserServiceImpl"/>
<bean id="myRMIServer" class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="service" ref="userServiceImpl"/>
<property name="serviceInterface" value="com.mmy.service.UserService"/>
<property name="registryPort" value="1234"/>
<property name="serviceName" value="userServiceImpl"/>
<property name="servicePort" value="1111"/>
服务器端的通信接口是随机的,在这里我把通信接口绑定到1111 。
改写后的main方法:
public static void main(String[] args) {
System.setProperty("java.rmi.server.hostname","47.95.201.115");
new ClassPathXmlApplicationContext("Spring.xml");
System.out.println("service binding success");
}
绑定公网IP。
client端的spring改写:
<bean id="myRMIClient1" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceInterface" value="com.mmy.service.UserService"/>
<property name="serviceUrl" value="rmi://47.95.201.115:1111/userServiceImpl"/>
<property name="refreshStubOnConnectFailure" value="false"/>
</bean>
<bean id="myRMIClient2" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceInterface" value="com.mmy.service.UserService"/>
<property name="serviceUrl" value="rmi://47.95.201.115:2222/userServiceImpl1"/>
<property name="refreshStubOnConnectFailure" value="false"/>
</bean>
做成这一切事情之后,再次重复上面的步骤,还是跑不出来。目前正在分析原因。
明日计划的事情:
解决在服务器上跑不出来的问题。
遇到的问题:
查找了好多资料,还是没有最根本的解决方法。明天继续。
收获:
部署两台server,实现随机访问,并且一台挂了的情况下,不影响程序的运行。
任务开始时间:2017/12/1
预计完成时间:2017/12/6
延期:无
禅道:http://task.ptteng.com/zentao/my-task.html
评论