发表于: 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服务器,访问页面




明天计划的事:完成深度思考,提交任务八

遇到的困难:

收获:



返回列表 返回列表
评论

    分享到