发表于: 2017-02-21 23:52:47

1 1859


今天完成的事情:

1、部署两台service,随机访问一台,其中一台出现宕机自动切换到另一台

2、熟悉萝卜多复盘项目

明天计划的事情:

1、随机访问还有些问题,明天继续,完成任务8

2、萝卜多复盘项目

遇到的问题:

1、部署两台service,我刚开始想到的是用两个server配置文件配置两个端口,后来仔细想想感觉这么做并不合理,如果发生服务器宕机,很有可能这两个都一块挂了,还是应该部署两个service项目更合理,很少会出现同时挂掉的情况,但在用配置两个server配置文件的方法部署两台service过程中还是遇到一些问题,先记录下来:

首先配置了两个server.xmlserver1.xml:

                                             

registryPort设为8001servicePort设为8002

server2.xml:

registryPort设为8003servicePort设为8004

然后在main函数中启动:

service端确实启动了,但是启动的是端口为8003server2.xml

我在客户端client.xml配置两个bean

一个8001,一个8003,因为刚刚启动的是8003,所以测试类中:

但是运行测试类,报错了:

报错是因为用的是studentService1这个bean,但刚刚明明是设置了studentServic2的,我把studentService1这个bean注释掉:

再次运行测试类:

这样是可以测试成功的,

我又试了一下,如果我只启动一个service,用server1.xml里面配置的那个,测试类则会报错studentService2,大概明白了,要么service两个都启动,在client.xml中可以配置两个bean,当只能启动一个service时,client.xml中配置两个bean就会有一个报错。

2、部署两台service,一台端口8001

一台端口8003

启动测试类测试时:

在这里我耽搁了挺长时间,一直都把关注点放在了expected single matching bean but found2上了,以为是设置client.xml配置的两个bean有什么问题,其实前面的报错信息说的很明白,是studentControllerUnsatisfied dependency expressed through field ‘studentService’,我是用main方法测试一直以为和Controller类没什么联系所以就没在意前面的报错信息,事实证明我还是想当然了,controller类中只有一个studentService,在controller类中在添加一个:

再次运行测试类:

收获:

1、部署两台service,感谢黄超师兄日报里提供的思路,在controller类中添加随机访问的逻辑:

先随机产生10两个随机数,如果是1就访问service1,如果是0就访问service2,如果访问service1service1宕机会执行到catch语句中的try语句访问service2,反之会访问service1.如果此时service1重启,容器并不会再去创建一个bean连接service1.所以需要手动获取bean,用方法:

ApplicationContext ac1=WebApplicationContextUtils.getWebApplicationContext(request.getServletContext());

考虑到一种特殊情况:service1宕机后连接service2,之后service1重启同时service2宕机,这时候如果访问service1还没有建立连接就又会切换到service2,但是service2已经宕机,所以catch中又嵌套了一层try/catch,并且在第二层catch中加入重新连接的逻辑。



返回列表 返回列表
评论

    分享到