发表于: 2016-12-08 20:53:00
1 2013
今天完成的事情:
1)部署两台WEB,通过Nginx配置两台WEB随机访问,两台WEB可以随机访问两台Service。
这个比较容易实现,用upstream配置就好了,具体可以参考博文http://www.linuxidc.com/Linux/2015-03/115207.htm
2)部署两台Service,保证随意一台service宕机,web可以连接到另一台
具体实现思路如下(昨天的日报已经讲了一部分):
以下代理bean指的是RmiProxyFactoryBean
①客户端配置两个代理bean,在controller处理逻辑中采用随机数与switch方法进行bean的调用选择,一台service宕掉,利用try/catch捕获异常,进行service的切换
②但在代码运行过程中发现一个问题
比如AB两台service,A宕掉,catch语句里自动切换到B,这里是没问题的
但当A重新启动,B宕掉,web访问B的时候,因为B的宕掉切换到A,这时发现A也是无法连接的;这里大概是因为代理bean是单例的,相当于写死在容器中,A宕掉的时候,代理A连接的bean也就随之断开了,当A重新启动,容器并不会再去创建一个代理bean连接A了
想到一个解决办法,使用非单例bean,然后发现依然在,这里并非是非单例没有意义,而是controller初始化以后,会拿到两个代理连接的bean,拿到以后如果人为不干预是不会变的,也相当于写死在controller里了
那怎么办呢,非单例只有在获取时才会new一次,所以我们可以在service重启以后,在controller逻辑里重新获取一次代理bean(即重建连接)
我的做法是在catch里每次执行数据调用前重新获取一次连接(正常的最外层的try里是不会每次都重新获取连接的,因为这样会产生太多新的对象,对服务器压力太大)
然后在catch里再套一层try/catch,这里是基于以下的一种担忧
AB同时运行,A宕掉,web连到B,A重启,B再宕掉,(这时A的连接已断开),如果web访问时,随机会访问到A,因为A连接已经掉了并且一开始try里没有重新建立连接的逻辑,catch到连接异常,切换到B,此时B已经宕掉了,再怎么重连也没用,于是返回500(已验证)。于是就在catch里再套一层catch,B连接异常,再捕获异常再切换到A,这里的第二层catch里是存在重连逻辑的,于是重连成功
小知识:这里我们用到了从已初始化的容器里手动获取bean的方法,如下
ApplicationContext ac1=WebApplicationContextUtils.getWebApplicationContext(request.getServletContext());
request.getServletContext()用来获取servletContext上下文
WebApplicationContextUtils.getWebApplicationContext(servletContext)用来获取初始化的容器(是spring配置bean的那个.xml文件初始化生成的容器,相对于springMVC配置文件生成的容器来说是父容器)
然后,我们通过ac1.getBean(string)来获取我们想要的bean,如果是非单例的bean,会new一个新的,这样在我们的案例中就重新建立了连接
明天计划的事情:
了解任务9需求
遇到的问题:
1)昨天有个问题没有说
在任务八的第一天,纯java rmi的demo练习时,出现了客户端连接不到服务端的情况,当时查资料是因为服务端返回的信息没有客户端所需的ip信息,如下截图,但是
这在spring中该如何做呢,在Spring中我们一般是用注解的方式处理bean对象,并没有地方可以提前配置System.setProperty()
答:暂时想到一个办法,在bean的构造方法中写这段话,spring容器初始化时,就会执行了
2)写的web端非常非常不稳定,经常开启个十来次以后就会出现controller初始化失败的情况,啥东西也没改过,而且一旦出现,之后就一直初始化失败,只能删除,然后用之前备份的;解决办法都试过了,无法解决;简直是个坑,谁用谁投诉
收获:
任务八做完了。。
评论