web动态部署(热部署)

简介: 今天跟大家探讨一下关于web动态部署,也就是热部署的问题。说这个之前,先说一个敏捷开发的原则。 【最小发布、增量开发】 我们在做项目时,设定的期限都特别长。

今天跟大家探讨一下关于web动态部署,也就是热部署的问题。说这个之前,先说一个敏捷开发的原则。


最小发布、增量开发

我们在做项目时,设定的期限都特别长。总是想第一个版本就想把所有想到的问题都做完,以至于项目一再延期。所以我们应该改变我们的开发策略。采用敏捷开发的方式。


这里我想强调的有2点,1.最小发布。2.增量开发


对于最小发布,就是要在第一版中把核心功能实现,即立即发布第一个版本。在实际的开发中,公司为了抢占市场,都会尽可能早的发布一个V1.0的版本。能有效的占领市场,同时对于开发人员来讲,可以减少对项目的排斥情绪。因为项目拖得越久,开发人员就会越疲惫,就会消极怠工,bug数会直线上升。这显然对与开发是极其不利的。


而增量开发,则是没增加一个功能模块,就要发布一个版本。保证在规定的时间内,至少可以让用户使用到新的功能。而且,采用增量开发的技术,也从可以降低模块之间的耦合性。人不可能一口吃成胖子,项目也一样,需要分阶段,分目标的去开发。中国还实行“五年计划”,更何况我们的项目呢。


热部署
热插拔,这个词儿可能只有在硬件中听过,在软件开发中可能没有听过。而热部署,跟热插拔一样,就算没听过,看到这个词儿也能想出个1,2,3来。
不错,热部署就是系统在运行过程中,可以对功能进行可配置,而不用停止或关闭系统。不用我说大家也能想到它的好处吧。
解耦,灵活性自然不必说,最重要的是用户可以按自己的喜好,个性化设置自己的系统,这对于用户来说是非常欢喜的。有这样的系统,没有人会去选择死板一块的系统。而且也同时印证和支持了最小发布和增量开发的方针。增量开发,每开发一个功能,就采用热部署,对系统进行在线升级。


说了这么多废话,还是给了代码看看吧,毕竟实践是检验真理的唯一标准。


热部署,主要用到了xml文件来实现动态效果。菜单用xml文件来存储,系统动态读取xml文件来动态生成菜单。例子菜单分为2级,一级菜单在同一个xml文件中,二级菜单存在放各自对应的文件夹中的xml文件里。

一级菜单存放在Config文件夹下的ChildSystem.config:

<?xml version="1.0" encoding="utf-8"?>
<!--系统中的子系统或子模块。-->
<childsystem>
  <system name="GoodsManager" value="商品管理" assembly="GoodsManager.dll" />
  <system name="UserManager" value="用户管理" assembly="UserManager.dll" />
</childsystem>

商品管理二级菜单 存放在GoodsManager文件夹下的App.config:

<?xml version="1.0" encoding="utf-8"?>
<Pages>
  <page name="socket" value="测试界面" url="~/GoodsManager/Socket.aspx" />
  <page name="config" value="配置页面"  url="~/GoodsManager/Configer.aspx" />
  <main>
    <name>GoodsManager</name>
    <author>longxuan</author>
    <version>1.00</version>
    <assmebly>GoodsManager.dll</assmebly>
  </main>  
</Pages>

用户管理二级菜单存放在UserManager文件夹下的 App.config:

<?xml version="1.0" encoding="utf-8"?>
<Pages>
  <page name ="internet" value="网络时间" url="~/UserManager/InternetTime.aspx" />
  <page name="socket" value="测试界面" url="~/UserManager/Socket.aspx" />
  <page name="config" value="配置页面"  url="~/UserManager/Configer.aspx" />
  <main>
    <name>returnCashStrategy</name>
    <author>longxuan</author>
    <version>1.00</version>

主界面Default.aspx ,拖入一个TreeView控件,name修改为TreeViewMU,添加SelectedNodeChanged事件。后台代码:

using System;
using System.IO;
using System.Web.UI.WebControls;
using System.Xml;

namespace PluginTest
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                ShowChildSystem();
            }
        }

        /// <summary>
        /// 子系统、子模块的显示
        /// </summary>
        private void ShowChildSystem()
        {
            string xmlpath = Server.MapPath("~\\Config\\ChildSystem.config");
            if (!File.Exists(xmlpath)) return;
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(xmlpath);
            var selectSingleNode = xmlDoc.SelectSingleNode("childsystem");
            if (selectSingleNode != null)
            {
                XmlNodeList nodelist = selectSingleNode.ChildNodes;

                TreeViewMU.Nodes.Clear();

                foreach (var VARIABLE in nodelist)
                {
                    TreeNode node = new TreeNode();
                    XmlAttributeCollection xmlAttributeCollection = ((XmlNode)VARIABLE).Attributes;
                    if (xmlAttributeCollection != null)
                    {
                        node.Text = xmlAttributeCollection["value"].InnerXml;
                        node.Target = xmlAttributeCollection["assembly"].InnerXml;
                        node.Value = xmlAttributeCollection["name"].InnerXml;
                    }
                    TreeViewMU.Nodes.Add(node);
                }
            }
        }


        protected void TreeViewMU_SelectedNodeChanged(object sender, EventArgs e)
        {
            ChildSystemManager();
        }

        /// <summary>
        /// 子系统、子模块的管理
        /// </summary>
        private void ChildSystemManager()
        {
            string xmlpath = Server.MapPath("~\\" + TreeViewMU.SelectedNode.Value + "\\App.config");

            if (!File.Exists(xmlpath)) return;
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(xmlpath);
            var selectSingleNode = xmlDoc.SelectNodes("Pages//page");
            if (selectSingleNode != null)
            {
                XmlNodeList nodelist = selectSingleNode;

                TreeViewMU.SelectedNode.ChildNodes.Clear();

                foreach (var VARIABLE in nodelist)
                {
                    TreeNode node = new TreeNode();
                    XmlAttributeCollection xmlAttributeCollection = ((XmlNode)VARIABLE).Attributes;
                    if (xmlAttributeCollection != null)
                    {
                        node.Text = xmlAttributeCollection["value"].InnerXml;
                        node.Value = xmlAttributeCollection["name"].InnerXml;
                        node.NavigateUrl = xmlAttributeCollection["url"].InnerXml;
                    }
                    TreeViewMU.SelectedNode.ChildNodes.Add(node);
                }
            }
        }
    }
}


每次开发一个新的功能模块,或者子系统,把网页放到一个文件夹中,并在该文件夹中写好App.config文件,然后放到已经部署好的系统根目录下,对一级菜单配置文件稍作修改即可。不用关闭系统,重新发布,重新启动。这对与大型系统是极为重要的,比如金融,电力、水利系统等,关闭一秒钟的损失都是不可估量的。而热部署是解决这类问题的一个很好的例子。


动态修改配置文件的类这里不再赘述,在《重新演绎动态编译类,打造灵活多变的系统》中发表过一篇类似的Config配置修改类,可以做参考。


目录
相关文章
|
4月前
|
中间件 Java 应用服务中间件
Windows部署web应用服务器Jboss中间件
如何在Windows系统上部署JBoss 7.1作为Web应用服务器,包括配置环境变量、自动部署WAR包、访问JBoss控制台、设置管理员账户以及修改端口和绑定地址等操作。
134 1
|
4月前
|
负载均衡 应用服务中间件 持续交付
微服务架构下的Web服务器部署
【8月更文第28天】随着互联网应用的不断发展,传统的单体应用架构逐渐显露出其局限性,特别是在可扩展性和维护性方面。为了解决这些问题,微服务架构应运而生。微服务架构通过将应用程序分解成一系列小型、独立的服务来提高系统的灵活性和可维护性。本文将探讨如何在微服务架构中有效部署和管理Web服务器实例,并提供一些实际的代码示例。
133 0
|
29天前
|
机器学习/深度学习 数据采集 Docker
Docker容器化实战:构建并部署一个简单的Web应用
Docker容器化实战:构建并部署一个简单的Web应用
|
2月前
|
监控 Java Maven
springboot学习二:springboot 初创建 web 项目、修改banner、热部署插件、切换运行环境、springboot参数配置,打包项目并测试成功
这篇文章介绍了如何快速创建Spring Boot项目,包括项目的初始化、结构、打包部署、修改启动Banner、热部署、环境切换和参数配置等基础操作。
157 0
|
3月前
|
前端开发 JavaScript
构建你的第一个Web应用:从零到部署
【8月更文挑战第33天】 在这篇文章中,我们将一起踏上构建一个基本Web应用的旅程。不同于传统的“安装这个、运行那个”教程,我们的目标是通过理解每一步的意义和目的来深化你的技术理解。我们将探索HTML、CSS、JavaScript的基础,并学习如何将它们结合起来创建一个简单的个人网站。接着,我们会介绍如何使用GitHub Pages进行免费部署,让你的应用上线。准备好了吗?让我们开始吧!
|
3月前
|
负载均衡 网络协议 应用服务中间件
web群集--rocky9.2源码部署nginx1.24的详细过程
Nginx 是一款由 Igor Sysoev 开发的开源高性能 HTTP 服务器和反向代理服务器,自 2004 年发布以来,以其高效、稳定和灵活的特点迅速成为许多网站和应用的首选。本文详细介绍了 Nginx 的核心概念、工作原理及常见使用场景,涵盖高并发处理、反向代理、负载均衡、低内存占用等特点,并提供了安装配置教程,适合开发者参考学习。
|
4月前
|
JavaScript 搜索推荐 前端开发
从零搭建到部署:Angular与Angular Universal手把手教你实现服务器端渲染(SSR),全面解析及实战指南助你提升Web应用性能与SEO优化效果
【8月更文挑战第31天】服务器端渲染(SSR)是现代Web开发的关键技术,能显著提升SEO效果及首屏加载速度,改善用户体验。Angular Universal作为官方SSR解决方案,允许在服务器端生成静态HTML文件。本文通过具体示例详细介绍如何使用Angular Universal实现SSR,并分享最佳实践。首先需安装Node.js和npm。
101 1
|
4月前
|
Java UED 自然语言处理
Struts 2 国际化竟有如此神奇魔力?快来揭开多语言支持的 Web 应用神秘面纱
【8月更文挑战第31天】在全球化背景下,Web应用需适应多种语言环境。Struts 2凭借其强大的国际化(i18n)支持,简化了多语言应用开发。通过不同语言的资源文件,它能自动匹配用户语言偏好,优化用户体验并扩展用户群。下面是一个示例:创建`messages.properties`(英语)与`messages_zh_CN.properties`(中文),并在Struts 2的Action类及JSP页面中调用`getText()`方法及Struts标签展示相应语言内容。此外,在struts.xml中指定资源文件,以确保框架正确加载对应语言包。通过这些步骤,开发者可以轻松实现应用的多语言支持。
70 0
|
4月前
|
Java 数据库 API
JSF与JPA的史诗级联盟:如何编织数据持久化的华丽织锦,重塑Web应用的荣耀
【8月更文挑战第31天】JavaServer Faces (JSF) 和 Java Persistence API (JPA) 分别是构建Java Web应用的用户界面组件框架和持久化标准。结合使用JSF与JPA,能够打造强大的数据驱动Web应用。首先,通过定义实体类(如`User`)和配置`persistence.xml`来设置JPA环境。然后,在JSF中利用Managed Bean(如`UserBean`)管理业务逻辑,通过`EntityManager`执行数据持久化操作。
61 0
|
4月前
|
Java 开发者 关系型数据库
JSF与AWS的神秘之旅:如何在云端部署JSF应用,让你的Web应用如虎添翼?
【8月更文挑战第31天】在云计算蓬勃发展的今天,AWS已成为企业级应用的首选平台。本文探讨了在AWS上部署JSF(JavaServer Faces)应用的方法,这是一种广泛使用的Java Web框架。通过了解并利用AWS的基础设施与服务,如EC2、RDS 和 S3,开发者能够高效地部署和管理JSF应用。文章还提供了具体的部署步骤示例,并讨论了使用AWS可能遇到的挑战及应对策略,帮助开发者更好地利用AWS的强大功能,提升Web应用开发效率。
73 0