发表于: 2017-02-21 23:52:47
1 1859
今天完成的事情:
1、部署两台service,随机访问一台,其中一台出现宕机自动切换到另一台
2、熟悉萝卜多复盘项目
明天计划的事情:
1、随机访问还有些问题,明天继续,完成任务8
2、萝卜多复盘项目
遇到的问题:
1、部署两台service,我刚开始想到的是用两个server配置文件配置两个端口,后来仔细想想感觉这么做并不合理,如果发生服务器宕机,很有可能这两个都一块挂了,还是应该部署两个service项目更合理,很少会出现同时挂掉的情况,但在用配置两个server配置文件的方法部署两台service过程中还是遇到一些问题,先记录下来:
首先配置了两个server.xml,server1.xml:
registryPort设为8001,servicePort设为8002,
server2.xml:
registryPort设为8003,servicePort设为8004,
然后在main函数中启动:
service端确实启动了,但是启动的是端口为8003的server2.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有什么问题,其实前面的报错信息说的很明白,是studentController:Unsatisfied dependency expressed through field ‘studentService’,我是用main方法测试一直以为和Controller类没什么联系所以就没在意前面的报错信息,事实证明我还是想当然了,controller类中只有一个studentService,在controller类中在添加一个:
再次运行测试类:
收获:
1、部署两台service,感谢黄超师兄日报里提供的思路,在controller类中添加随机访问的逻辑:
先随机产生1和0两个随机数,如果是1就访问service1,如果是0就访问service2,如果访问service1时service1宕机会执行到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中加入重新连接的逻辑。
评论