zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    css text-transform 属性
    CSS3 @media编写响应式页面
    css :first child与:first-of-type的区别
    前端外语网站合集
    webpack配置自动添加CSS3前缀
    vue中extend/component/mixins/extends的区别
    js缓动函数
    [LeetCode] 78. 子集
    [LeetCode] 76. 最小覆盖子串
    [LeetCode] 75. 颜色分类
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2981212.html
Copyright © 2011-2022 走看看