线上bug的解决方案-带来的全新架构设计

发表于:2016-2-14 10:10

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:失足程序员    来源:51Testing软件测试网采编

1 using Net.Sz.Framework.Log;
2 using System;
3 using System.Collections.Generic;
4 using System.Linq;
5 using System.Text;
6 using System.Threading.Tasks;
7
8 namespace TestApp
9 {
10     class Program
11     {
12         static void Main(string[] args)
13         {
14             //Logger.LOGCONSOLE = true;//不在控制台打印信息
15             //Logger.LOGLEVEL = Logger.ENUM_LOGLEVEL.INFO;//不显示debug消息
16             Logger.Info("==================Start============================");
17
18             Net.Sz.Framework.Script.ScriptManager.GetInstance().LoadCSharpFile(new string[] { "../../../TestApp.Scripts/" });
19
20             MainManager.GetInstance().Test();
21
22             Logger.Info("==================End============================");
23             Console.ReadLine();
24         }
25     }
26 }
  我们先尝试运行一次
  也许上面的打印太乱,我们看看简洁版本的
  上面我们看样看出来,功能是没有问题的。
  如果你稍微注意了,或者看过我之前的文章的话,会发现我的这个脚本没有实现IBaseScript接口,而只继承了BaseScript抽象类。
  因为这样的脚本不需要放到脚本存储器里面,只需要执行init函数,把脚本自身反注册到主程序函数体里面!
  现在就是牵涉更新的事情。
  更新有一个问题,当服务一旦部署后需要更新那就是的再次执行加载脚本方法。如果你使用windows服务运行的,更新势必是一个问题。
  这里我只介绍一种方式,http监听方式。
  要开启http监听方式,需要一个Net.Sz.Framework.Netty.Http.IHttpHandler的实现类
1 using Net.Sz.Framework.Log;
2 using System;
3 using System.Collections.Generic;
4 using System.Linq;
5 using System.Text;
6 using System.Threading.Tasks;
7
8
9 /**
10  *
11  * @author 失足程序员
12  * @Blog http://www.cnblogs.com/ty408/
13  * @mail 492794628@qq.com
14  * @phone 13882122019
15  *
16  */
17 namespace TestApp
18 {
19     /// <summary>
20     ///
21     /// </summary>
22     public class ReloadScriptHandler : Net.Sz.Framework.Netty.Http.IHttpHandler
23     {
24         public void Action(Net.Sz.Framework.Netty.Http.HttpSession session, string method, string bindpath, Dictionary<string, string> parms)
25         {
26             Logger.Info("收到请求");
27
28             Net.Sz.Framework.Script.ScriptManager.GetInstance().LoadCSharpFile(new string[] { "../../../TestApp.Scripts/" });
29             MainManager.GetInstance().Test();
30
31             session.writeSuccess();
32             session.AddBodyLine("OK");
33             session.WriteFlush();
34         }
35     }
36 }
  接下来我们在主函数加入下面代码
  Dictionary<string, Net.Sz.Framework.Netty.Http.IHttpHandler> handlers = new Dictionary<string, IHttpHandler>();
  handlers.Add("ReloadScript", new ReloadScriptHandler());//开启对http监听,监听模块为  ReloadScript
  Net.Sz.Framework.Netty.NettyPool.GetInstance().AddHttpBind("127.0.0.1", 9527, handlers);
  运行起来,看看,
  可以看出,开启了http监听,reloadscript
  然后我们修改一下MainManagerScript文件的Test方法
  public void Test()
  {
  Logger.Info("我是test  修改过的版本");
  }
  在浏览器输入:http://127.0.0.1:9527/reloadscript
  运行时成功的。这样的架构方式,很适合的是游戏开发,某些功能块很容易出bug,如果用脚本存储器访问比较耗费性能。
  这样反向注册功能块脚本到功能块,既能实现bug的热更新,也不会影响性能消耗。
22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号