Spring.io 源码架构分析

先抛出几个标题,

谁有关于SpringMvc 比较不错的项目

求推荐几个SSH或者pringMVC的实例项目源码

如何具备模块设计架构能力,独立完成模块设计和实现

这些困扰的问题,在本文已有了答案。以下将针对spring.io背后的架构原理,抛砖引玉,力争以朴实描述将实际开发中的问题一一拎清。

关键

  • 主角:sagan
  • 描述:spring.io 开源项目,即Spring官方网站的项目,其代表了业界的较高水准。不论是初学者还是在ssh/ssi架构下耕作的工程师,都可以从中受益。
  • 关键词:Spring MVC, hibernate, spring data jpa, AOP, Gradle

源码本地启动

git clone https://github.com/spring-io/sagan.git
cd sagan
gradlew bootRun

浏览器访问: http://localhost:8080

项目能快速启动原因:Spring Boot

项目目录结构

.
|-- .settings eclipse配置
|-- gradle gradle构建相关
|-- sagan-client 整站web静态资源,前端
|-- sagan-common 业务数据结构,包含blog、guides、projects、search 及通用工具集
|-- sagan-indexer index构建,一个SpringBootApplication,和site分两个进程分别启动
|-- sagan-site web应用入口,涉及mvc rest为入口的逻辑分发和security
|-- style 开发IDE代码格式统一配置
|-- util 开发过程用到的批处理shell脚本,如做数据重置
|-- wiki 项目wiki页,git子模块

通过settings.gradle可以看出,

四个核心模块 ‘sagan-common’, ‘sagan-site’, ‘sagan-indexer’, ‘sagan-client’

为什么这么分?

分析出的原因:

  • 解耦模块,便于协作

使程序员关注1-2个文件夹,随着项目进展,甚至无需检出/编译/运行 不相干模块;以单元测试用例,接口做交付。

  • 便于部署和分布式集群

client可部署cdn,也可构建时拷贝到site;common+indexer做单点部署,独立于site,以避免多点部署的重复任务;common+site做分布式部署,处理并发请求业务,做负载均衡更自由;数据仓库、搜索引擎独立部署,也可使用云托管。

sagan-common

  • 没有README.md 是一个遗憾。
  • 纯JAVA,业务数据结构定义,数据库关系映射,Bean。MVC中的Module

包含业务功能模块: blog guides projects

.
|-- blog    文件夹下主要是定义
|   |-- support 偏重业务逻辑
|-- guides 
|-- projects 
|-- serach 搜索功能
|-- support 

  • Post/PostCategory/PostFormat数据字段:

使用了数据绑定机制进行有效性验证,如@NotEmpty @DateTimeFormat(pattern = “yyyy-MM-dd HH:mm”)

  • 相关Service:BlogService、MarkDown相关处理Service:

从Interface定义到实现implements类…以@Service 标记,Service之间存在互相引用关系。

  • JPA:

PostRepository 持久化应用Spring Data 封装方案

按业务功能划分与按层划分对比:

.
|-- service
|   |-- impl
|   |   |-- DefaultBlogServiceImpl
|   |   |-- DefaultGuidesServiceImpl
|   |   |-- DefaultProjectsServiceImpl
|   |-- BlogService
|   |-- GuidesService
|   |-- ProjectsService
|-- dao
|   |-- impl
|   |   |-- DefaultBlogDaoImpl
|   |   |-- DefaultGuidesDaoImpl
|   |   |-- DefaultProjectsDaoImpl
|   |-- BlogDao
|   |-- GuidesDao
|   |-- ProjectsDao

曾在项目中以上述层结构划分,该方案对比按业务划分的不足点已经很明显,如:

  1. PostSummary放service/impl下是否合理?有没有必要为PostSummary写interface?
  2. Blog使用新系统,本系统内无需保留时,哪些属于Blog的业务范畴?
  3. Dao已经被Spring Data封装好了,还有必要再写一遍?

sagan-site

涉及到

  • MVC中的View 和 Control

@Controller @RequestMapping为页面入口,获取数据,调用“sagan-common” 做数据处理,return 给resources/templates展示结果

  • SecurityConfig.java

从build.gradle引入spring security模块对/admin Controller进行拦截

  • 搜索引擎服务器Eleasticsearch独立,未连接会导致搜索服务出错
  • HealthCheck\RewriteFilter 的拦截

sagan-client

到前端部分,该部分涉及到页面动态展示效果,如点击,图片展示

  • gulp
  • jspm
  • npm

前端框架和工具繁多,各具特色,此处不展开

sagan-indexer

Elasticsearch 和数据处理任务

涉及到对页面定期抓取,数据结构化,数据归档,索引处理等任务。

这块是在site\client完善后重点突破的方向,大数据处理、数据挖掘的拓深,数据价值从中体现。项目中这块处理的是基础部分。

总结

进一步对项目研究,除了优秀的模块结构划分,细节上的深度处理,足够全面的测试用例,开发运维的全盘考虑,是该项目优秀的关键点。

技术标杆已立于此,实际操作中,工作量与开发团队可利用资源的矛盾、技术点的优先级,何时推动?3个人的团队该怎么去做、30人的团队该怎么去做项目,是考验架构师/项目经理的所在。

出处:http://newrey.com/spring-agile-practise/

Written on March 21, 2017

请我喝杯咖啡吧