服务器自动切换

    古人云,能睡是福。最近终于感受到,晚上能在自己舒服的大床上睡一觉是多么幸福的一件事了,黑白颠倒的日子我这个纯正中国人还真是有点接受不了。不过,看着测试通过,心里美美哒,所有的劳累都烟消云散了。哈哈,不开玩笑了,言归正传。服务器切换。

说起服务器切换,我的脑袋里就想起了一个高大上的名词——热部署。

 

部署我们都知道是什么意思,那热部署是什么你清楚吗?不知道的话就去查查百度百科吧。


——就知道你懒得查,所以还是我来告诉你吧。

        所谓热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用。这最后一句很重要,也是把我难到的地方。

服务器自动切换_第1张图片


    眼下,我有一个项目,分别在服务器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的时候采用有参数的。

      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~





你可能感兴趣的:(【技术难点-宝贵经验】)