如何实现支持快速交付的技术中台战略 2021-09-09 程序之旅 暂无评论 618 次阅读 ## 如何实现支持快速交付的技术中台战略 以往建设的系统都分为前台和后台,前台是与用户交互的UI界面,后台是服务端完成的业务逻辑操作。然而在我开发的很多系统中,有一些内容是共用的部分,在未来的开发系统中也要使用到,所以如果能把内容提取出来,做成共用主键,那么在未来开发系统就简单了,不用每次都重头开发。 > 公用的组件既包含前台的界面,也包含后台的逻辑,被称为“中台”。 > > 中台:将以往业务系统中可以复用的前台与后台代码,剥离个性、提取共性,形成的公用组件。 中台的分类:业务中台、技术中台和数据中台。 业务中台:将抽象的业务组件,做成微服务,各个业务系统都可以使用。 技术中台:封装各个业务系统所要采用的技术框架,设计出统一的API。 数据中台:整理各个业务系统的数据,建立数据存储与运算的平台。为各个系统的分析与利用提供支持。 ### 大前端 + 技术中台 在开发团队中有一个架构支持团队,他们通过架构强大的技术中台,将软件开发中的许多技术框架封装在平台中。有了这个平台,其他的技术团队都基于这个平台进行开发,这样既能降低业务开发的工作量,提高开发速度,又可以降低技术门槛。 在 Martin Fowler 《企业应用架构模式》中提及的`命令与查询职责分离(CQRS)模式`,将系统按照职责划分为,命令(即增删改操作)与查询两个部分。 > 所有命令部分的增删改操作,应当采用领域驱动设计的思想进行软件设计,从而更好的应对大规模复杂应用。 > > 所有的查询功能不适用与领域模型,应当采用实物脚本模式(Transaction Script),即直接通过 SQL 语句进行查询。 ### 增删改的架构设计 ![image-20210908231535622](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/typecho/image-20210908231535622.png) 所有的请求到是调用一个 Controller,前端传给 Controller 的参数都是不一样的,这样的设计即保障了安全性,又实现了前后端分离,将前端代码与后端解耦。 #### 单 Controller 的设计 前段访问 OrmController,即 http://localhost:8001/orm/{bean}/{method}。要注意的是,这个请求既可以是 GET 请求,也可以是 POST 请求。 - bean:配置在 spring 中的 bean.id - method:bean 中需要调用的方法 > - 如果要调用的方法有值对象,必须将值对象放在方法的第一个参数上 > - 如果要调用的方法既有值对象,又有其他参数,则值对象中的属性与其他参数都放在该 Json 对象中 > > PS: 在实际项目中需要在 OrmController 前进行权限校验,来规范前端可以调用的方法,建议使用服务网关或 filter 进行校验 #### OrmController 的流程设计 1. 根据前端参数 bean,从 Spring 中获得 Service 2. 根据前端参数 method,通过反射获得调用方法 3. 通过反射获得调用方法的第一个参数,从前端作为值对象 4. 根据反射获得值对象的所有属性,Json 中获得对应属性的值,写入值对象 5. 根据前端Js0n获得其他参数 6. 将值对象与其他参数,使用反射调用,Service中的 method方法 #### 单 Dao 的设计 在 xml 配置文件中添加值对象与表的字段对应。值对象中值对象中可以有很多的属性变量,但只有最终作持久化的属性变量才需要配置。在每个 Service 中使用 Spring 注入统一的 BasiceDao,如果是要使用 DDD 的功能支持,注入通用仓库 Repository,如果使用 Redis 缓存,注入 RepositoryWithCache。 > 基于本框架进行的业务开发,包括 Spring的配置、 MyBatis 的配置、VObj的配置,建议都采用XML文件的形式,而不要采用注解 1. 单 Dao 调用 VobjFactory. getVobj(class) 获得配置信息 vobj 2. 根据 VoBj.getTable() 获得对应的表名 3. for(Property prop: voBj.getPreperties()){ - 通过 prop.getColumn() 获得值对象对应的字段 - 运用反射从值对象中获得所有属性及其对应的值 - 通过以上参数形成 SQL 语句 } 4. 通过SQL语句执行数据库操作 ### 查询功能的架构设计 ![image-20210909000354501](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/typecho/image-20210909000354501.png) 查询功能的 Service只有一个,查询部分不需要传递 method 参数。进行查询时,前段输入 HTTP 请求,例如:http://localhost:8001/query/{bean}?gender=male&male&size=10 - bean:置在 spring 中的service #### 查询部分的单 Controller 的流程设计 1. 从前端获得bean、page、size、 count,以及查询参数 2. 根据 bean 从 spring 中获得相应的 Serivce 3. 从前端获得查询参数 Json,将其转换为 Map 4. 执行 service.query(map) 5. 执行完查询后,以不同形式返回给前端 例如 MyBatis 的 Mapper 文件 ```xml and id =#{id} select count(*)from( )count