古人云,能睡是福。最近终于感受到,晚上能在自己舒服的大床上睡一觉是多么幸福的一件事了,黑白颠倒的日子我这个纯正中国人还真是有点接受不了。不过,看着测试通过,心里美美哒,所有的劳累都烟消云散了。哈哈,不开玩笑了,言归正传。服务器切换。
说起服务器切换,我的脑袋里就想起了一个高大上的名词——热部署。
部署我们都知道是什么意思,那热部署是什么你清楚吗?不知道的话就去查查百度百科吧。
——就知道你懒得查,所以还是我来告诉你吧。
所谓热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用。这最后一句很重要,也是把我难到的地方。
眼下,我有一个项目,分别在服务器A和服务器B上进行发布,当服务器A因为机器损坏,或者断电等原因宕掉了,要自动切换到服务器B上,不用人工去修改配置文件的终结点,也不能够重启应用程序,就是完全无缝接的连接到服务器B。
用过很多种方法,苍天不负有心人,总算是成功了。
因为用的WCF,所以客户端连服务端,无非是通过终结点配置来完成的。起初以为,更改了配置文件的服务地址就自动切换过去了。哪知道还需要重启一下客户端才能够切换过去。
我使用的第一种方法,但是没有成功。
当服务器A宕掉,自动修改配置文件。注意:不是手动哦。
然后刷新配置文件,重新加载。也就是在去取配置文件的时候,加上了这句代码:
ConfigurationManager.RefreshSection("appSettings");// 刷新命名节,在下次检索它时将从磁盘重新读取它。
但是,没有切换成功,应该是有办法解决的,我没有成功,大家可以自己动手试试,成功了教教我。互相交流。
不成功的原因:
System.Configuration.ConfigurationSettings.AppSettings["ServerName"]
只能使用一次,不管你怎么修改config文件中的值,以后读出的结果始终等于第一次的结果。因为AppSettings["ServerName"]读一次后就写到内存中,而下一次读取就直接读内存中值。
最终解决办法:
配置文件的终结点,将两台机器的服务器的终结点地址都配置上。
HostServer是主服务器,StandByServer是备服务器。
之前的工厂类是使用无参的,如下:
public static IUserSevice GetUserService()
{
return GetUserService("Service");
}
public static IUserSevice GetUserService(string endpointName)
{
return GetServiceBusiness(endpointName);
}
定义一个静态变量,初始值为空
public static string strServiceEndpointName = "";
ServiceFactory.GetUserService(CommonConstants.strServiceEndpointName).QueryUser();
登录的时候进行判断:
public Login()
{
InitializeComponent();
//如果当前servera是主服务器,那么调用ServiceA服务,如果当前serverb是主机,则调用ServiceB服务。
if (ConfigurationManager.AppSettings["HostServer"].Equals("servera"))
{
CommonConstants.strServiceEndpointName = "ServiceA";
}
else
{
CommonConstants.strServiceEndpointName = "ServiceB";
}
}
当,当前服务器出现问题时,执行下面代码,进行服务器切换。
if (context.Message.S_HostWorkServer != null)
{
if (context.Message.S_HostWorkServer != ConfigurationManager.AppSettings["HostServer"])
{
if (context.Message.S_HostWorkServer.Equals("servera"))
{
ConfigurationUtil.ChangeLocalConfig("HostServer", "servera");
ConfigurationUtil.ChangeLocalConfig("StandByServer", "serverb");
CommonConstants.strServiceEndpointName = "ServiceA";
}
else
{
ConfigurationUtil.ChangeLocalConfig("HostServer", "serverb");
ConfigurationUtil.ChangeLocalConfig("StandByServer", "servera");
CommonConstants.strServiceEndpointName = "ServiceB";
}
ConfigurationManager.RefreshSection("appSettings");
}
}
总算是切换成功了,思路就是这么个思路,思路清晰了,自己也可以完成。代码不是很完整,仅供参考。你肯定有更好的办法,我们多多交流。互相学习。
乏了,睡觉。O(∩_∩)O~