精华内容
下载资源
问答
  • java软件架构设计方案.pdf
  • 基于Java技术的大型网站架构设计方案 笑游江湖 发表于 2014-03-16 16:56:00 | 分类标签: 网站架构 JAVA 高并发 1、Web层 主体架构可以基于 Struts 1.X/2.X,当然有很多更好的控制层框架供选择,以快速敏捷为...
    • 架构设计漫长路
      最佳实践我来数
      千万并发没问题
      要点首推数据库

      SQL语句要优化
      索引创建有艺术
      三大范式不可废
      冗余字段难维护

      查询过多怎么办
      缓存使用是本固
      频繁访问不用怕
      每秒数千扛得住 

      更新插入可延迟
      消息队列来辅助
      满天消息不乱飞
      定向收集捋清楚

      Java代码执行快
      阻塞瓶颈是同步
      降低同步锁优化
      请求处理畅无阻

      以上全部做到后
      还需WebServer来分布
      Nginx好选择
      多台Server同服务

      神马框架皆浮云
      分层设计是目标
      各司其职降耦合
      海量并发齐用武



    • 1、Web层
    • 主体架构可以基于 Struts 1.X/2.X,当然有很多更好的控制层框架供选择,以快速敏捷为准则吧。 
      抽象出核心库封装 控制器和中间层的操作。 
      在大规模集群环境下,session复制会引起严重的性能问题。考虑用 集群缓存 + cookie验证 代替session实现权限控制吧。


      2、Cache层
      配置 Memcache 组成集群缓存 
      对 Memcache 客户端进行封装 
      Memcached 节点组成池,调用示意:opList (BizName, 策略 ...)

      3、中间层
      “中间层”可以理解为基于应用和数据之间的层次。它被设计用来为Web应用提供:数据缓存 和 对应用透明的数据访问——即应用不需要考虑数据表拆分的问题。以服务的方式提供对存储层的高性能调用以及分布式计算。可供选择的框架:ICE 、Hadoop 直接基于Memcache开发(减少复杂度,推荐)


      4、存储
      推荐MySQL,理由:免费,经过实践检验,有大量成熟的案例、解决方案、技术支持。
      小规模:一个 data table 维护存储服务器阵列,内容 -> mount …… 
      大规模:Master-Slave模式+MySQL Proxy,实现数据库读写分离。在中间层的包装下,可做如下扩展,以支持更大规模的数据存取: 
      数据库/表水平拆分,例 User -> User33% + User33% + User34% 
      数据库/表垂直拆分,例 User -> UserBaseInfo + UserAddrInfo 
      也可考虑使用 LongStore (龙存) 解决方案,由龙存管理存储阵列……


      5、部署
      划分子域名,每个子域名一个Web应用包,互不干扰 
      静态资源(css, js, image ...)使用专门的静态服务器


      6、负载均衡
      小规模:DNS轮询。
      大规模:F5, 2*X 台F5服务器,F5是L4/L7层交换机,每台至少可处理200万连接(与服务器内存有关)。
      Ngnix是L7层交换,LVS负载均衡也是一种方案


      7、Web中间件选择
      Tomcat - 最高400并发 
      Apache - 最高2000并发 
      Ngnix - 优于Apache 
      采用方案:Ngnix + Resin ,理由:
      Resin提供更为快速的servlet引擎 - 选择Resin。 
      gzip问题 - Resin在单独处理gzip时存在内存溢出的隐患,因此要加一层 Ngnix。 
      Ngnix 能减少单独使用Resin时的内存占用 - Resin建立1000个连接使用1000个线程;加Ngnix后,透过其“异步连接”、“建立长连接”机制使Resin内存压力大大减小。 
      Ngnix 针对Linux系统有性能优化措施 - 0 Copy, send file ... 
      因此采用:1 Ngnix + 1 Resin,一对一。
      静态服务器采用:Squid + Apache, why? because Squid has cache ability ...


      新变化 - Nginx从0.7.48版本开始,支持了类似Squid的缓存功能。这个缓存是把URL及相关组合当作Key,用md5编码哈希后保存在硬盘上,所以它可以支持任意URL链接,同时也支持 404/301/302 这样的非200状态码。虽然目前官方的Nginx Web缓存服务只能为指定URL或状态码设置过期时间,不支持类似Squid的PURGE指令,手动清除指定缓存页面,但是,通过一个第三方的Nginx 模块,可以清除指定URL的缓存。


      Nginx的Web缓存服务主要由proxy_cache相关指令集和fastcgi_cache相关指令集构成,前者用于反向代理时,对后端内容源服务器进行缓存,后者主要用于对FastCGI的动态程序进行缓存。两者的功能基本上一样。
      最新的Nginx 0.8.31版本,proxy_cache和fastcgi_cache已经比较完善,加上第三方的ngx_cache_purge模块(用于清除指定 URL的缓存),已经可以完全取代Squid。有的网站已经在生产环境使用了 Nginx 的 proxy_cache 缓存功能超过两个月,十分稳定,速度不逊于 Squid。


      在功能上,Nginx已经具备Squid所拥有的Web缓存加速功能、清除指定URL缓存的功能。而在性能上,Nginx对多核CPU的利用,胜过 Squid不少。另外,在反向代理、负载均衡、健康检查、后端服务器故障转移、Rewrite重写、易用性上,Nginx也比Squid强大得多。这使得一台Nginx可以同时作为"负载均衡服务器"与"Web缓存服务器"来使用。以下是配置片段供参考:
      http    
      {   
        ...   
        client_body_buffer_size  512k;   
        proxy_connect_timeout    5;   
        proxy_read_timeout       60;   
        proxy_send_timeout       5;   
        proxy_buffer_size        16k;   
        proxy_buffers            4 64k;   
        proxy_busy_buffers_size 128k;   
        proxy_temp_file_write_size 128k;   
        ...  
        #注:proxy_temp_path和proxy_cache_path指定的路径必须在同一分区   
        proxy_temp_path   /data0/proxy_temp_dir;  
        #设置Web缓存区名称为cache_one,内存缓存空间大小为200MB,1天清理一次缓存,硬盘缓存空间大小为30GB。   
        proxy_cache_path  /data0/proxy_cache_dir  levels=1:2   keys_zone=cache_one:200m inactive=1d max_size=30g;   
      }   
      server   
      {   
        ...   
        location /   
        {  
          #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。   
          proxy_next_upstream http_502 http_504 error timeout invalid_header;   
          proxy_cache cache_one;  
          #对不同的HTTP状态码设置不同的缓存时间   
          proxy_cache_valid  200 304 12h;   
          proxy_cache_valid  301 302 1h;  
          #以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内   
          proxy_cache_key $host$uri$is_args$args;   
          proxy_set_header Host  $host;   
          proxy_set_header X-Forwarded-For  $remote_addr;   
          proxy_pass http://backend_server;   
          expires      1d;   
        }  
        #用于清除缓存,假设一个URL为http://192.168.1.44/test.txt,通过访问http://192.168.4.44/purge/test.txt就可以清除该URL的缓存。   
        location ~ /purge(/.*)   
        {  
          #设置只允许指定的IP或IP段才可以清除URL缓存。   
          allow            127.0.0.1;   
          allow            192.168.0.0/16;   
          deny            all;   
          proxy_cache_purge    cache_one   $host$1$is_args$args;   
        }      
        #扩展名以.php、.jsp、.cgi结尾的动态应用程序不缓存。   
        location ~ .*\.(php|jsp|cgi)?$   
        {   
          proxy_set_header Host  $host;   
          proxy_set_header X-Forwarded-For  $remote_addr;   
          proxy_pass http://backend_server;   
        }   
      }

      同时,对于影响页面展现的静态资源,例如:css, js 等可以放在具有优质带宽的IDC(IDC=互联网数据中心,优质/高速的带宽也比较贵,正所谓一份价钱一分货);其他的静态资源,如图片等可以放在价格相对低廉的IDC中,以域名区分两种静态资源,节省每一分钱。


      8、网络拓扑图
               / Ngnix - 1:1 - Resin 
      F5 --
               \ Squid - 1:n - Apache

      9、监控统计平台
      业务统计 - 用户访问统计 
      软件性能 - 应用系统监控,例如:请求响应时间…… 
      硬件/网络性能 - Ganglia监控


      10、其它要点
      IE浏览器对同一域名(包括子域名)只能建立2个连接,连接多了只能排队…… 
      双F5架构,两台职能划分不同,镜像,心跳接管…… 
      Raid存储阵列…… 
      Linux操作系统及其优化……

    动态应用,是相对于网站静态内容而言,是指以C/C++、PHP、Java、Perl、.Net等服务器端语言开发的网络应用软件,动态应用系统通常与数据库系统、缓存系统、分布式存储系统等密不可分。

    AD:WOT2014课程推荐:实战MSA:用开源软件搭建微服务系统

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

    51CTO推荐专题:大型网站架构技术专家谈

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

    ◆Web前端系统

    ◆负载均衡系统

    ◆数据库集群系统

    ◆缓存系统

    ◆分布式存储系统

    ◆分布式服务器管理系统

    ◆代码分发系统

    Web前端系统

    Web前端系统

    为了达到不同应用的服务器共享、避免单点故障、集中管理、统一配置等目的,不以应用划分服 务器,而是将所有服务器做统一使用,每台服务器都可以对多个应用提供服务,当某些应用访问量升高时,通过增加服务器节点达到整个服务器集群的性能提高,同时使他应用也会受益。

    该Web前端系统基于Apache/Lighttpd/Eginx等的虚拟主机平台,提供PHP程序运行环境。服务器对开发人员是透明的,不需要开发人员介入服务器管理。

    负载均衡系统

    负载均衡系统

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

    数据库集群系统 

    数据库集群系统

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

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

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

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

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

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

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

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

    缓存系统

    缓存系统

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

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

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

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

    分布式存储系统

    分布式存储系统

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

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

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

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

    分布式服务器管理系统

    分布式服务器管理系统

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

    在分布式服务器管理系统软件中有一些比较优秀的软件,其中比较理想的一个是Cfengine。它可以对服务器进行分组,不同的分组可以分别定制系统配置文件、计划任务等配置。

    它是基于C/S 结构的,所有的服务器配置和管理脚本程序都保存在Cfengine Server上,而被管理的服务器运行着 Cfengine Client程序,Cfengine Client通过SSL加密的连接定期的向服务器端发送请求以获取最新的配置文件和管理命令、脚本程序、补丁安装等任务。

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

    代码发布系统

    代码发布系统

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

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

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

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

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

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


    我在CERNET做过拨号接入平台的搭建,而后在Yahoo&3721从事过搜索引擎前端开发,又在MOP处理过大型社区猫扑大杂烩的架构升级等工作,同时自己接触和开发过不少大中型网站的模块,因此在大型网站应对高负载和并发的解决方案上有一些积累和经验,可以和大家一起探讨一下。

    一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构、性能的要求都很简单,随着互联网业务的不断丰富,网站相关的技术经过这些年的发展,已经细分到很细的方方面面,尤其对于大型网站来说,所采用的技术更是涉及面非常广,从硬件到软件、编程语言、数据库、WebServer、防火墙等各个领域都有了很高的要求,已经不是原来简单的html静态网站所能比拟的。

    大型网站,比如门户网站。在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。但是除了这几个方面,还没法根本解决大型网站面临的高负载和高并发问题。

    上面提供的几个解决思路在一定程度上也意味着更大的投入,并且这样的解决思路具备瓶颈,没有很好的扩展性,下面我从低成本、高性能和高扩张性的角度来说说我的一些经验。

    1、HTML静态化

    其实大家都知道,效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。但是对于大量内容并且频繁更新的网站,我们无法全部手动去挨个实现,于是出现了我们常见的信息发布系统CMS,像我们常访问的各个门户站点的新闻频道,甚至他们的其他频道,都是通过信息发布系统来管理和实现的,信息发布系统可以实现最简单的信息录入自动生成静态页面,还能具备频道管理、权限管理、自动抓取等功能,对于一个大型网站来说,拥有一套高效、可管理的CMS是必不可少的。

    除了门户和信息发布类型的网站,对于交互性要求很高的社区类型网站来说,尽可能的静态化也是提高性能的必要手段,将社区内的帖子、文章进行实时的静态化,有更新的时候再重新静态化也是大量使用的策略,像Mop的大杂烩就是使用了这样的策略,网易社区等也是如此。目前很多博客也都实现了静态化,我使用的这个Blog程序WordPress还没有静态化,所以如果面对高负载访问,www.toplee.com一定不能承受 

    同时,html静态化也是某些缓存策略使用的手段,对于系统中频繁使用数据库查询但是内容更新很小的应用,可以考虑使用html静态化来实现,比如论坛中论坛的公用设置信息,这些信息目前的主流论坛都可以进行后台管理并且存储再数据库中,这些信息其实大量被前台程序调用,但是更新频率很小,可以考虑将这部分内容进行后台更新的时候进行静态化,这样避免了大量的数据库访问请求。

    在进行html静态化的时候可以使用一种折中的方法,就是前端使用动态实现,在一定的策略下进行定时静态化和定时判断调用,这个能实现很多灵活性的操作,我开发的台球网站故人居(www.8zone.cn)就是使用了这样的方法,我通过设定一些html静态化的时间间隔来对动态网站内容进行缓存,达到分担大部分的压力到静态页面上,可以应用于中小型网站的架构上。故人居网站的地址:http://www.8zone.cn,顺便提一下,有喜欢台球的朋友多多支持我这个免费网站:)

    2、图片服务器分离

    大家知道,对于Web服务器来说,不管是Apache、IIS还是其他容器,图片是最消耗资源的,于是我们有必要将图片与页面进行分离,这是基本上大型网站都会采用的策略,他们都有独立的图片服务器,甚至很多台图片服务器。这样的架构可以降低提供页面访问请求的服务器系统压力,并且可以保证系统不会因为图片问题而崩溃。

    在应用服务器和图片服务器上,可以进行不同的配置优化,比如Apache在配置ContentType的时候可以尽量少支持,尽可能少的LoadModule,保证更高的系统消耗和执行效率。

    我的台球网站故人居8zone.cn也使用了图片服务器架构上的分离,目前是仅仅是架构上分离,物理上没有分离,由于没有钱买更多的服务器:),大家可以看到故人居上的图片连接都是类似img.9tmd.com或者img1.9tmd.com的URL。

    另外,在处理静态页面或者图片、js等访问方面,可以考虑使用lighttpd代替Apache,它提供了更轻量级和更高效的处理能力。

    3、数据库集群和库表散列
    大型网站都有复杂的应用,这些应用必须使用数据库,那么在面对大量访问的时候,数据库的瓶颈很快就能显现出来,这时一台数据库将很快无法满足应用,于是我们需要使用数据库集群或者库表散列。

    在数据库集群方面,很多数据库都有自己的解决方案,Oracle、Sybase等都有很好的方案,常用的MySQL提供的Master/Slave也是类似的方案,您使用了什么样的DB,就参考相应的解决方案来实施即可。

    上面提到的数据库集群由于在架构、成本、扩张性方面都会受到所采用DB类型的限制,于是我们需要从应用程序的角度来考虑改善系统架构,库表散列是常用并且最有效的解决方案。我们在应用程序中安装业务和应用或者功能模块将数据库进行分离,不同的模块对应不同的数据库或者表,再按照一定的策略对某个页面或者功能进行更小的数据库散列,比如用户表,按照用户ID进行表散列,这样就能够低成本的提升系统的性能并且有很好的扩展性。sohu的论坛就是采用了这样的架构,将论坛的用户、设置、帖子等信息进行数据库分离,然后对帖子、用户按照板块和ID进行散列数据库和表,最终可以在配置文件中进行简单的配置便能让系统随时增加一台低成本的数据库进来补充系统性能。

    4、缓存
    缓存一词搞技术的都接触过,很多地方用到缓存。网站架构和网站开发中的缓存也是非常重要。这里先讲述最基本的两种缓存。高级和分布式的缓存在后面讲述。

    架构方面的缓存,对Apache比较熟悉的人都能知道Apache提供了自己的mod_proxy缓存模块,也可以使用外加的Squid进行缓存,这两种方式均可以有效的提高Apache的访问响应能力。

    网站程序开发方面的缓存,Linux上提供的Memcached是常用的缓存方案,不少web编程语言都提供memcache访问接口,php、perl、c和java都有,可以在web开发中使用,可以实时或者Cron的把数据、对象等内容进行缓存,策略非常灵活。一些大型社区使用了这样的架构。

    另外,在使用web语言开发的时候,各种语言基本都有自己的缓存模块和方法,PHP有Pear的Cache模块和eAccelerator加速和Cache模块,还要知名的Apc、XCache(国人开发的,支持!)php缓存模块,Java就更多了,.net不是很熟悉,相信也肯定有。

    5、镜像
    镜像是大型网站常采用的提高性能和数据安全性的方式,镜像的技术可以解决不同网络接入商和地域带来的用户访问速度差异,比如ChinaNet和EduNet之间的差异就促使了很多网站在教育网内搭建镜像站点,数据进行定时更新或者实时更新。在镜像的细节技术方面,这里不阐述太深,有很多专业的现成的解决架构和产品可选。也有廉价的通过软件实现的思路,比如Linux上的rsync等工具。

    6、负载均衡
    负载均衡将是大型网站解决高负荷访问和大量并发请求采用的终极解决办法。

    负载均衡技术发展了多年,有很多专业的服务提供商和产品可以选择,我个人接触过一些解决方法,其中有两个架构可以给大家做参考。另外有关初级的负载均衡DNS轮循和较专业的CDN架构就不多说了。

    6.1 硬件四层交换
    第四层交换使用第三层和第四层信息包的报头信息,根据应用区间识别业务流,将整个区间段的业务流分配到合适的应用服务器进行处理。 第四层交换功能就象是虚IP,指向物理服务器。它传输的业务服从的协议多种多样,有HTTP、FTP、NFS、Telnet或其他协议。这些业务在物理服务器基础上,需要复杂的载量平衡算法。在IP世界,业务类型由终端TCP或UDP端口地址来决定,在第四层交换中的应用区间则由源端和终端IP地址、TCP和UDP端口共同决定。

    在硬件四层交换产品领域,有一些知名的产品可以选择,比如Alteon、F5等,这些产品很昂贵,但是物有所值,能够提供非常优秀的性能和很灵活的管理能力。Yahoo中国当初接近2000台服务器使用了三四台Alteon就搞定了。

    6.2 软件四层交换
    大家知道了硬件四层交换机的原理后,基于OSI模型来实现的软件四层交换也就应运而生,这样的解决方案实现的原理一致,不过性能稍差。但是满足一定量的压力还是游刃有余的,有人说软件实现方式其实更灵活,处理能力完全看你配置的熟悉能力。


    软件四层交换我们可以使用Linux上常用的LVS来解决,LVS就是Linux Virtual Server,他提供了基于心跳线heartbeat的实时灾难应对解决方案,提高系统的鲁棒性,同时可供了灵活的虚拟VIP配置和管理功能,可以同时满足多种应用需求,这对于分布式的系统来说必不可少。


    一个典型的使用负载均衡的策略就是,在软件或者硬件四层交换的基础上搭建squid集群,这种思路在很多大型网站包括搜索引擎上被采用,这样的架构低成本、高性能还有很强的扩张性,随时往架构里面增减节点都非常容易。这样的架构我准备空了专门详细整理一下和大家探讨。

    总结:
    对于大型网站来说,前面提到的每个方法可能都会被同时使用到,Michael这里介绍得比较浅显,具体实现过程中很多细节还需要大家慢慢熟悉和体会,有时一个很小的squid参数或者apache参数设置,对于系统性能的影响就会很大,希望大家一起讨论,达到抛砖引玉之效。



    展开全文
  • 一个实际项目Java架构设计之总体设计

    万次阅读 多人点赞 2015-06-12 23:10:32
    1 总体架构模块图 1.1  抽象架构模块图     1.2  具体技术架构模块图 如上图示所,框架主要包括了: l  MVC开发框架 l 工作流技术 l 用户、权限、角色管理 下面分别详细介绍。 2 MVC...

    1      总体架构模块图

    1.1   抽象架构模块图

     

     

    1.2   具体技术架构模块图

    如上图示所,框架主要包括了:

    l  MVC开发框架

    l  工作流技术

    l  用户、权限、角色管理

    下面分别详细介绍。

    2      MVC方案

    2.1   视图层技术方案(view

    在常用开发框架的应用中,常用于视图层的有:Jsp ,JsfFreemarkerXslt, Velocity.JSP:常用的一种视图层,无法实现严格的MVC分离,JSP代码几乎等同于JAVA代码。表现逻辑与代码相混杂,代码重用性,系统维护性比较低。下面分别介绍:

    l  JSF:基于组件事件驱动,遵循JAVAEE的标准,上手快,有大量可重用组件。对RESET支持不好,没有一个统一的实现,既有SUN的实现,又有apache的实现-myfaces,编写定自定义组件要求高,比较适合做企业应用。

    l  xslt:模板技术之一,有极佳的拓展性和重用性,可实现严格的MVC分离。Xslt缺乏强有力的编辑器支持。在性能上,相对于JSP,Freemarker,Velocity,在等同复杂页面度的表现层逻辑,xslt性能比其他几个差距比较大,占用的内存空间也比较多。

    l  Velocity:常用的模板技术之一,可实现严格的MVC分离,简单轻量级,语法简单。vtl语法需要一定上的学习时间,不支持jsp标签。

    l  Freemarker:常用的模板技术之一,可实现严格的MVC分离。与Velocity相比,Freemarker功能更加强大,对表现逻辑和业务逻辑的划分更加严格,可自定义macroFreemarker同时支持JSP的标签。Freemarker对于语法相对比较严格,变量必须赋值,mapkey必须为string

    基于以上分析,结合开发效率和运行效率,建议采用Freemarker作为视图层的技术。

    2.2   控制层方案(controller

    在常用的控制层技术中,有struct1struct2springMVC等。

    1)       struct1:比较早的一个控制层框架,非线程安全,现在很少使用。

    2)       struct2:较为成熟并应用非常广泛的框架,即经典的SSH,比较热门

    3)       springMVC:后起之秀,目前最有前景的技术,以下列出与struct2主要对比项:

    l  在性能上,springMVC优于struct2

    l  springMVC隶属spring团队的产品,学习过spring的人,上手快。

    l  springMVC可实现配零配置,struct2需要无法做到零配置。

    l  对于开发效率来讲,springMVC相对struct2,效率高。

    l  pringMVC内置restful,无需第三方插件的支持。

    l  标杆对照,在淘宝、拍拍等大型电商网站中,也采用springMVC作为控制层技术,有很多资料可作为参考。

    从技术的先进性、复杂性上考虑建议采用springMVC作为控制层。

     

    2.3   模型层(module

    可以选用两大主流的开源ORM组件:HibernateMyBatis

    l  Hibernate学习门槛比较高,限制对象模型,在多表、复杂查询下,优化难度较高。对于后期的维护或者重构来说,难度较大。

    l  MyBatis属于半ORM框架,可以对sql做到精细控制,但是开发效率来讲,比hibernate相对慢些,但是利于后期的维护于重构。

    从灵活性、可控性、学习成本和本人熟悉程度考虑,配合使用codeSmith代码生器能大幅提高开发效率,建议采用MyBatis,作为项目的ORM框架。

     

    2.4   数据库(database

    可能被采用的数据库有OracleMysql,使用Mysql的好处有:

    l  源免费数据库,使用较新稳定版本5.5

    l  功能强大,稳定;

    l  经历过有广泛的成熟的应用实践考验;

    l  使用经验比较丰富,容易上手,使用简单;

    l  视用户量情况考虑,前期小规模的时候采用Master-Slave主从模式备份。后期逐步考虑:实现数据库读写分离。并可考虑分表、分库,还可以使用集群提升读性能。

    使用Oracle的好处有:

    l  目前公司已经使用

    l  性能好、安全性高,各种方案完整

    l  客户较为认可

    基于目前公司已使用,所以建议仍采用oracle,但如果需要降低成本可以采用Mysql

    2.5   推荐MVC技术方案流程

    2.5.1  总体流程图

     

    2.5.2  控制层(controller)流程图

     

     

    3      用户、角色、权限管理模块

    CAS +LDAP

    4      工作流方案

    可以选择的技术主要有:JBPM4JBPM5Activiti5

    序号

    技术组成

    Activiti

    jBPM5

    1

    数据库持久层ORM

    MyBatis3

    Hibernate3

    2

    持久化标准

    JPA规范

    3

    事务管理

    MyBatis机制/Spring事务控制

    Bitronix,基于JTA事务管理

    4

    数据库连接方式

    Jdbc/DataSource

    Jdbc/DataSource

    5

    支持数据库

    Oracle、SQL Server、MySQL等多数数据库

    Oracle、SQL Server、MySQL等多数数据库

    6

    设计模式

    Command模式、观察者模式等

     

    7

    内部服务通讯

    Service间通过API调用

    基于Apache Mina异步通讯

    8

    集成接口

    SOAP、Mule、RESTful

    消息通讯

    9

    支持的流程格式

    BPMN2、xPDL、jPDL等

    目前仅只支持BPMN2 xml

    10

    引擎核心

    PVM(流程虚拟机)

    Drools

    11

    技术前身

    jBPM3、jBPM4

    Drools  Flow

    12

    所属公司

    Alfresco

    jBoss.org

    由于目前还未深入分析,初步设想可能偏向于Activiti5,因为它更好的与当前架构集成

     

    5      数据集成ETL工具

    Kettle是一款国外开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行,数据抽取高效稳定。Kettle 中文名称叫水壶,该项目的主程序员MATT 希望把各种数据放到一个壶里,然后以一种指定的格式流出。Kettle采用了LGPL协议,即修改后的程序可以不公开发布,可以放心的使用,而不用考虑版权问题。

     

    6      通用基础模块/组件方案

    6.1   日志组件

    l  采用J2EE平台最常用的Log4J日志组件

    6.2   Cache组件

    l  前期使用单台应用服务器的时候可以直接使用Mybatis内置缓存机制或者是服务器缓存开发;

    l  后期根据实际运营情况,要使用集群部署方式时,使用Memcached组成分布式集群缓存,这样就不存在缓存同步的问题。

    l  通过SpringAOP结合Memchched将缓存功能嵌入到代码中,根据实际的业务场景,制定缓存策略。


    ---------------------------------------2017-11-26更新----------------------------------------------------


     7 源码下载

    这段时间非常感谢大家的关注,有很多同行看了博客想下载源码,我也统一回复过几次邮件,索性在这里公布下载地址,大家可以直接用百度网盘下载,另外架构日新月异,建议大家可以学习一下当前更成熟和全面的框架,如jeesite、jeecg等,本博客示例代码地址:http://pan.baidu.com/s/1minAVmo ,提取码: m8gs
    下载压缩包,解压后文件夹说明如下:


    注:所有资料仅做学习参考使用。

    展开全文
  • 企业vSphere架构设计方案(第二期) 企业vSphere架构设计方案(第二期) 企业vSphere架构设计方案(第二期) 企业vSphere架构设计方案(第二期)
  • Java架构设计之总体设计案例

    千次阅读 2018-12-31 09:06:59
    1 总体架构模块图 1.1 抽象架构模块图       1.2 具体技术架构模块图   如上图示所,框架主要包括了: l MVC开发框架 l 工作流技术 l 用户、权限、角色管理 下面分别详细介绍。 2 MVC方案 ...

    1      总体架构模块图

    1.1   抽象架构模块图

     

     

     

    1.2   具体技术架构模块图

     

    如上图示所,框架主要包括了:

    l  MVC开发框架

    l  工作流技术

    l  用户、权限、角色管理

    下面分别详细介绍。

    2      MVC方案

    2.1   视图层技术方案(view)

    在常用开发框架的应用中,常用于视图层的有:Jsp ,Jsf,Freemarker,Xslt, Velocity等.JSP:常用的一种视图层,无法实现严格的MVC分离,JSP代码几乎等同于Java代码。表现逻辑与代码相混杂,代码重用性,系统维护性比较低。下面分别介绍:

    l  JSF:基于组件事件驱动,遵循JAVAEE的标准,上手快,有大量可重用组件。对RESET支持不好,没有一个统一的实现,既有SUN的实现,又有apache的实现-myfaces,编写定自定义组件要求高,比较适合做企业应用。

    l  xslt:模板技术之一,有极佳的拓展性和重用性,可实现严格的MVC分离。Xslt缺乏强有力的编辑器支持。在性能上,相对于JSP,Freemarker,Velocity,在等同复杂页面度的表现层逻辑,xslt性能比其他几个差距比较大,占用的内存空间也比较多。

    l  Velocity:常用的模板技术之一,可实现严格的MVC分离,简单轻量级,语法简单。vtl语法需要一定上的学习时间,不支持jsp标签。

    l  Freemarker:常用的模板技术之一,可实现严格的MVC分离。与Velocity相比,Freemarker功能更加强大,对表现逻辑和业务逻辑的划分更加严格,可自定义macro,Freemarker同时支持JSP的标签。Freemarker对于语法相对比较严格,变量必须赋值,map的key必须为string。

    基于以上分析,结合开发效率和运行效率,建议采用Freemarker作为视图层的技术。

    2.2   控制层方案(controller)

    在常用的控制层技术中,有struct1,struct2,springMVC等。

    1)       struct1:比较早的一个控制层框架,非线程安全,现在很少使用。

    2)       struct2:较为成熟并应用非常广泛的框架,即经典的SSH,比较热门

    3)       springMVC:后起之秀,目前最有前景的技术,以下列出与struct2主要对比项:

    l  在性能上,springMVC优于struct2。

    l  springMVC隶属spring团队的产品,学习过spring的人,上手快。

    l  springMVC可实现配零配置,struct2需要无法做到零配置。

    l  对于开发效率来讲,springMVC相对struct2,效率高。

    l  pringMVC内置restful,无需第三方插件的支持。

    l  标杆对照,在淘宝、拍拍等大型电商网站中,也采用springMVC作为控制层技术,有很多资料可作为参考。

    从技术的先进性、复杂性上考虑建议采用springMVC作为控制层。

     

    2.3   模型层(module)

    可以选用两大主流的开源ORM组件:hibernate和MyBatis。

    l  Hibernate学习门槛比较高,限制对象模型,在多表、复杂查询下,优化难度较高。对于后期的维护或者重构来说,难度较大。

    l  MyBatis属于半ORM框架,可以对sql做到精细控制,但是开发效率来讲,比hibernate相对慢些,但是利于后期的维护于重构。

    从灵活性、可控性、学习成本和本人熟悉程度考虑,配合使用codeSmith代码生器能大幅提高开发效率,建议采用MyBatis,作为项目的ORM框架。

     

    2.4   数据库(database)

    可能被采用的数据库OracleMySQL,使用Mysql的好处有:

    l  源免费数据库,使用较新稳定版本5.5

    l  功能强大,稳定;

    l  经历过有广泛的成熟的应用实践考验;

    l  使用经验比较丰富,容易上手,使用简单;

    l  视用户量情况考虑,前期小规模的时候采用Master-Slave主从模式备份。后期逐步考虑:实现数据库读写分离。并可考虑分表、分库,还可以使用集群提升读性能。

    使用Oracle的好处有:

    l  目前公司已经使用

    l  性能好、安全性高,各种方案完整

    l  客户较为认可

    基于目前公司已使用,所以建议仍采用oracle,但如果需要降低成本可以采用Mysql。

    2.5   推荐MVC技术方案流程

    2.5.1  总体流程图

     

    2.5.2  控制层(controller)流程图

     

     

     

    3      用户、角色、权限管理模块

    CAS +LDAP

    4      工作流方案

    可以选择的技术主要有:JBPM4,JBPM5,Activiti5

    序号

    技术组成

    Activiti

    jBPM5

    1

    数据库持久层ORM

    MyBatis3

    Hibernate3

    2

    持久化标准

    JPA规范

    3

    事务管理

    MyBatis机制/Spring事务控制

    Bitronix,基于JTA事务管理

    4

    数据库连接方式

    Jdbc/DataSource

    Jdbc/DataSource

    5

    支持数据库

    Oracle、SQL Server、MySQL等多数数据库

    Oracle、SQL Server、MySQL等多数数据库

    6

    设计模式

    Command模式、观察者模式等

     

    7

    内部服务通讯

    Service间通过API调用

    基于Apache Mina异步通讯

    8

    集成接口

    SOAP、Mule、RESTful

    消息通讯

    9

    支持的流程格式

    BPMN2、xPDL、jPDL等

    目前仅只支持BPMN2 xml

    10

    引擎核心

    PVM(流程虚拟机)

    Drools

    11

    技术前身

    jBPM3、jBPM4

    Drools  Flow

    12

    所属公司

    Alfresco

    jBoss.org

    由于目前还未深入分析,初步设想可能偏向于Activiti5,因为它更好的与当前架构集成

     

    5      数据集成ETL工具

    Kettle是一款国外开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行,数据抽取高效稳定。Kettle 中文名称叫水壶,该项目的主程序员MATT 希望把各种数据放到一个壶里,然后以一种指定的格式流出。Kettle采用了LGPL协议,即修改后的程序可以不公开发布,可以放心的使用,而不用考虑版权问题。

     

    6      通用基础模块/组件方案

    6.1   日志组件

    l  采用J2EE平台最常用的Log4J日志组件

    6.2   Cache组件

    l  前期使用单台应用服务器的时候可以直接使用Mybatis内置缓存机制或者是服务器缓存开发;

    l  后期根据实际运营情况,要使用集群部署方式时,使用Memcached组成分布式集群缓存,这样就不存在缓存同步的问题。

    l  通过Spring的AOP结合Memchched将缓存功能嵌入到代码中,根据实际的业务场景,制定缓存策略。

    展开全文
  • java网站架构设计

    千次阅读 2013-05-01 13:35:17
    闲来无事,梳理了一下自己的技术,简单聊聊一些大型网站的技术架构设计,算是个抛砖引玉吧,欢迎大家拍砖。 涉及到的技术及工具:java,springmvc,ibatis,freemarker,mysql,mongdb,memcached,ehcache,maven。 ...

    闲来无事,梳理了一下自己的技术,简单聊聊一些大型网站的技术架构设计,算是个抛砖引玉吧,欢迎大家拍砖。


    涉及到的技术及工具:java,springmvc,ibatis,freemarker,mysql,mongdb,memcached,ehcache,maven。


    一个网站不可能说一开始就是要设计一个能够考虑所有情况的完美架构,一个成熟的架构都是随着需求的变化,流量的增高来随之变化的。


    基本架构:

    web服务器:ngnix+apache做负载均衡

    技术架构: freemarker+springMVC+ibatis(myIbatis)+memcache+mysql

    这样的架构一般的网站日均VU在几万十几万的情况下,部署个几台web机器基本就可以满足了。


    一、随着流量的增加,首页想到要优化的就是数据库

    1、分库 可以根据业务模块的划分进行分库,用来减轻单库压力。

    2、分表 对个别数据量非常大的表,进行分表,减少单表数据量,提高查询速度。

    3、分库之后,对于核心数据库,可以进行主/从库处理,将查询与更新分离,提高插入速度。

    4、梳理业务,对于像动态之类的写量非常大,写后并不更新这类特征的数据,可以采用mongdb,获得更高的性能和更简单的业务处理。

    数据库做到这个层面上,基本上就差不多了,新的业务进来,数据库可以从容的进行水平扩展。

    二、随着业务渐渐复杂,数据库又分库分表,可能有一些业务流程就非常的长,导致应用程序需要去N个库查询或者更新N张表,这样客户端的响应就非常慢了,这个时候就需要异步登场了。

    推荐:JMS,使用activeMQ,这些spring都有很好的实现。

    三、缓存服务器,网站有一些基本信息,例如:网站配置信息、登录用户信息等等,这类核心数据,差不多每次请求都要去读取,但是这些数据是不怎么会变的,每次还要去memcache缓存服务器上去读取,服务器间通信也是要时间的,可以考虑本地缓存。

    推荐:EhCach。它是一个纯Java的进程内缓存框架,具有快速、精干等特点。

    四、静态化。网站首页、还有二级域名首页等类似首页性质的页面,访问量都比较大,静态化掉。可以定时任务几分钟生成一次。

    推荐:Quartz。开源的作业调度框架。(其实这个一开始就应该集成进去,因为你的网站肯定会有类似的定时任务的需求,Quartz是当仁不二的选择)。

    五、静态文件优化。

    1、这个是html和js还有静态图片等,这些的优化方案就比较多了,js组件化,按需加载,css sprite等等,前端优化博大精深,这里就不说了,网上有很多方案,这是一个长期的优化和任务。

    2、静态文件存储,分布式文件存储,开源的解决方案也有很多,MogileFS、HDFS

    六、业务解耦。随着系统越来越复杂,它就像一个庞大的机器,所有的功能师都在上面开发,新手,老鸟,不关是谁,除了个别资深程序员和架构师以外,其他人未必能理解整个系统,很容易造成bug,而发布就变成了噩梦,只要有个人的功能有问题,整个系统就不能发布,所有人都得停下来等,造成大量资源浪费,加班严重。此阶段,必然需要系统拆分,将系统按照业务进行划分,例如用户模块、博客模块、图片模块等等。各个模块之间通过外部接口进行通讯,各个模块可以单独开发单独部署,互不影响。

    展开全文
  • Java软件架构设计

    千次阅读 2018-02-28 23:11:08
    http://blog.csdn.net/hdy007/article/details/1509910开始的架构设计也是最难的,需要调研同类产品的情况以及技术特征,了解当前世界上对这种产品所能提供的理论支持和技术平台支持,再结合自己项目的特点(需要透彻...
  • java高可用架构设计与实践视频教程 架构高级视频课程 更多精彩java高级解决方案,高级视频请到本人上传资料查找
  • Java系统架构设计

    万次阅读 2015-12-22 15:12:42
    Java 应用一般架构 原文地址:http://segmentfault.com/a/1190000004004963 1. 不同系统不同语言之间的交互 现在我们常见的不同系统不同语言之间的交互使用WebService,Http请求。WebService,即“Web 服务...
  • App 后台架构设计方案 设计思想与最佳实践

    万次阅读 多人点赞 2017-01-09 09:16:18
    CSDN 2016博客之星评选结果公布 ...App 后台架构设计方案 设计思想与最佳实践 标签: App后台架构设计用户验证方案后台架构的演进架构 2017-01-08 16:10 245人阅读 评论(0) 收藏 举报
  • App 后端架构设计方案 设计思想与最佳实践 标签: App后台架构设计用户验证方案后台架构的演进架构 2017-01-08 16:10 10957人阅读 评论(3) 收藏 举报 版权声明:本文为博主原创文章,未经博主允许...
  • Java架构-美团即时物流的分布式系统架构设计

    千次阅读 多人点赞 2018-11-25 17:21:40
    背景 美团外卖已经发展了五年,即时物流探索也经历了 3 年多的时间,业务从...即时物流系统阶段性的逐步实施分布式系统的架构升级,最终解决了系统宕机的风险。 围绕成本、效率、体验核心三要素,即时物流体系大量结...
  • Java 设计架构

    千次阅读 2010-05-08 23:42:00
    目录 摘要 ……………………………………………………………………2文献综述 ...软件的可维护性与可复用性…………………………6第二节 六条OOP设计原则 ……………………………………7第三节 AOP的兴起…………………
  • Java架构师全套教程,成为架构师,看这一套就够了 01.第一阶段、Svn版本管理与代码上线架构方案(经典) 02.第二阶段、实战Java高并发程序设计模式视频 03.第三阶段、深入JVM内核—原理、诊断与优化 04.第四阶段、...
  • Java软件架构设计慨论

    千次阅读 2006-04-30 09:57:00
    Java软件架构设计慨论 开始之初的架构设计决定着软件产品的生死存亡。“好的开始相当于成功一半”。 开始的架构设计也是最难的,需要调研同类产品的情况以及技术特征,了解当前世界上对这种产品所能提供的理论支持...
  • 我要带徒弟学JAVA架构 ( 写架构,非用架构 )

    千次阅读 多人点赞 2015-12-11 10:14:50
    我要开设一个导师性质的培训班,类似大学研究生导师,给你课题、分配任务、分享资料让你得到提高。我的教学方法是以自学为主,辅导为辅助,在实践中积累...主要方向是JAVA架构,深层次java架构基础、主流框架技术等等。
  • Java架构师的具体职责 Java架构师需要负责系统优化能准确捕捉系统性能瓶颈并提出解决方案下面是小编为您精心整理的Java架构师的具体职责 Java架构师的具体职责1 职责 1根据产品和项目需求分析设计与实现系统架构方案...
  • Java架构资源文档

    2018-04-27 17:20:05
    本文档讲述了java 各大框架的优缺点,以及各大框架的搭配优劣
  • PAGE PAGE 1 Java架构师岗位的职责表述 Java架构师负责产品架构分析提出软硬件架构整体设计数据库存储设计方案指导其他工程师的设计工作以下是小编整理的Java架构师岗位的职责表述 Java架构师岗位的职责表述1 职责 1...
  • java分布式技术平台架构方案

    千次阅读 2020-05-12 07:53:24
    系统平台具有较大的灵活调整空间,当有新的主数据类型、新的数据需求、新的数据结构、新的数据接口及流程等需求时,整体系统架构不需要重新构建,通过可扩展的架构方式即可满足功能变化,前端数据录入可根据数据模型...
  • 想成为java架构师,首先你自身得是一个高级java攻城狮,会使用各种框架并且很熟练,且知晓框架实现的原理。 比如,你要知道,jvm虚拟机原理、调优;懂得jvm能让你写出的代码性能更优化;还有池技术:什么对象池、...
  • PAGE PAGE 1 Java架构师岗位的基本职责说明 Java架构...1根据公司业务发展战略规划负责系统的规划和技术架构搭建 2协助业务方梳理业务需求提供业务规划方案架构设计方案并能根据方案展开研发工作 3负责核心代码编写技术
  • 本文来源网络收集整理\word可编辑 本文来源网络收集整理\word可编辑 本文来源网络收集整理\word可...Java架构师的具体职责1 职责 1根据产品和项目需求分析设计与实现系统架构方案保障系统架构的合理性可扩展性及经济性;

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 203,361
精华内容 81,344
关键字:

java架构设计方案

java 订阅