明确了分布式系统开发所涉及的各个技术组件,接下来我们就需要引入主流的开发框架来实现这些技术组件。在Java世界中,面向分布式系统开发存在如下两大类开发框架的套件组合:
□ Spring Boot+Spring Cloud+MyBatis
□ Spring Boot+Dubbo+MyBatis
本节将展开讨论这两大类开发套件组合中的4款主流开源框架。
自2003年由Rod Johnson设计并实现以来,Spring经历了多个重大版本的发展和演进,形成了一个庞大的家族式技术生态圈。目前,Spring已经是Java EE领域最流行的开发框架,在全球各大企业中都得到了广泛应用。本节将梳理整个Spring家族的技术体系,并介绍其中具有代表性的开发框架。
从诞生之初,Spring就被认为是一种容器,其整体架构如图1-17所示。
图1-17 Spring基础框架整体架构图
我们先来看位于图1-17底部的“核心容器”部分,该部分包含一个容器所应该具备的主体功能,例如基于依赖注入(Dependency Injection,DI)的JavaBean处理机制、面向切面编程(Aspect Oriented Program,AOP)、上下文以及Spring自身所提供的表达式语言(Spring Expression Language,SpEL)等辅助功能。
在系统运行过程中,当我们使用一个对象时,需要动态提供它所依赖的其他对象,这一点可以通过依赖注入来实现。Spring会在适当的时机创建一个Bean,然后像注射器一样把它注入目标对象中,这样就完成了对各个对象之间依赖关系的控制。可以说,依赖注入是开发人员使用Spring框架的基本手段,我们可以通过依赖注入获取所需的各种Bean。Spring为开发人员提供了3种不同的依赖注入类型,分别是字段注入、构造器注入和Setter方法注入。
而所谓的切面,本质上解决的是关注点分离的问题。在面向对象编程的世界中,按照职责和定位,我们把一个应用程序拆分成多个对象,这些对象构成了不同的层次。而面向切面编程可以说是对面向对象编程的一种补充,目标是将一个应用程序抽象成各个切面,这样就可以把这些切面提取成独立的模块进行开发和维护。Spring为开发人员提供了连接点、通知、切点和切面等一系列概念来完成面向切面的编程模型。
我们再来看图1-17的上半部分,这里包含了构建应用程序所需要的两大部分技术组件,即数据访问组件和Web服务组件,它们也是日常开发过程中的常用组件。这两大部分组件包含的内容非常多,而且充分体现了Spring的集成性,框架内部整合了业界主流的数据库驱动、消息中间件、ORM(Object Relational Mapping,对象关系映射)等各种工具,开发人员可以根据需要灵活地调整和替换自己想要使用的工具。
从开发语言上讲,虽然Spring最广泛的应用场景是在Java领域,但当前的5.X版本也支持Kotlin、Groovy以及各种动态开发语言。
虽然Spring框架提供了一系列开发功能,但随着技术的不断演进,我们发现在使用Spring开发Web应用程序时不得不考虑如下所示的典型问题。
□ 如何简化各层组件的开发过程?
□ 如何简化对系统所使用的配置信息的管理工作?
□ 如何有效监控系统中各个应用程序的运行时状态?
□ 如何高效实现应用程序的部署?
上述问题集中暴露了传统Spring框架在开发过程中所缺乏的高效性和简单性。为了有效解决上述问题,Spring Boot应运而生。Spring Boot本质上是对传统Spring框架的封装和扩展,整体架构如图1-18所示。
图1-18 Spring Boot整体架构图
从图1-18中可以看到,在具备传统Spring框架所提供的各项开发功能的基础上,Spring Boot还提供了一些新的组件来简化开发过程,包括:
□ 自动配置:Spring Boot把传统Spring中基于XML的配置方式转换为Java Config;同时,对各种常见的功能组件均提供了默认的Spring Boot Starter依赖,从而简化配置。
□ 度量监控:基于Spring Boot提供的Actuator组件,我们可以通过RESTful接口获取JVM性能指标、线程工作状态等运行时信息;同时,也可以使用Admin Server实现对监控信息的可视化管理。
□ 一键部署:Spring Boot应用程序内置了Web容器,开发人员只需要直接执行打包好的JAR文件就能实现服务部署和运行,不需要预部署应用服务器。
相比于Spring,Spring Boot大幅度简化了常见开发场景的实现难度。同时,Spring Boot还充分考虑了安全性、测试性等一系列非功能性的开发需求。
在本节中,我们关注Spring Cloud框架,该框架专门用来开发微服务系统。
Spring Cloud天生具备一个优势,即它是Spring家庭的一员,而Spring在Java EE开发领域的强大地位给Spring Cloud起到了很好的推动作用。Spring Cloud与Spring基础框架、Spring Boot三者之间是从内核到应用再到扩展的关系,如图1-19所示。
图1-19 Spring Cloud与Spring基础框架、Spring Boot之间的关系示意图
在微服务架构中,我们将使用Spring Boot来开发单个微服务。而Spring Cloud构建在Spring Boot之上,继承了Spring Boot简单配置、快速开发、轻松部署的特点,让原本复杂的微服务开发工作变得相对容易上手。
技术组件的完备性是Spring Cloud的主要优势。Spring Cloud是一系列框架的有序集合,它利用Spring Boot在开发上的便利性巧妙地简化了微服务系统基础设施的开发过程,服务发现注册、服务网关、配置中心、消息总线、负载均衡、熔断器、数据监控等技术组件都可以基于Spring Boot的开发风格做到一键部署和启动。
Dubbo是阿里巴巴开源的一个分布式服务框架,在互联网行业得到了广泛的应用。Dubbo的核心功能为我们构建分布式系统提供了两大解决方案,即高性能和透明化的RPC实现方案,以及服务治理方案。Dubbo框架的基本架构如图1-20所示。
图1-20 Dubbo框架的基本架构图
就功能体系而言,Dubbo提供了透明化的RPC方案,开发人员通过简单配置,就可以像调用本地方法一样调用远程方法,没有任何API侵入。另外,Dubbo也具备完善的软件负载均衡及容错机制。
从服务治理角度来看,Dubbo支持服务的自动注册与发现,开发人员不再需要对服务提供者的地址进行硬编码。注册中心能够基于接口名来自动查询服务提供者的IP地址,并且实现对服务提供者的平滑添加或删除。这些功能使得Dubbo框架在具备远程过程调用能力的同时,还包含了一部分微服务构建能力。
在分布式系统开发过程中,除了Web应用程序以及分布式服务开发框架之外,我们还需要引入专门针对数据访问的数据持久化技术组件。MyBatis就是这样一款支持定制化SQL、存储过程以及高级映射的数据持久化框架。MyBatis对数据访问过程进行了高度抽象,几乎避开了所有的JDBC代码,并使用简单的XML或注解将POJO(Plain Old Java Object,普通Java对象)映射成数据库中的记录。
本质上,MyBatis是一款ORM框架,内部通过一组核心对象完成对SQL语句的解析和执行。MyBatis的整体执行流程如图1-21所示。
图1-21 MyBatis的整体执行流程图
MyBatis应用程序根据XML配置文件创建SqlSessionFactory,SqlSessionFactory再根据配置(来源于配置文件或Java代码注解)获取一个SqlSession。SqlSession就是一个可执行的最小单元对象,包含了SQL执行需要的所有方法。开发人员可以通过SqlSession对象直接运行SQL语句,从而完成对数据的增删改查和事务提交等操作。