初创期应用架构实践 (2):Java 语言的框架选型

叁叁肆2018-11-14 09:06

欢迎访问网易云社区,了解更多网易技术产品运营经验。


2. Java 语言的框架选型


下面我们选择最普遍的一种业务类型,也就是使用 Java 语言做 Web 开发,来说明如何 进行框架选型。


控制反转及依赖注入 

Java 是一门面向对象的编程语言,我们在应用系统设计的时候,往往也会采用面向对 象的方式来设计。在使用面向对象的方式来设计系统实现的时候,我们面对的业务逻辑,往往涉及两个或是更多的类通过彼此的合作来实现,这使得每个对象都需要获取或者实例 化与其合作的对象。如果这个过程要靠对象自身主动装配的话,就会导致代码高度耦合并 且难以维护和调试。当我们更新了某一个模块的实现时,即使其接口没有任何变化,由于 是代码中应用主动实例化或者主动去获取的,我们将不得不修改相应的代码,还需要对项 目重新编译,浪费大量的精力和时间。


为了解决这样的问题,控制反转的概念被提出。一个支持控制反转的框架容器,可以 根据用户配置,去完成相关对象的实例化,并且装配好对象间的依赖,完成依赖注入。当 实现改动的时候,我们只需要修改一下配置即可实现新版本的替换,而不需要在代码中主 动去初始化对象,主动去装配对象的依赖。使用控制反转的设计方法,可以使代码间的耦 合延迟到运行时进行,通过配置的方式,由相应的框架来完成对象的创建及装配。


目前已有的控制反转的容器有 PicoContainer、Apache Excalibur、Spring IoC 等,其中 最流行的也是名气最大的是 Spring IoC。Spring IoC 提供了基于 Annotation 及 XML 的两种 配置方式,用户可以根据实际情况具体选择。总的来说,使用 Annotation 的方式,比较简 单,因为 Annotation 是写在代码中的,与代码有耦合;使用 XML 的方式,相对烦琐,因 为完全与代码无耦合。Spring IoC 使用反射机制,支持多种方式的对象的创建及依赖注入, 可以满足我们的绝大部分需求。Spring IoC 作为 Spring 框架的一部分,文档丰富,官方维 护活跃,相比于其他的控制反转框架,Spring IoC 是一个不错的技术选择。


MVC 模式 

作为最普遍的一个 Web 应用,最常见的一种软件架构模式是 MVC 模式。MVC 模式把 一个系统分为 3 部分:模型(Model)、视图(View)和控制器(Controller)。视图就是直 接面向最终用户的界面,对于一个 Web 应用来说,可以认为就是展示给用户的网页渲染。 模型是程序员编写程序应完成核心功能的地方,如果其主要功能就是进行增删查改的话, 那么模型可以认为主要与数据库打交道、负责数据访问,以及完成对数据库的相关操作。 控制器的主要作用是控制应用的行为,负责接收派发请求,与模型交互,然后将相关的结 果投递给视图,由视图来决定怎么向用户展示,视图往往还会接受来自用户的操作。MVC 之间的关系如图 3-1 所示。 


图 3-1 MVC 之间的关系


在 MVC 模型中,模型不关心具体的数据是如何被展示以及如何被操作的;控制器不 关心模型中的数据是从哪里来的,也不关心视图到底是怎么展示数据的;视图仅仅关心数 据如何被呈现,并不关心这些数据是如何通过逻辑处理获取的。


使用这种分层模型,层与层的职责分明,当我们有需求变动时,可以快速响应。比如, 数据库要进行替换,从 Oracle 迁移到 MySQL,我们仅仅需要改动模型层的相关接口的实 现代码即可,而不会影响到视图与控制器。当我们的应用需要更友好地向用户展示数据的 时候,我们仅仅需要更新视图代码,对于 Web 应用来说,一般是前端页面的代码,不会影 响到模型及控制器。当我们需要对一些请求处理逻辑进行调整的时候,仅仅需要调整控制 器即可,不会影响到具体的模型及视图。对于应用开发来说,不同的模块可以独立开发, 在后续的可扩展性,可维护性方面都好很多。由于各个模块代码是解耦的,也提高了代码 的可重用性,比如同样的一个视图可以用于不同的应用,无非是渲染的数据有不同,同样 的一个模型中的数据操作也可用于不同的应用。


在 Java 语言中,常见的 MVC 框架有 Struts 2、Spring MVC 等。Spring MVC 是目前很 流行的 Web MVC 框架,该框架上手简单、文档齐全、社区活跃,很多学校及培训机构都 有 Spring MVC 的课程,因此可以降低招聘成本,容易招到合适的人。同时,它还可以与 Spring 框架无缝集成,Spring 作为一个企业级应用开发框架,提供了包括控制反转容器等 组件,使用这些组件,能够提高我们的开发效率,避免重造轮子。


相比于 Struts 2,Spring MVC 的基于方法设计实现的控制器,比起 Structs 2 基于 Action 类的实现更灵活,学习入门也更直观简单。由于不用每次都去实例化一个类,因此性能上 也会稍好。Spring MVC 对 URL 映射处理也更优雅,可以更好地支持 RESTful 风格的 API。 再加上近年来,Struts 2 出现了几次安全漏洞,因此,对于 MVC 框架选型来说,Spring MVC 是一个不错的选择。


数据库持久化框架 

在 MVC 模式中,很多场景下,模型的具体业务逻辑都是对数据库的增删改查。由于 Java 是一门面向对象的语言,数据库往往都是关系型数据库,我们需要一个框架将数据库 中的数据与业务对象之间做一个关联,当我们需要访问数据库的时候,只需要与映射过的 业务对象打交道就好了。否则,如果每次数据库访问都是手动写 SQL 语句,通过 JDBC 执 行,我们的代码里面就会有大量的 SQL 拼接代码,给维护带来困难。


在 Java 语言中,Hibernate 是一个流行的数据库持久化框架,它能够自动生成并执行 SQL 语句,完成对数据库中的记录到业务对象的自动映射(对象关系映射,ORM),将对 数据库的修改操作转换成对业务对象的操作,数据库无关性好。比如,通过修改一个自动 映射业务对象的某一个属性的值,就可以自动完成与其对应的数据库中记录的修改。通过 这种面向对象的编程方式去操作数据库,给我们的编程带来了便利,也避免了代码中拼接 SQL 语句。


在使用 Hibernate 的时候,由于 SQL 语句往往都是自动生成并执行的,这些自动生成 的 SQL 语句并没有很好地被优化,对于一些复杂查询感到吃力。另外,由于性能的原因, 很多时候,我们需要对 SQL 语句进行优化。相比于 Hibernate,另一个流行的数据库持久框 架 Mybatis 着重于业务对象与 SQL 语句之间的映射关系,用户可以手动书写 SQL 语句,对 SQL 语句进行优化,并通过配置文件来指定 SQL 语句的参数如何映射,返回的结果集到业 务对象如何映射,Mybatis 会根据用户的配置来完成 SQL 语句参数的映射及对返回结果集 的处理。


在实际应用中,刚开始应用业务较简单,使用 Hibernate 有很高的开发效率,因为可 以完全不关心 SQL 语句,对数据库的所有操作都映射成了对业务对象的操作。但是随着 业务的发展,所需要的查询会越来越复杂,此时自动生成的 SQL 往往不再满足具体的查 询需求。而使用 Mybatis 的话,由于可以手动写 SQL,对 SQL 优化,在面对复杂查询方 面会更得力。Mybatis 这种“半自动化”的特性带来了极大的灵活性,因此,考虑到后续 可能的复杂查询需求,相比于 Hibernate,使用 Mybatis 是一个不错的选择。当然,这个 选型不是绝对的,我们也可以根据不同的场景,混合使用这两个框架,来应对不同类型 的查询需求。


运行时的 JVM 参数配置

使用 Java 完成应用程序开发后,在运行时,通常需要根据实际业务情况去调整 JVM 的一些参数配置。最常见的就是要调整运行时的堆内存大小参数。其单位一般配置使用 M 或 G,对于 Tomcat 来说,Tomcat 使用一个环境变量 JAVA_OPTS 来实现 JVM 配置的注入, 因此我们只需要在启动容器的时候,定义一下这个环境变量即可,比如可以将 JAVA_OPTS 这个环境变量的值定义为“-Xms512m -Xmx512m”, 这样就定义了 JVM 在运行时初始堆大 小与最大堆大小都是 512m。对于服务端应用来说,我们一般把-Xms 跟-Xmx 设为一样大, 防止运行过程中动态调整堆内存。


文章节选自《云原生应用架构实践》 网易云基础服务架构团队 著


网易云计算基础服务深度整合了 IaaSPaaS 及容器技术,提供弹性计算、DevOps 工具链及微服务基础设施等服务,帮助企业解决 IT、架构及运维等问题,使企业更聚焦于业务,是新一代的云计算平台。点击可免费试用