精华内容
下载资源
问答
  • Java应用系统架构演变

    2019-12-16 17:48:44
    系统架构演变 1)单体应用架构 ​ web工程的所有模块(web层,service层,dao层)全部打包放到一个web容器中运行。 ​ 优点: ​ (1)架构简单,开发成本低,周期短,适合小型项目。 ​ 缺点: ​ (1)全部功能...

    系统架构演变

    1)单体应用架构

    ​    web工程的所有模块(web层,service层,dao层)全部打包放到一个web容器中运行。

    ​    优点: 
    ​        (1)架构简单,开发成本低,周期短,适合小型项目。
    ​    缺点: 
    ​        (1)全部功能集成在一个工程中,对于大型项目不利于开发、拓展、维护。
    ​        (2)性能拓展只能通过扩展集群节点,成本高,有瓶颈。
    ​        (3)技术栈受限。

    2)垂直应用架构

    ​    当访问量逐渐增加时,单一应用增加机器带来的加速度越来越小,将应用拆分成互不相干的多个应用,以提升效率。

    ​    优点:
    ​        (1)项目架构简单,开发成本低,周期短,小型项目的首选。
    ​        (2)通过垂直拆分,原先的单体应用不至于不限扩大。
    ​        (3)不同项目可以采用不同的技术。
    ​    缺点:
    ​        (1)全部功能集中到一个工程,对于大型项目不利于开发、拓展、维护。
    ​        (2)性能拓展只能通过拓展集群节点,成本高,有瓶颈。

    3)分布式SOA架构

    ​    SOA(Service-Oriented Architecture),即面向服务架构,通过将核心业务逻辑抽离成通用的服务组件进行分布式部署、组合和
    ​使用,一个服务组件通常以独立形式的进程运行。

    ​    优点:
    ​        (1)抽取公共功能作为通用服务组件,提高开发效率。
    ​        (2)对不同服务进行集群化部署可以缓解系统压力。
    ​        (3)降低系统的耦合度。
    ​    缺点:
    ​        (1)抽取服务的粒度较大
    ​        (2)服务提供方和调用方的接口耦合度较高

    4)微服务架构

    ​    微服务架构是在SOA机构上的一个升华,强调业务的彻底组件化和服务化,对业务系统进行更细粒度的逻辑拆分成多个独立开发运行的小应用。

    ​        优点:
    ​            (1)通过服务的原子化拆分,以及微服务的开发、打包部署,小团队的交付周期缩短,运维成本降低。
    ​            (2)微服务遵循单一原则。微服务之间采用Restful等轻量协议传输。
    ​        缺点: 
    ​            (1)服务过多,服务治理成本高,不利于系统维护。
    ​            (2)分布式开发成本高(容错,分布式事务等)。

    SOA架构和微服务的区别:

    功能 SOA   微服务
    组件大小 大块业务逻辑 单独任务或小块业务逻辑
    耦合   通常松耦合 总是松耦合
    公司架构 任何类型    小型、专注于功能交叉团队
    管理 着重中央管理 着重分散管理
    目标 确保应用能够交互操作 执行新功能、快速拓展开发团队

                                   
                         
                           
                       
                             
                


     

    展开全文
  • 引言系统日志是应用程序问题诊断及运行维护的重要工具。Logback、Log4j 是常用于 Java 平台的日志记录 API. 目前大部分产品只是将系统重要参数、状态的变化及异常信息通过日志输出。本文将要介绍的 Perf4j 是一款...

    74545122_1.png

    在 IBM Bluemix 云平台上开发并部署您的下一个应用。

    引言

    系统日志是应用程序问题诊断及运行维护的重要工具。Logback、Log4j 是常用于 Java 平台的日志记录 API. 目前大部分产品只是将系统重要参数、状态的变化及异常信息通过日志输出。本文将要介绍的 Perf4j 是一款专门用于 Java 服务器端代码计时、记录日志和监控结果的开源工具包。Perf4j 对常用日志工具包进行了扩展,能够将得到的原始性能数据进行统计并发布到可定制的输出源,如控制台、日志文件、JMX 等。Perf4j 提供了多种方式与 Java 代码集成,开发和系统维人员能够灵活地将 Perf4j 的 API 嵌入到各种不同架构的应用程序中。

    Perf4j 目前依托于开源项目协作平台 Codehaus 进行文档及代码管理,下一步该项目计划迁移到 Github 平台,以便更多的社区及开发人员可以参与到开发及维护中来。Perf4j 欢迎使用者提出新的功能需求并且鼓励将定制或扩展的代码贡献到 Perf4j 源码中。本文中示例代码使用的 Perf4j 版本是 0.9.16,读者需在下载类包或配置 Maven 时留意。

    阅读文章之前,您要对 Java 注解、JMX、面向方面编程有一些了解。特别是 JConsole 的使用及 Spring AOP 的配置方式要较为熟悉。

    文章首先阐明在何种应用场景下应优先考虑使用 Perf4j。然后是具体讲解 Pef4j 与应用程序的集成方式。最后会介绍如何将收集的数据生成便于分析的可视化图表。

    应用场景

    在 Java 平台上遇到性能问题时,如 CPU 占用过高、系统响应缓慢,通常的分析方法是使用 JVM 剖析工具在系统瓶颈临界点前一段时间抓取 CPU 占用分布,再对 CPU 占用率最高的几个方法排查。Perf4j 的优势在于能够持续跟踪统计所关注功能代码的执行效率,对于前后两个版本出现较大差异的方法进行深入分析,可以在开发周期中尽早发现问题。Perf4j 还可以用在产品环境中,从运营的早期开始,将其统计的数据做为系统的性能和健康指标长期监测。

    首选 Perf4j 的应用场景:Java 本地代码调用(JNI)

    分布式系统、集群部署

    面向服务体系结构(SOA)

    远程方法调用(RMI)

    开发人员必须将本地方法、远程方法及 Web services 的性能问题隔离出来,以防干扰对 Java 应用程序本身的分析。通过日志记录则是最简单的方式;采用分布式架构或集群部署的系统相对复杂,不同的网络环境、基础硬件和操作系统的差异、虚拟主机中资源与配置的差异等造成很难采用统一的工具来监测代码级别的性能指标。而日志记录则可以轻松加入到各种程序中,且是资源与时间成本最低的方式。Perf4j 提供了 CSV 格式的转换工具,开发人员可以借助第三方工具方便地将统计结果汇总分析。

    集成到应用程序

    下面将分两种方式具体讲述如何利用 Per4j 提供的 API。在实际的项目中,应根据现有的程序框架及监测目的灵活选择。另外,针对 WebSphere 应用服务器的自有日志系统,还必须采取额外的措施来确保 Perf4j 的正常工作。

    对代码段计时

    Perf4j 中 org.perf4j.StopWatch 是整个 API 中的基础工具。这是一个封装良好的计时器。可以把 StopWatch 嵌入到代码中任何地方。这种方式往往使得复杂的方法得到分解,从而有利于精确定位问题的根源。以下通过清单 1 和清单 2 来介绍其具体用法。

    清单 1.StopWacth 基本用法

    public static void basicStopWatch() throws InterruptedException{

    // 创建 StopWacth 时开始计时,之后也可以用 stopWatch.start() 重新设定计时开始时间点

    StopWatch stopWatch = new StopWatch("TransactionA");

    // 执行需要计时的代码

    Thread.sleep(2 * 1000L);

    String result = stopWatch.stop();

    System.out.print(result);

    }

    清单 1 中最后输出的结果示例:start[1340442785756] time[1995] tag[TransactionA]。在构造函数中设定 tag[TransactionA] 用来区分不同的业务逻辑,可以把它看成是性能分析中的事务(Transaction)。

    如果需要将多段代码分开统计,可采用 LoggingStopWatch 类的 lap() 方法定义多个事务。

    清单 2.LoggingStopWatch 用法

    public static void loggingStopWacth() throws InterruptedException{

    LoggingStopWatch stopWatch = new LoggingStopWatch();

    // 设定阈值,小于此阈值的结果将不会被记录下来

    stopWatch.setTimeThreshold(1*1000L);

    Thread.sleep(2 * 1000L);

    // 停止当前计时,开始新的起始时间点

    stopWatch.lap("TransactionB");

    Thread.sleep(500L);

    stopWatch.stop("TransactionC");

    }

    清单 2 中使用了 LoggingStopWatch 类,其 stop() 方法只是将执行时间数据通过 System.err.println() 输出。若与 Log4j 框架集成,则需要使用 LoggingStopWatch 的子类 Log4JStopWatch, 目前 Perf4j 还支持 Apache Commons Logging、java.util.logginLogback,对应使用 CommonsLogStopWatch、 JavaLogStopWatch、Slf4JStopWatch。

    以 Log4j 为例,在 Log4j.xml 中要为 Log4JStopWatch 加入异步输出源 AsyncCoalescingStatisticsAppender。尽量使专用于 Perf4JAppender 的 fileAppender,从而保证记录的性能数据输出到独立的日志文件中。

    清单 3.Log4j 配置文件

    class="org.perf4j.log4j.AsyncCoalescingStatisticsAppender">

    清单 3 中设置了 TimeSlice 为 10 秒, Perf4jAppender 则以 10 秒为采样间隔,统计后按时间分组输出。清单 4 中是一个采样单位的数据。

    清单 4. 日志输出数据示例

    Performance Statistics 2012-07-02 21:45:30 - 2012-07-02 21:45:40

    Tag Avg(ms) Min Max Std Dev Count

    LogicalBlock1 1997.0 1997 1997 0.0 1

    LogicalBlock2 499.0 499 499 0.0 1

    对方法计时

    若要避免 Perf4j 与系统的紧耦合,不在程序中加入额外的第三方代码,还可以借助面向方面编程(AOP),通过简单的配置在运行中动态地对指定的方法计时。Perf4j 对常用的 AOP 工具如 AspectJ 及 Spring AOP 均提供了良好支持 . 在此主要介绍下 Per4j 与后者集成的配置方式。

    首先确保工程中已有如图 1 中的 Jar 包:

    图 1. 必需引入的 Lib

    74545122_2.jpg

    其次在 Spring 的配置文件(一般是 applicationContext.xml 或 spring-config.xml)中加入 及申明 org.perf4j.log4j.aop.TimingAspect 做为 。具体配置参考清单 5:

    清单 5.Spring AOP 申明

    expression="execution(* cn.test.perf4j.example..*.*(..)) and @annotation(profiled)"/>

    其中切入点 的表达式(expression)中包的作用域可以按实际需求进行修;@annotation(profiled) 会把 @org.perf4j.aop.Profiled 做为参数传给 TimingAspect,在此则不能删除此条件。当然还可以采用 替换 复杂的配置,在 org.perf4j.log4j.aop.TimingAspect 的父类 ProfiledTimingAspect 中已用注解定义过全局的切入点。 具有更大的灵活性,可以任意设置监测的范围,建议产品环境使用。

    运行时如果遇到如下异常:

    “The matching wildcard is strict, but no declaration can be found for element 'aop:config'”

    说明之前没有设置过 AOP 的命名空间,在 xsi:schemaLocation 最后加相对应版本的 URI 即可。

    清单 6. 加入 spring-aop-x.x.xsd 的 URI

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:context="http://www.springframework.org/schema/context"

    xmlns:aop="http://www.springframework.org/schema/aop"

    xsi:schemaLocation="http://www.springframework.org/schema/beans

    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

    http://www.springframework.org/schema/context

    http://www.springframework.org/schema/context/spring-context-2.5.xsd

    http://www.springframework.org/schema/aop

    http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

    现在如果要记录包 cn.test.perf4j.example 下某些方法的执行时间,只需在方法签名加上注解 @Profiled。org.perf4j.aop.Profiled 也提供了细颗粒度的定制。具体属性设置方法如下 :

    清单 7. 注解 Profiled 设置

    /** 1. 默认以方法名做标记 tag 的名称 */

    @Profiled

    public void doService(){...}

    /** 2. 自定义标记 tag 的名称并设定阈值 */

    @Profiled(tag=”doTimedService”,timeThreshold =500L )

    public void doService(){...}

    其它支持的属性还有:

    boolean el : tag 和 message 的设置是否支持 Java EL 表达式语法;

    String level : 设定日志级别;

    boolean logFailuresSeparately : 若为真,正常和异常抛出的执行时间数据将分开统计;

    Sring logger : log4.xml 中设置的 logger 名称。如果是默认值,则此属性可省去。

    在产品环境中,不方便重新编译代码,建议使用 ScopedTimingAspect,完全通过配置文件控制监测的范围,不用在方法上加 Profiled 注解。具体用法可以参考 AspectJ 的用法。另外如果系统已采用 EJB3,可以把 org.perf4j.log4j.aop.EjbTimingAspect 做为拦截器加入。具体可以参考有关 EJB3@Interceptors 的用法。

    在 WebSphere 应用服务器中使用 Perf4j

    WebSphere 应用服务器默认使用基于 JDK 中 java.util.logging 的日志 API 并且集中管理了整个系统的日志输出。Perf4j 必须单独生成自己的数据文件,以便于分析。如果应用程序要部署到 WebSphere 应用服务器中,如下方法能够帮助我们将 Perf4j 记录的日志独立出来。

    1. 指定 LogFactory 实现类:

    在 /META-INF/services 目录中创建名为 org.apache.commons.logging.LogFactory 的文件,在文件中分别设定相对 Log4j 的配置,内容为 org.apache.commons.logging.impl.Log4j;还有一种方式是在 classpath 下创建 commons-logging.properties 文件,文件内容为:

    priority=1

    org.apache.commons.logging.LogFactory=org.apache.commons.logging.impl.LogFactoryImpl

    org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger

    2. 在 Admin 控制台中,选择 Applications > Enterprise Applications > ''app name'' ,设定 ClassLoader 的模式为 PARENT_LAST。

    3. 将之前配置的 log4j.xml 同样放在 classpath 下。在 log4j.xml 中只须设定 Perf4jAppender。程序其它调用 java.util.logging 的日志仍由 WebSphere 统一控制。

    生成可视化数据

    目前我们已经可以得到 Perf4j 生成的原始数据,不过为了易于分析这些数据,方便直观地将统计结果展现出来才是我们最终需要的。这里介绍的两种方式均是利用 Perf4j 提供的特定 Appender 来发布数据到相应可视化工具。

    通过 Java 管理扩展接口发布

    Java 管理扩展接口(JMX)常用来监控 JVM 的运行状态以及动态管理配置系统。

    通过 JmxAttributeStatisticsAppender 能将数据封装成标准的 JMX 管理构件的 MBean。配置见清单 8。

    清单 8. 添加 JMX Appender

    class="org.perf4j.log4j. AsyncCoalescingStatisticsAppender">

    class="org.perf4j.log4j.JmxAttributeStatisticsAppender">

    JConsole 是 Oracle JDK 自带的的 JMX 监控工具,当然也有很多第三方 JMX 工具可供选择。图 2 是 JConsole 界面的截图,显示了 Perf4j MBean 具体内容及图表。

    图 2.JConsole 实时显示 Perf4j MBean

    74545122_3.jpg

    通过 GraphingServlet 生成统计图

    这种方式需要用到 AsyncCoalescingStatisticsAppender,通过其记录的是每个时间片各事务的执行时间统计信息,在此还要加上 GraphingStatisticsAppender,将指定的监测指标数据单独抽出,再由 Perf4j 的 GraphingServlet 展现在页面上。一般可做为子页面加入到系统管理界面中。清单 9 中只是加入了一个用于生成平均执行时间图示的 Appender 做为示例,当然 Perf4j 也允许加入多个 GraphingStatisticsAppender 以同时显示不同指标的数据。

    清单 9. 加入生成可视化数据的 Appender

    class="org.perf4j.log4j. AsyncCoalescingStatisticsAppender">

    class="org.perf4j.log4j.GraphingStatisticsAppender">

    在 GraphType 中可以设定的性能指标有平均执行时间(Mean)、最长执行时间(Max)、最短执行时间(Min)、执行时间标准差(StdDev)、执行次数(Count)和 每秒事务处理量(TPS)。TagNamesToGraph 是可选项,用来指定需要输出的事务,如果不设定则会输出全部事务。

    同时在 web.xml 中还要加入 GraphingServlet 的映射。如清单 10。

    清单 10. 在 web.xml 中配置 GraphingServlet

    perf4jMonitor

    org.perf4j.log4j.servlet.GraphingServlet

    graphNames

    meanExecutionTime,executionTPS

    perf4jMonitor

    /perf4jMonitor

    至此在系统的运行过程中,访问 /perf4jMonitor 就可以实时的观测指定事务的性能数据图示。

    总结

    本文介绍了配置与使用 Perf4j 的诸多细节。在实际项目中,我们还应该设计一个易扩展的体系结构,使第三方 API 能轻易加入。如果只是用 Perf4j 协助发现性能问题的源头,开发人员可采用临时代码中嵌入 StopWatch 类的方式。若是计划长期对系统性能跟踪,应设计一个完善的日志框架集成方案,能够轻易地将 Perf4j 无缝的加入和脱离尤为重要。

    尽管 Perf4j 中使用的是异步的输出源,在大量用户并发的性能测试和产品环境下,额外的 CPU 内存占用也是不容忽视的。因此务必确保 Perf4j 只用于对性能跟踪及瓶颈分析,而不要用于对系统负载能力的评估。

    展开全文
  • 经常开发java web应用程序的朋友一定对有对程序打包,维护的经验,我们提高软件的维护性一般可以从分离易变和不变的内容,重构软件的结构来实现,重构包括对代码级别的,也包括对应用程序目录文件的重构,以下我就...

    经常开发java web应用程序的朋友一定对有对程序打包,维护的经验,我们提高软件的维护性一般可以从分离易变和不变的内容,重构软件的结构来实现,重构包括对代码级别的,也包括对应用程序目录文件的重构,以下我就简单谈谈我的一次经历。

    我们一个系统是java web应用程序,不过该系统所有的class文件、jsp、js、css、image文件和系统动态上传的doc、xls、image、wmv等文件放在同一个工程目录中。具体目录结构如下:

    应用程序配置的上下文根目录是/myapp

    myapp/WEB-INF/

    myapp/admin/

    myapp/images/

    myapp/style/

    myapp/files/

    myapp/videos/

    ......

    1、存在的问题       实际上,files、videos文件夹,会在系统运行中随着用户上传发布新内容经常更新变化,而其他的部分都是在系统需求变更发布版本时才变化,这2种变化不同,前者是系统正常使用的结果,后者是系统变更的结果,根据变化与不变化分开的原则,我们希望把这2类文件夹分开存放。

    由于我们发布web应用程序包(myapp.war)需要把应用程序上下文根目录myapp中的所有文件夹都包括进来,所以必须把经常变化的files和videos文件夹移出去。

    2、解决方法探索       我们知道,servlet中有两种转向的方法,一个是request.getRequestDispatcher(requestPath).forward(request,

    response),它不改变url地址,直接转发请求到一个jsp页面,一个是resonse.sendRedirect(urlPath),它改版url地址,跳转到另外一个请求。 不过其两者都没法访问servlet所在web应用程序上下文(myapp)之外的目录,而我们myapp内的全部文件夹都需要打包成myapp.war,这样就有个矛盾。

    另外的方法,还有通过java.io.File使用流的方式读一个文件,然后再使用servlet的response的out对象写出来传送到页面,这样的方法可以访问到该web容器(如tomcat)所在操作系统的用户根目录(如windows的D:/或linux的/usr*等等),这样我们就可以把files等文件夹移动到myapp之外。比如tomcat的应用程序上下文根目录是/usr/tomcat/webapps/,我们让files不在myapp中,而是放到/usr/upload/files中,这样我们打包myapp.war的时候,就只装载版本变化的最新版程序,用户上传文件都不变仍然放在files中,访问时使用File()来进行。如:

    File f = new File("/usr/upload/files/2010/3/15/010001.doc")

    使用FileInputStream来读这个文件,然后使用response中的outstream来写这个文件流到页面。

    这其中存在的问题是读入的文件需要占用JVM的heap空间,如果文件有500MB大,那么一般的默认JVM heap空间都是不够的,需要在启动JVM的时候设置参数,使之足够容纳这个文件,当然文件的读写都要使用JVM来调度,显然效率会比较低,比直接读取要慢很多。

    3、方法的改进

    有没有办法,既能让files文件夹在myapp之外,又不用File类来读文件数据流呢? 在linux中可以使用目录的快捷方式来解决,实际上就是文件的软连接功能。

    大家都知道,在linux中文件和文件夹是同样的数据实体,可以用同样的方法来做连接,在另外一个地方操作某个文件或目录的连接,就达到了直接操作这个文件或目录的作用。

    首先,建立软连接的方式是:

    ln -s sourcePath destinationPath

    把files文件夹放在myapp之外,并且在webapps中的某一个应用程序中,比如ROOT中建立一个files文件夹的软连接,如:

    ln -s /usr/upload /usr/tomcat/webapps/ROOT/upload

    并且在ROOT的tomcat容器context中设定一个属性 allowLinking="true" ,即可访问

    这样,我们可以在myapp应用程序中,通过直接url调用,或者response的重定向方式,访问到files中的文件,如:

    http://localhost:8080/upload/files/2010/3/15/010001.doc

    这样一来,访问upload快捷方式就等于是访问了upload文件夹,既没有访问外在资源没有权限限制,又没有使用File类读写数据流,不会有heap空间的限制,我们实现了易变数据文件的分离,并且没有内存的消耗。读写500MB的文件,不需要把heap空间设置到500以上,只需要默认的64就可以了。

    总结一下,利用操作系统的特性——软连接,实现了数据文件从应用程序包中的分离,操作系统实现目录文件访问的跳转,利用了文件I节点的修改,这属于操作系统底层实现,比起利用JVM的应用层类File来实现读写要快10倍以上,节约JVM Runtime空间。

    4、总结       我为了让web应用程序易于维护,把版本发布的程序代码和用户上传的数据文件分离,经过了对servlet重定向方法的思考和试验,对File类文件流方法的试验,对linux文件软连接的方法试验,最好决定使用最后一种,同时解决了文件维护性和运行效率的问题。

    展开全文
  • 动态应用,是相对于网站静态内容而言,是指以c/c++、php、Java、perl、.net等服务器端语言开发的网络应用软件...大型网站的运行需要一个可靠、安全、可扩展、易维护应用系统平台做为支撑,以保证网站应用的平稳运...

    动态应用,是相对于网站静态内容而言,是指以c/c++、php、Java、perl、.net等服务器端语言开发的网络应用软件,比如论坛、网络相册、交友、BLOG等常见应用。动态应用系统通常与数据库系统、缓存系统、分布式存储系统等密不可分。

    大型动态应用系统平台主要是针对于大流量、高并发网站建立的底层系统架构。大型网站的运行需要一个可靠、安全、可扩展、易维护的应用系统平台做为支撑,以保证网站应用的平稳运行。

    大型动态应用系统又可分为几个子系统:

    1)Web前端系统

    2)负载均衡系统

    3)数据库集群系统

    4)缓存系统

    5)分布式存储系统

    6)分布式服务器管理系统

    7)代码分发系统

    Web前端系统

    结构图:

    bd986217667d0d36a3698ee773fa8784.png

    为了达到不同应用的服务器共享、避免单点故障、集中管理、统一配置等目的,不以应用划分服务器,而是将所有服务器做统一使用,每台服务器都可以对多个应用提供服务,当某些应用访问量升高时,通过增加服务器节点达到整个服务器集群的性能提高,同时使他应用也会受益。该Web前端系统基于Apache/Lighttpd/Eginx等的虚拟主机平台,提供PHP程序运行环境。服务器对开发人员是透明的,不需要开发人员介入服务器管理

    负载均衡系统

    70ff352890f7b00ced09ce416570f6e7.png

    负载均衡系统分为硬件和软件两种。硬件负载均衡效率高,但是价格贵,比如F5等。软件负载均衡系统价格较低或者免费,效率较硬件负载均衡系统低,不过对于流量一般或稍大些网站来讲也足够使用,比如lvs, nginx。大多数网站都是硬件、软件负载均衡系统并用。

    数据库集群系统

    结构图:

    a938602e8feb7f73461ab636f8858643.png

    由于Web前端采用了负载均衡集群结构提高了服务的有效性和扩展性,因此数据库必须也是高可靠的,才能保证整个服务体系的高可靠性,如何构建一个高可靠的、可以提供大规模并发处理的数据库体系?

    我们可以采用如上图所示的方案:

    1) 使用 MySQL 数据库,考虑到Web应用的数据库读多写少的特点,我们主要对读数据库做了优化,提供专用的读数据库和写数据库,在应用程序中实现读操作和写操作分别访问不同的数据库。

    2) 使用 MySQL Replication 机制实现快速将主库(写库)的数据库复制到从库(读库)。一个主库对应多个从库,主库数据实时同步到从库。

    3) 写数据库有多台,每台都可以提供多个应用共同使用,这样可以解决写库的性能瓶颈问题和单点故障问题。

    4) 读数据库有多台,通过负载均衡设备实现负载均衡,从而达到读数据库的高性能、高可靠和高可扩展性。

    5) 数据库服务器和应用服务器分离。

    6) 从数据库使用BigIP做负载均衡。

    缓存系统

    77b3c9db0e3cd6f90a589ca630a73936.png

    缓存分为文件缓存、内存缓存、数据库缓存。在大型Web应用中使用最多且效率最高的是内存缓存。最常用的内存缓存工具是Memcached。使用正确的缓存系统可以达到实现以下目标:

    1、使用缓存系统可以提高访问效率,提高服务器吞吐能力,改善用户体验。

    2、减轻对数据库及存储集服务器的访问压力。

    3、Memcached服务器有多台,避免单点故障,提供高可靠性和可扩展性,提高性能。

    分布式存储系统

    结构图:

    a99d5d4aa317bda9c3171ffab82d9c2d.png

    Web系统平台中的存储需求有下面两个特点:

    1) 存储量很大,经常会达到单台服务器无法提供的规模,比如相册、视频等应用。因此需要专业的大规模存储系统。

    2) 负载均衡cluster中的每个节点都有可能访问任何一个数据对象,每个节点对数据的处理也能被其他节点共享,因此这些节点要操作的数据从逻辑上看只能是一个整体,不是各自独立的数据资源。

    因此高性能的分布式存储系统对于大型网站应用来说是非常重要的一环。(这个地方需要加入对某个分布式存储系统的简单介绍。)

    分布式服务器管理系统

    结构图:

    278482776368b6b84a04c6b09dede7cb.png

    随着网站访问流量的不断增加,大多的网络服务都是以负载均衡集群的方式对外提供服务,随之集群规模的扩大,原来基于单机的服务器管理模式已经不能够满足我们的需求,新的需求必须能够集中式的、分组的、批量的、自动化的对服务器进行管理,能够批量化的执行计划任务。

    在分布式服务器管理系统软件中有一些比较优秀的软件,其中比较理想的一个是Cfengine。它可以对服务器进行分组,不同的分组可以分别定制系统配置文件、计划任务等配置。它是基于C/S 结构的,所有的服务器配置和管理脚本程序都保存在Cfengine Server上,而被管理的服务器运行着 Cfengine Client 程序,Cfengine Client通过SSL加密的连接定期的向服务器端发送请求以获取最新的配置文件和管理命令、脚本程序、补丁安装等任务。

    有了Cfengine这种集中式的服务器管理工具,我们就可以高效的实现大规模的服务器集群管理,被管理服务器和 Cfengine Server 可以分布在任何位置,只要网络可以连通就能实现快速自动化的管理。

    代码发布系统

    结构图:

    f1ebc25f575d9c2e0c292ee43122e46d.png

    随着网站访问流量的不断增加,大多的网络服务都是以负载均衡集群的方式对外提供服务,随之集群规模的扩大,为了满足集群环境下程序代码的批量分发和更新,我们还需要一个程序代码发布系统。

    这个发布系统可以帮我们实现下面的目标:

    1) 生产环境的服务器以虚拟主机方式提供服务,不需要开发人员介入维护和直接操作,提供发布系统可以实现不需要登陆服务器就能把程序分发到目标服务器。

    2) 我们要实现内部开发、内部测试、生产环境测试、生产环境发布的4个开发阶段的管理,发布系统可以介入各个阶段的代码发布。

    3) 我们需要实现源代码管理和版本控制,SVN可以实现该需求。

    这里面可以使用常用的工具Rsync,通过开发相应的脚本工具实现服务器集群间代码同步分发。

    展开全文
  • 然而日志系统是一个成熟Java应用所必不可少的,在开发和调试阶段,日志可以帮助我们更好更快地定位bug;在运行维护阶段,日志系统又可以帮我们记录大部分的异常信息,从而帮助我们更好的完善系统。本文要来分享一些...
  • 我们已经实现了博客系统的一些基本功能,但是,很明显,我们的代码依然存在很多的问题,有很多的相似代码,有些逻辑是通用的,但是写在了各个Controller中,每个Controller都有一大坨代码,不利于维护等等。...
  • 项目一 用户登录程序任务一...编制教师基本情况维护模块任务三 编制课程基本情况维护模块任务四 编制班级基本情况维护模块任务五 表格及表格模型任务六 编制学生基本情况维护模块任务七 编制班级选课模块任务八 编制...
  • jsp+javabean的模式,没有很好的分层啊,系统的结构不清晰,很多功能都揉杂在一块儿,很多将模块明确的划分给不同的开发人员,以后也很难维护,移植等等. 2、应该说选择java做的系统主要都是j2ee. 基于b/s的居多. 3、...
  • 项目中有一个java应用程序,交付后用户要求要把这个程序做成后台服务程序,即:系统启动后该程序可以自动启动,并且在前台不要出现运行窗口,维护人员只要在“服务管理”(Windows)中选择启动或停止即可. 解决办法...
  • 这取决于应用程序....我不建议这样做,因为它是一种不专业的,需要你为每个要运行程序的操作系统维护一个shell脚本.Jar files用于打包库,但您也可以在其中显示一个清单文件,它说:“当有人双击/执行此操作时...
  • 一个应用系统要与支付对接,要与短信平台对接,要与其他业务系统对接,甚至于qq、微博、微信等平台对接。与每一个系统对接,我们就得根据相应平台提供的SDK进行开发。相信大家都明白,如果这么搞,那么后期维护起来...
  • 这取决于应用程序....我不建议这样做,因为它是一种不专业的,需要你为每个要运行程序的操作系统维护一个shell脚本.Jar files用于打包库,但您也可以在其中显示一个清单文件,它说:“当有人双击/执行此操作时...
  • java高级应用

    2018-04-26 00:06:39
    java高级应用:线程池全面解析 什么是线程池?很简单,简单看名字就知道是装有线程的池子,我们可以把要执行的多线程交给线程池来处理,和连接池的概念一样,通过维护一定数量的线程池来达到多个线程的复用。线程池...
  • 很简单,简单看名字就知道是装有线程的池子,我们可以把要执行的多线程交给线程池来处理,和连接池的概念一样,通过维护一定数量的线程池来达到多个线程的复用。线程池的好处我们知道不用线程池的话,每个线程都要...
  • 针对JVM的CPU使用及内存占用的性能分析,已经有各种剖析...本文将介绍如何集成Perf4j到Java应用程序中并生成性能数据。系统日志是应用程序问题诊断及运行维护的重要工具。Logback、Log4j是常用于Java平台的日志记录API.
  • 应用系统维护过程中,应用程序运行时所记录的日志对维护工作起着至关重要的作用,应用日志常常可以让我们方便快速的定位到故障或BUG的所在。就JAVA应用开发而言,目前的流行的日志解决方案有LOG4J、LOG4J+JCL、...
  • 在本文中,您将学习如何使用Java平台的独特帮助系统API来构建标准的,功能齐全的,易于使用的系统,以向Java应用程序用户提供在线信息。 此内容不再被更新或维护。 全文以PDF格式“按原样”提供。 随着技术的飞速...
  • [导读]项目中有一个java应用程序,交付后用户要求要把这个程序做成后台服务程序,即:系统启动后该程序可以自动启动,并且在前台不要出现运行窗口,维护人员只要在“服务管理”(Windows)中选择启动或停止即可。...
  • 动态应用,是相对于网站静态内容而言,是指以c/c++、php、Java、perl、.net等服务器端语言开发的网络应用软件...大型网站的运行需要一个可靠、安全、可扩展、易维护应用系统平台做为支撑,以保证网站应用的平稳运...
  • 项目中有一个java应用程序,交付后用户要求要把这个程序做成后台服务程序,即:系统启动后该程序可以自动启动,并且在前台不要出现运行窗口,维护人员只要在“服务管理”(Windows)中选择启动或停止即可. 解决办法...
  • (4)系统管理员模块:登录、用户管理(增删改查,包括批量导入)、角色管理(增删改查)、权限管理(增删改查),打印用户借阅证; 移动端功能如下: (1)读者移动端:登录、图书查询、个人信息查看和维护; (2)...
  • 简介:当今的许多 Java ...但是,您可以创建并维护一个全面的系统来监控应用程序的整个生态系统,从而显著降低这些事件的严重性和持续时间。本系列文章给出了实现此类系统的一些模式和技巧。模式,以及我将使用的一...
  • YMP是一个非常简单、易用的一套轻量级JAVA应用开发框架,设计原则主要侧重于简化工作任务、规范开发流程、提高开发效率,让开发工作像搭积木一样轻松是我们一直不懈努力的目标!主要技术特点:采用组件化、模块化...
  •  分布式系统往往是把应用拆分成多个应用,每个团队维护一个应用应用应用通过远程过程调用或者消息中间件通信。这种系统的优点是能够做到高内聚低耦合,可以支撑业务的快速发展,缺点则是运维成本大大提高了,...
  • java财务系统源代码

    热门讨论 2011-11-27 20:07:56
    前后台架构: 1、java语言(jdk1.5)、struts1.2.9、hibernate3.2.6.ga、spring2.0.8 2、前台:主要使用了轻量级的ajax开发框架jQuery,使用jQuery很轻松的降低了服务器压力提高了用户体验并且代码容易维护,尤其是...
  • 很简单,简单看名字就知道是装有线程的池子,我们可以把要执行的多线程交给线程池来处理,和连接池的概念一样,通过维护一定数量的线程池来达到多个线程的复用。线程池的好处我们知道不用线程池的话,每个线程都要...
  • 美国空军司令部运营与维护系统小组是全面执行Java技术应用中心(JCOE)项目的第一个美国国防机构。JCOE项目的设计初衷就是为美国空军这样的机构的Java技术应用开发提供有效的、成功的方法。由于认识到Java技术是开发和...
  • Java WEB应用开发

    2015-03-24 23:42:00
    运行和维护 原型法开发模式 面向组件(Component)的开发模式 OOP模式 面向服务模式(SOA) Java与XML的关系  java实现了代码的平台无关性,而XML实现了数据的平台无关性。 JS...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,301
精华内容 920
关键字:

java应用系统维护

java 订阅