发表于: 2017-09-18 21:04:35

1 913


今天做的事:

今天部署两个Service,然后实现随机访问。


昨天已经实现web和Service分离并且访问成功了,今天尝试部署两个Service,然后随机访问两个Service,有一个挂掉,就使用另外一个

这个是关键方法

public StudentService getsS() {
StudentService studentService;
   Integer num = (int)(Math.random()*10);
   if(num <= 5){
logger.info("============>进入Service1");
       try {
ApplicationContext context = new ClassPathXmlApplicationContext("spring/rmi-client.xml");
            studentService = (StudentService) context.getBean("rmiServiceProxy");
       }catch (Exception e){
logger.info("============>Service1挂了,用2");
           ApplicationContext context = new ClassPathXmlApplicationContext("spring/rmi-client2.xml");
           studentService = (StudentService) context.getBean("rmiServiceProxy2");
           e.printStackTrace();
       }
}else{
logger.info("============>进入Service2");
       try {
ApplicationContext context = new ClassPathXmlApplicationContext("spring/rmi-client2.xml");
           studentService = (StudentService) context.getBean("rmiServiceProxy2");
       }catch (Exception e){
logger.info("============>Service2挂了,用1");
           ApplicationContext context = new ClassPathXmlApplicationContext("spring/rmi-client.xml");
           studentService = (StudentService) context.getBean("rmiServiceProxy");
           e.printStackTrace();
       }
}
return studentService;
}

其实和之前各位师兄的没差,所以就这么搞了


这里要注意的是,这两个RMI配置要分成两个文件,如果是在一个文件中,如果web容器启动时,有一个服务端未启动,那么整个web容器都会报错,因为加载文件的时候会检查出其中一个RMI失败了,所以就导致报错。


然后分成两个配置文件的时候,虽然加载未启动那个失败了,但是不影响整个项目的运行。


最后在需要该方法的地方调用即可。


然后,小马哥给我审核任务8把,服务器部署还是有点问题。


接下来说一下,服务器部署

首先,我的服务器又炸了,我也不知道为什么总是出问题,就是自己只要稍微鼓秋一下,就崩了。

本地ping服务器已经ping不通了,所以无法传文件,无法使用Xshell,已交工单,但是目前为止,问题还未解决。


然后,我就尝试用了一下凯博闲置的服务器。

首先我装了一下jetty,但是在启动的时候出现报错

Starting Jetty: Exception in thread "main" java.lang.UnsupportedClassVersion。。。。

就是这个错误大概就是jdk的问题,因为我的项目是jdk1.8的,而服务器上的jdk是1.7的,所以本来只要改一下就可以的,但是我小看这个问题了。

在我解压jdk1.8后,更改配置文件却并没有起效,使用java -version命令,出现的还是1.7的版本。

然后我就不断地尝试修改配置文件,等等的无限循环,后来绝望了,感觉应该是这个jdk安装的时候比较顽固。


搜了一下,如何卸载linux系统下已经安装的自带的jdk

首先使用命令rpm -qa|grep jdk,检查jdk的安装情况

然后如果有安装的jdk,就会出来一个文件夹(或多个),我这里找不到记录了,就不贴图了

然后使用命令rpm -e 跟上出现的jdk文件夹,就可以卸载相关jdk

然后去vim /etc/profile将jdk的环境注释掉,并使用source /etc/profile命令是文件生效

然后使用javac或者java -version,就可以看到提示命令不存在,这时,jdk卸载完成

然后接下来的操作就是正常的解压jdk,配置文件中的环境等等,然后使用java -version验证。


最后这些都做完,就可以尝试使用服务器,真正的远程连接了。


开始我以为将web端放到服务器,所以才安装的jetty,又搞了一下午jdk的问题。

后来看了张鑫的日报,原来是将Service的jar包放到服务器运行,然后本地web调用,这里首先是有一个内网ip和外网ip的概念,张鑫日报中有讲。但是在复现这个问题之前,我就遇到了jar包运行报错的问题了。


主要报错:

Exception in thread "main" org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/context]

Offending resource: class path resource [spring/spring-dao.xml]


是我的文件头有问题,目前正在找解决办法,今天看看能不能实现服务器远程连接把,如果不能实现就放弃,大概问了一圈,之前的师兄都没有在服务器部署,在本地跑了一下就过了,据我所知张鑫是确实完成服务器远程连接的壮举了。然后我就不浪费时间搞了,需要赶快准备复盘了,我的任务花的时间已经太长了。


哇,终于实现服务器远程连接了,中间无数个坑。难受


首先,我们需要把服务端部署到服务器上,这里需要打jar包,但是我们这个服务端带有main主函数,所以一般的打jar包方式是不可以的。必须要进行一番操作

参见链接:http://blog.csdn.net/defonds/article/details/43233131

就是我们需要使用一个新的插件,然后就可以在服务器直接运行jar包

在pom文件中

<plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-shade-plugin</artifactId>
 <version>1.4</version>
 <executions>
   <execution>
     <phase>package</phase>
     <goals>
       <goal>shade</goal>
     </goals>
     <configuration>
       <filters>
         <filter>
           <artifact>*:*</artifact>
           <excludes>
             <exclude>META-INF/*.SF</exclude>
             <exclude>META-INF/*.DSA</exclude>
             <exclude>META-INF/*.RSA</exclude>
           </excludes>
         </filter>
       </filters>
       <transformers>
         <transformer
                 implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
           <mainClass>org.spring.RMIServer</mainClass>
         </transformer>
         <transformer
                 implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
           <resource>META-INF/spring.handlers</resource>
         </transformer>
         <transformer
                 implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
           <resource>META-INF/spring.schemas</resource>
         </transformer>
       </transformers>
     </configuration>
   </execution>
 </executions>
</plugin>

其中

<transformer
                 implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
           <mainClass>org.spring.RMIServer</mainClass>
         </transformer>

对应的是你的main主函数名,之前我就是直接copy,导致main主函数找不到,结果卡了好久才发现这个问题。


此时直接在服务器上是可以直接使用java -jar XXX.jar来运行的


但是使用RMI远程连接的时候有个问题,在张鑫的日报中有介绍

链接在此:http://www.jnshu.com/daily/33294?dailyType=others&total=154&page=12&tid=55&oid=5&userType=offline&sort=0&orderBy=3


就是需要在加载配置文件之前加一句

System.setProperty("java.rmi.server.hostname","123.56.222.170");

这个是把外网ip先解析?还是什么来着,具体看张鑫日报把,不加这句就报错。


然后就配置url和端口等等就能正常访问了,哇,终于实现RMI远程连接了,开心!


不过这个远程连接并没有涉及数据库的操作,因为发现数据库的操作很麻烦,有很多坑,和报错。


首先我忘记数据库的密码了,如何重置密码

链接:https://jingyan.baidu.com/article/6dad5075198f18a122e36e72.html


简单来说,先停掉mysql

service mysqld stop

然后,安全模式进入数据库,并跳过授权表

mysqld_safe --skip-grant-tables &

之后

mysql -uroot -p

切记不要敲密码。

mysql> use mysql

mysql> update user set password=PASSWORD("123456")where user="root";

mysql> flush privileges;

mysql> quit


这里有个小坑,就是mysql5.7以后,没有password字段了

authentication_string

改成这个了


所以更改密码那句,就变成了这样

update mysql.user set authentication_string=password('root') where user='root' ;


到此为止,你肯定以为数据库可以使用了,那你就太天真了,不知为什么,我使用数据库的时候总是会报连接错误,总之就是用不了数据库,所以我就舍弃数据库操作了。


然后我在这个过程中(改密码之前,以为觉得改密码太麻烦),突发奇想,我为什么不把服务部署到服务器,然后连接本地数据库呢,这样改下配置文件的ip就行了啊,然后我就兴致勃勃的试了,然后失败了


听凯博说,这种方式不可以,需要什么内网穿透,明天趁着上午的时间简单了解一下。



昨天半夜,笑然给我讲了一下这个服务器连接本地数据库的问题,顺便还给我演示了一下,结果弄到挺晚的。感谢,笔芯~


这个问题呢,其实是我之前没有考虑明白,首先我们的本地ip是内网ip,即,本地ip由路由器分配,并不暴露在公网上,而是隐藏的,所以自然访问不到。


那么如何访问?


就是要将我们的内网ip暴露在公网上。然后就可以使用了。但是使用的依然是路由器的ip。即,路由分配给我们的ip是在公网上找不到的,必须使用路由ip,然后经端口转接,在将本地mysql的远程连接权限开开等等一系列操作,最后才能够实现在服务器访问本地数据库。


总之,核心就是,如何将本机暴露在公网上。


明天计划:开始任务9


问题:服务器和本地的远程连接并没有实现,今天晚上如果完不成,就放弃;已完成。

    明天上午看一下为什么服务器无法访问本地数据库。已解决。


收获:部署两台Service,并随机访问;卸载linux预安装jdk;实现RMI“真正的”远程访问。







返回列表 返回列表
评论

    分享到