发表于: 2020-07-30 00:24:22
1 1246
今天完成的事:
将项目中的service分离,分离结构
编写一个启动类
public class Testrun {
//private static Logger logger = Logger.getLogger(Testrun.class);
public static void main(String[] args){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
System.setProperty("java.rmi.server.hostname","49.235.187.63");
context.getBean("serverTest1");
//logger.info("RMI启动就绪1");
System.out.println("RMI启动就绪1");
context.getBean("serverTest2");
System.out.println("RMI启动就绪2");
}
}
主配置文件中加入bean的生成配置
<!-- RMI服务端 -->
<!-- RMI服务端远程接口实现类 -->
<bean name="rmiserver1" class="com.ptt.service.BmbServiceImpl"/>
<bean name="serverTest1" class="org.springframework.remoting.rmi.RmiServiceExporter">
<!-- 将远程接口实现类对象设置到RMI服务中 -->
<property name="service" ref="rmiserver1"/>
<!-- 设置RMI服务名,为RMI客户端依据此服务名获取远程接口实现类对象引用奠定基础 -->
<property name="serviceName" value="BmbServiceImpl"/>
<!-- 将远程接口设置为RMI服务接口 -->
<property name="serviceInterface" value="com.ptt.service.BmbService"/>
<!-- service本地实现,serviceName对外提供的名称对外提供的名称,registyPort开启端口 -->
<property name="registryPort" value="1021"/>
</bean>
<bean name="rmiserver2" class="com.ptt.service.BmbServiceImpl"/>
<bean name="serverTest2" class="org.springframework.remoting.rmi.RmiServiceExporter">
<!-- 将远程接口实现类对象设置到RMI服务中 -->
<property name="service" ref="rmiserver2"/>
<!-- 设置RMI服务名,为RMI客户端依据此服务名获取远程接口实现类对象引用奠定基础 -->
<property name="serviceName" value="BmbServiceImpl"/>
<!-- 将远程接口设置为RMI服务接口 -->
<property name="serviceInterface" value="com.ptt.service.BmbService"/>
<!-- service本地实现,serviceName对外提供的名称对外提供的名称,registyPort开启端口 -->
<property name="registryPort" value="1022"/>
</bean>
这里我写了两个端口,可以轮流调用,也可以写两次service,改一下端口号,这里我就改下名字部署两次吧
然后就是打成jar包,部署到Linux下,使用命令,启动成功
分离web,项目基本结构
配置主配置文件
<bean name="rmiProxyFactoryBean1" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl" value="rmi://ip:1021/BmbServiceipImpl"/>
<property name="serviceInterface" value="com.ptt.service.BmbService"/>
</bean>
<bean name="rmiProxyFactoryBean2" class="org.spipringframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl" value="rmi://ip:1022/BmbServiceImpl"/>
<property name="serviceInterface" value="com.ptt.service.BmbService"/>
</bean>
写一个测试类
public static void main(String[] args){
BmbService bmbService = null;
Random random = new Random();
int i = random.nextInt(2);
logger.info(i);
if (i == 1) {
try {
logger.info("get data from server1");
bmbService = (BmbService) applicationContext.getBean("rmiProxyFactoryBean1");
System.out.println(bmbService.getBmbById(5)+"1");
} catch (Exception e) {
logger.error("get a error,turn to server2");
bmbService = (BmbService) applicationContext.getBean("rmiProxyFactoryBean2");
System.out.println(bmbService.getBmbById(5)+"2");
}
} else {
try {
logger.info("get data from server2");
bmbService = (BmbService) applicationContext.getBean("rmiProxyFactoryBean1");
System.out.println(bmbService.getBmbById(5)+"3");
} catch (Exception e) {
logger.error("get a error,turn to server1");
bmbService = (BmbService) applicationContext.getBean("rmiProxyFactoryBean2");
System.out.println(bmbService.getBmbById(5)+"4");
}
}
}
但是这里出现报错
Caused by: java.rmi.ConnectException: Connection refused to host
百度发现
这个问题:
1.第一个是hostname 有没设置好(windows server试过不用设置host)
2.要设置 System.setProperty("java.rmi.server.hostname",realIp); 其中realIp 为服务器或电脑的对外ip
要在service中的启动程序中加上这一行代码
System.setProperty("java.rmi.server.hostname","49.235.187.63");
接下来测试又出现一个坑,搞了一下午也没搞定,最后也是问壮壮师兄才知道问题出在哪里
就是部署成功后,web端一直报链接超时的错误,但是我端口是开着的呀,本地访问是没有问题的,远程访问就是报错,后面才知道这是因为我的防火墙是开着的,但是RMI除了注册端口,其他通信端口是服务器随机产生的,因此很难穿透防火墙(其实是穿不透。。)那要如何在防火墙开启的状态下访问呢?
这时需要用到一个很牛(花)逼(里)轰(胡)轰(哨)的操作
<!-- 注册端口号 -->
<property name="registryPort" value="1021"/>
<property name="servicePort" value="1021"/><!--不指定就随机 -->
就是将端口写两边就可以穿透了。。。
具体可以看这篇博客 https://blog.csdn.net/asenwei/article/details/7446027
到此,总算所有问题都解决了,路漫漫其修远兮,想到以后还有无尽的坑要填,心中不免有了一丝丝(巨大的)悲伤(压力)
启动jar包
并使用nginx负载均衡到两台web服务器,访问页面
明天计划的事:完成深度思考,提交任务八
遇到的困难:
收获:
评论