发表于: 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远程连接的时候有个问题,在张鑫的日报中有介绍
就是需要在加载配置文件之前加一句
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“真正的”远程访问。
评论