发表于: 2017-11-12 23:50:02

1 924


今天完成的任务:

1.思考一下怎么将RMI应用到项目,分离Serviceweb?

在做SpringRMI简单的demo的时候,我是将一个项目工程作为服务器,上面有我的接口和实现类,并且使用配置文件去暴露接口,以供其他应用来调用。

然后客户端是先存在相同的接口,然后去找到暴露的接口然后连接,再去调用服务端里面的接口。

那我在自己的项目里面修改的时候,Service接口和实现是在服务器端,然后发布到tomcat上面,但是客户端里面的Controller之类的东西怎么办呢?再去发布到一个web容器吗?

交流过了以后才知道原来是需要首先服务器端加载配置文件,就是把端口暴露出来,然后使用main函数来加载。就是下面这样。然后客户端去使用web容器来发布,这样就可以了。

public class Load {
   
public static void main(String[] args) {
       
new ClassPathXmlApplicationContext("spring.xml");
       
System.out.println("开始运行");
   
}
}

服务端写的是dao层,Service层,还有数据源的一些接口和配置,还需要一个main函数启动。

客户端写的是controllerspringMVC配置文件,还有各种jsp文件。另外还需要加载客户端配置的一个配置文件。

试一下,先运行main函数,然后再去发布客户端。

是可以访问的。完成了Serviceweb的分离。

这中间还有个小问题就是实体类的序列化的问题,实体类需要实现serializable。不然会出现500的错误。

下一步部署两个Service,在web随意访问其中的一个。

部署两个Service怎么做呢?是不是需要再去建立一个项目然后端口换一下去访问?还是在配置文件里面加一个端口就行了??

这两种方法应该是都可以的,只要能加载到两个配置文件,并且都注册到端口就没问题。

我的做法是在配置文件里面加一个配置,端口号和暴露Service的名字更换一下,然后重新使用main函数加载一下配置这样就行了啊,端口号看一下,也开了。

后来又发现这样做的话,两个端口会对应一个pid进程,这样的话要停掉一个服务就不能做到了。。所以还是在新建一个项目吧。

然后是客户端去随机访问某个Service,但是客户端访问哪一个端口是在配置文件里面写的啊??咋办?

请教大佬以后发现在客户端写的配置里面其实是注入了一个bean来调用Service的方法,这样在客户端就可以通过使用这个bean来调用Service里面的方法,那这样的话就可以在Spring中配置两个bean,名字不同,端口号不同,其他都是相同的,然后再去controller里面调用不同的bean,就像这样。

@RequestMapping(value = "/student",method = RequestMethod.GET)
public String list(Model model){
   
int a= (int) (Math.random()*10);
    if
(a<5){
        ArrayList s1=
myRMIClient.list();
       
model.addAttribute("s1",s1);
       
System.out.println("222222");
   
}
   
else
   
{
        ArrayList s1=
myRMI2Client.list();
       
model.addAttribute("s1",s1);
       
System.out.println("11111");
   
}

然后去写一下trycatch,达到其中一个Service挂掉的时候可以不影响服务。就这样,也没啥难的。

@RequestMapping(value = "/student",method = RequestMethod.GET)
   
public String list(Model model){
       
int a= (int) (Math.random()*10);
        if
(a<5){
           
try{
                ArrayList s1=
myRMIClient.list();
               
model.addAttribute("s1",s1);
               
System.out.println("222222");
           
}catch(Exception e){
                ArrayList s1=
myRMI2Client.list();
               
model.addAttribute("s1",s1);
               
System.out.println("11111");
           
}
        }
       
else
       
{
           
try{
                ArrayList s1=
myRMI2Client.list();
               
model.addAttribute("s1",s1);
               
System.out.println("11111");
            
}catch(Exception e){
                ArrayList s1=
myRMIClient.list();
               
model.addAttribute("s1",s1);
               
System.out.println("222222");
           
}
        }
       
return "list";
}

然后停掉其中一个服务端。再去访问。也是可以查看到的。ok

 

2.本地两台web,两个Service ,配置负载均衡。

发布的时候出了点问题,后来发现是因为为了不用输入项目名,配置文件里面添加了以前项目名,后来改回来就好了。然后nginx的配置和以前也没啥区别。

配置负载均衡以后尝试关闭一个服务端,然后再去访问,不会出问题。

 

3.最后是将项目发布到服务器上面。

本地的web去访问服务器上面的Service。第一个问题是服务端的ip地址是什么?

百度查到:默认情况下,Java RMI使用服务器主机的IP地址作为远程引用的服务器名称。

那就应该是服务器的IP地址了

然后服务端使用服务器的ip地址来获取一下。

最后是打jar包,把服务端放在服务器上运行一下。使用maven插件来打包成可以运行main函数的jar包。


出现了问题是不能找到Spring的配置文件??

是因为:工程一般依赖了很多的jar包,而被依赖的jar又会依赖其他的jar包,这样,当工程中依赖到不同的版本的spring时,在使用assembly进行打包时,只能将某一个版本jar包下的spring.schemas文件放入最终打出的jar包里,这就有可能遗漏了一些版本的xsd的本地映射,所以会报错。

解决方法:http://blog.csdn.net/qing0706/article/details/51612040

再去运行时就可以了。

 

jar包运行在服务器上面报错500,连接被拒绝。。。

看到其他师兄以前也有这个问题。

解决办法是在加载配置文件之前绑定公网的ip

加载配置之前加上第一句话,然后就不报错了。但是一直在连接的状态。

加上一句来设置进行交流的端口号。

<property name="servicePort" value="8090"/>

终于可以访问了。。                                       

最后还要记得每次修改完了以后都要把客户端和服务端重启一下。。。不然不会生效。


 

明天计划:

明天做任务九啊!!!

遇到问题:

小问题吧都是,上面也写了

收获:

RMI配置的方法,对RMI理解更多了一点。

maven打包

禅道:

http://taskNaNteng.com/zentao/task-view-10342.html

 



返回列表 返回列表
评论

    分享到