web动态部署(热部署)
web动态部署(热部署)
今天跟大家探讨一下关于web动态部署,也就是热部署的问题。说这个之前,先说一个敏捷开发的原则。
【最小发布、增量开发】
我们在做项目时,设定的期限都特别长。总是想第一个版本就想把所有想到的问题都做完,以至于项目一再延期。所以我们应该改变我们的开发策略。采用敏捷开发的方式。
这里我想强调的有2点, 1.最小发布。2.增量开发 。
对于最小发布,就是要在第一版中把核心功能实现,即立即发布第一个版本。在实际的开发中,公司为了抢占市场,都会尽可能早的发布一个V1.0的版本。能有效的占领市场,同时对于开发人员来讲,可以减少对项目的排斥情绪。因为项目拖得越久,开发人员就会越疲惫,就会消极怠工,bug数会直线上升。这显然对与开发是极其不利的。
而增量开发,则是没增加一个功能模块,就要发布一个版本。保证在规定的时间内,至少可以让用户使用到新的功能。而且,采用增量开发的技术,也从可以降低模块之间的耦合性。人不可能一口吃成胖子,项目也一样,需要分阶段,分目标的去开发。中国还实行“五年计划”,更何况我们的项目呢。
【热部署】
热插拔,这个词儿可能只有在硬件中听过,在软件开发中可能没有听过。而热部署,跟热插拔一样,就算没听过,看到这个词儿也能想出个1,2,3来。
不错,热部署就是系统在运行过程中,可以对功能进行可配置,而不用停止或关闭系统。不用我说大家也能想到它的好处吧。
解耦,灵活性自然不必说,最重要的是用户可以按自己的喜好,个性化设置自己的系统,这对于用户来说是非常欢喜的。有这样的系统,没有人会去选择死板一块的系统。而且也同时印证和支持了最小发布和增量开发的方针。增量开发,每开发一个功能,就采用热部署,对系统进行在线升级。
说了这么多废话,还是给了代码看看吧,毕竟实践是检验真理的唯一标准。
热部署,主要用到了xml文件来实现动态效果。菜单用xml文件来存储,系统动态读取xml文件来动态生成菜单。例子菜单分为2级,一级菜单在同一个xml文件中,二级菜单存在放各自对应的文件夹中的xml文件里。
一级菜单存放在Config文件夹下的ChildSystem.config:
1 <? xml version="1.0" encoding="utf-8" ?> 2 <!-- 系统中的子系统或子模块。 --> 3 < childsystem > 4 < system name ="GoodsManager" value ="商品管理" assembly ="GoodsManager.dll" /> 5 < system name ="UserManager" value ="用户管理" assembly ="UserManager.dll" /> 6 </ childsystem >
商品管理二级菜单 存放在 GoodsManager文件夹下的App.config:
1 <? xml version="1.0" encoding="utf-8" ?> 2 < Pages > 3 < page name ="socket" value ="测试界面" url ="~/GoodsManager/Socket.aspx" /> 4 < page name ="config" value ="配置页面" url ="~/GoodsManager/Configer.aspx" /> 5 < main > 6 < name > GoodsManager </ name > 7 < author > longxuan </ author > 8 < version > 1.00 </ version > 9 < assmebly > GoodsManager.dll </ assmebly > 10 </ main > 11 </ Pages >
用户管理二级菜单存放在UserManager文件夹下的 App.config:
1 <? xml version="1.0" encoding="utf-8" ?> 2 < Pages > 3 < page name ="internet" value ="网络时间" url ="~/UserManager/InternetTime.aspx" /> 4 < page name ="socket" value ="测试界面" url ="~/UserManager/Socket.aspx" /> 5 < page name ="config" value ="配置页面" url ="~/UserManager/Configer.aspx" /> 6 < main > 7 < name > returnCashStrategy </ name > 8 < author > longxuan </ author > 9 < version > 1.00 </ version >
主界面Default.aspx ,拖入一个TreeView控件,name修改为TreeViewMU,添加SelectedNodeChanged事件。后台代码:
1 using System;
2 using System.IO;
3 using System.Web.UI.WebControls;
4 using System.Xml;
5
6 namespace PluginTest
7 {
8 public partial class Default : System.Web.UI.Page
9 {
10 protected void Page_Load( object sender, EventArgs e)
11 {
12 if (! IsPostBack)
13 {
14 ShowChildSystem();
15 }
16 }
17
18 /// <summary>
19 /// 子系统、子模块的显示
20 /// </summary>
21 private void ShowChildSystem()
22 {
23 string xmlpath = Server.MapPath( " ~\\Config\\ChildSystem.config " );
24 if (!File.Exists(xmlpath)) return ;
25 XmlDocument xmlDoc = new XmlDocument();
26 xmlDoc.Load(xmlpath);
27 var selectSingleNode = xmlDoc.SelectSingleNode( " childsystem " );
28 if (selectSingleNode != null )
29 {
30 XmlNodeList nodelist = selectSingleNode.ChildNodes;
31
32 TreeViewMU.Nodes.Clear();
33
34 foreach ( var VARIABLE in nodelist)
35 {
36 TreeNode node = new TreeNode();
37 XmlAttributeCollection xmlAttributeCollection = ((XmlNode)VARIABLE).Attributes;
38 if (xmlAttributeCollection != null )
39 {
40 node.Text = xmlAttributeCollection[ " value " ].InnerXml;
41 node.Target = xmlAttributeCollection[ " assembly " ].InnerXml;
42 node.Value = xmlAttributeCollection[ " name " ].InnerXml;
43 }
44 TreeViewMU.Nodes.Add(node);
45 }
46 }
47 }
48
49
50 protected void TreeViewMU_SelectedNodeChanged( object sender, EventArgs e)
51 {
52 ChildSystemManager();
53 }
54
55 /// <summary>
56 /// 子系统、子模块的管理
57 /// </summary>
58 private void ChildSystemManager()
59 {
60 string xmlpath = Server.MapPath( " ~\\ " + TreeViewMU.SelectedNode.Value + " \\App.config " );
61
62 if (!File.Exists(xmlpath)) return ;
63 XmlDocument xmlDoc = new XmlDocument();
64 xmlDoc.Load(xmlpath);
65 var selectSingleNode = xmlDoc.SelectNodes( " Pages//page " );
66 if (selectSingleNode != null )
67 {
68 XmlNodeList nodelist = selectSingleNode;
69
70 TreeViewMU.SelectedNode.ChildNodes.Clear();
71
72 foreach ( var VARIABLE in nodelist)
73 {
74 TreeNode node = new TreeNode();
75 XmlAttributeCollection xmlAttributeCollection = ((XmlNode)VARIABLE).Attributes;
76 if (xmlAttributeCollection != null )
77 {
78 node.Text = xmlAttributeCollection[ " value " ].InnerXml;
79 node.Value = xmlAttributeCollection[ " name " ].InnerXml;
80 node.NavigateUrl = xmlAttributeCollection[ " url " ].InnerXml;
81 }
82 TreeViewMU.SelectedNode.ChildNodes.Add(node);
83 }
84 }
85 }
86 }
87 }
每次开发一个新的功能模块,或者子系统,把网页放到一个文件夹中,并在该文件夹中写好App.config文件,然后放到已经部署好的系统根目录下,对一级菜单配置文件稍作修改即可。不用关闭系统,重新发布,重新启动。这对与大型系统是极为重要的,比如金融,电力、水利系统等,关闭一秒钟的损失都是不可估量的。而热部署是解决这类问题的一个很好的例子。
动态修改配置文件的类这里不再赘述,在《 重新演绎动态编译类,打造灵活多变的系统 》中发表过一篇类似的Config配置修改类,可以做参考。
标签: DoNet
作者: Leo_wl
出处: http://HdhCmsTestcnblogs测试数据/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息