四种JavaEE架构简介

点击上方 "编程技术圈"关注, 星标或置顶一起成长

后台回复“大礼包”有惊喜礼包!

每日英文

If you run, you stand a chance losing ,but if you don’t run , you’ve already lost. 

如果你在努力奋斗,你有可能会失败,但是,如果你不奋斗你就已经输了。

每日掏心话

来者要惜,去者要放。人生是一场旅行,不是所有人都会去同一个地方。

责编:乐乐

来自:blog.csdn.net/rj151YY/article/details/84383550

编程技术圈(ID:study_tech)第 1134 次推文 图源:百度

往日回顾:告赢了!程序员拒绝春节带电脑回家工作被开除,判决获赔19.4万!

     

   正文   


1、传统三层架构(all in one项目)

传统三层架构大致可以分为表现层,业务层和持久层(数据访问层)。其中表现层负责接受请求和转发请求。业务层负责处理请求(注:事务管理,日志记录等AOP类型的操作均封装在这一层)。持久层主要负责数据库与实体之间的操作。

struts典型的mvc三层架构:模型层,视图层,控制层。

SpringMVC中的MVC指的是什么:当一个请求到达服务器时,由中央控制器DispatcherServlet(控制层)查找要访问的controller,然后controller->调用service->调用dao,之后将获取的数据返回到jsp页面(视图层)。

即:严格来说在SpringMVC中控制器是DispacterServlet,模型层是controller(即该模型层又可以看成一个MVC架构),视图层是jsp页面。

另外,利用框架可以简化各层的开发:表现层使用SpringMVC或者struts2,持久层使用Mybatis或Hibernate,使用spring管理表现层,业务层和持久层三层之间的关系。


2、集群架构(属于水平拓展)

由于传统的三层架构中存在许多问题,比如业务层中的不同模块占用系统资源相差太大,导致占用系统资源,可以使用集群解决问题。(相当于备份多个文件,多台服务器反问的是同一个项目资源,集群架构的目的也是为了系统资源的高可用性。)

在集群架构中存在一个重要的角色就是反向代理服务器,他的任务是实现负载均衡,接收用户请求,转发到目标服务器,其中反向代理服务器可以使用nginx实现(简单来说也就是一个实现负载均衡的算法)。

说明:

(1)集群架构相当于把同一个项目部署到多个服务器上(相当于复制备份),然后通过负载均衡服务器nginx将请求分别均衡的派发到不同的tomcat服务器上,实际上不同服务器上运行的是同一个web项目。

(2)大部分能企业通过nginx实现负载均衡算法。

  • 软件层面负载均衡项目:nginx, apache的httpd;

  • 硬件负载均衡器:f5.

(3)已经存在两台服务器,如果其中一台服务器的挂掉了,第二台服务器是正常的状态,负载均衡服务器会将所有请求转到第二台服务器,所以访问第二台服务器没有问题。

(4)如果你在访问第一台服务器时,正在购物,此时已经有多件商品被加入购物车了,且购物车数据是通过session存储的,倘若此时你访问的这台服务器挂掉了,那么负载均衡服务器将你的请求派送到另一台服务器上,那么此时你的购物车里面的数据依然还存在,因为集群的服务器之间的session是共享的。

(5)不同的Tomcat服务器之间如何做到session共享?

tomcat服务器本身就支持session共享,但是需要在集群的tomcat服务器的配置文件server.xml中做相同的如下配置:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">

   <Manager className="org.apache.catalina.ha.session.DeltaManager"             
           
            expireSessionsOnShutdown="false"
           
            otifyListenersOnReplication="true"/>
   
        <Channel className="org.apache.catalina.tribes.group.GroupChannel">

            <Membership className="org.apache.catalina.tribes.membership.McastService"

                        address="228.0.0.4"

                        port="45564"

                        frequency="500"

                        dropTime="3000"/>

            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"

                      address="auto"

                      port="4000"

                      autoBind="100"

                      selectorTimeout="5000"

                      maxThreads="6"/>



            <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">

              <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>

            </Sender>

            <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>

            <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>

          </Channel>



          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"

                 filter=""/>

          <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>



          <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"

                    tempDir="/tmp/war-temp/"

                    deployDir="/tmp/war-deploy/"

                    watchDir="/tmp/war-listen/"

                    watchEnabled="false"/>


          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>

        </Cluster>

好处:高可用。

搜索公众号顶级架构师回复关键字“offer”,获取一份算法面试题和答案惊喜礼包。

弊端:如果该项目很大,且并发量高,包含多个可拆分的模块(子系统)那就不适用集群架构了。

3、分布式架构(垂直拆分)

分布式架构特点:多个模块完成一个功能,每个模块又可以搭建集群,从而实现高可用。

在公众号顶级架构师后台回复“架构整洁”,获取一份惊喜礼包。

说明:

分布式架构与集群架构的区别:

(1)集群架构是将同一个完整的项目部署到多台服务器上,通过负载均衡完成请求的派发。而分布式架构是将项目拆分成不同的模块(子系统),然后将不同模块存放在不同的服务器上,所以分布式架构很大的一个特点就是分开还能合作完成一个请求。(注:现在云计算就有分布式的的概念。)

(2)简单的分布式架构仍然存在问题,如果其中一个tomcat服务器挂掉了,则其中一个模块则不可运行了,所以考虑到分布式集群架构,即将一个大系统分成多个独立的模块,部署到多个服务器上,每个模块再考虑存放在多个服务器上形成一个集群,如此才能实现高可用性。如下图:

好处:高可用,效率高。

弊端:模块之间的关系不易于管理。

4、微服务架构(垂直划分)

根据产品的业务功能模块划分服务的种类,客户端可以通过基于HTTP或者RPC的方式调用微服务,目的是为了降低所产生的性能开销。同时每个模块仍然可以搭建集群,从而实现高可用。

4.1 SOA架构

是当服务过多时,服务之间调用关系复杂混乱,不利于维护。

使用dubbo。使用rpc协议进行远程调用,直接使用socket通信。传输效率高,并且可以统计系统之间的调用关系,调用次数。(由于dubbo阿里公司已经停止更新,建议使用springcloud)。

4.2 Dobbo

dubbo体系结构图:

如下是一个典型的基于SOA电商项目架构图:

说明:如果服务与服务之间存在调用,dobbo可以通过名字去鉴别因为编码时每个模块之间都有调用关系,且该关系也被dobbo掌握。

搜索公众号顶级架构师回复关键字“架构整洁”,获取一份惊喜礼包。

4.3 SpringCloud

SpringCloud是一个基于 Spring Boot 实现的服务治理工具包;Spring Boot 专注于快速、方便集成的单个微服务个体;Spring Cloud 关注全局的服务治理框架。

解释一下这张图中各组件的运行流程:

  • ① 所有请求都统一通过 API 网关(Zuul)来访问内部服务。

  • ② 网关接收到请求后,从注册中心(Eureka)获取可用服务。

  • ③ 由 Ribbon 进行均衡负载后,分发到后端的具体实例。

  • ④ 微服务之间通过 Feign 进行通信处理业务。

  • ⑤ Hystrix 负责处理服务超时熔断。

  • ⑥ Turbine 监控服务间的调用和熔断相关指标。

SpringCloud和Dobbo的区别:

(1)Dubbo的注册中心可以选择zookeeper,redis等多种;Spring Cloud:的注册中心只能用eureka或者自研。

(2)Dubbo通过rpc协议远程调用,直接通过socket通信,效率高;SpringCloud通过http协议调用。

PS:欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。

版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!

欢迎加入后端架构师交流群,在后台回复“学习”即可。

猜你还想看

阿里、腾讯、百度、华为、京东最新面试题汇集

这样统计代码执行耗时,才足够优雅!

假如计算机是中国人发明的,那代码应该这么写

真香!我终于干掉了该死的if-else

BAT等大厂Java面试经验总结

别找了,想获取 Java大厂面试题学习资料

扫下方二维码回复「手册」就好了



嘿,你在看吗

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值