论数据访问层设计技术及其应用
2016
试题三论数据访问层设计技术及其应用
在信息系统的开发与建设中,分层设计是一种常见的架构设计方法,区分层次的目的是为了实现“高内聚低耦合”的思想。分层设计能有效简化系统复杂性,使设计结构清晰,便于提高复用能力和产品维护能力。一种常见的层次划分模型是将信息系统分为表现层、业务逻辑层和数据访问层。信息系统一般以数据为中心,数据访问层的设计是系统设计中的重要内容。数据访问层需要针对需求,提供对数据源读写的访问接口;在保障性能的前提下,数据访问层应具有良好的封装性、可移植性,以及数据库无关性。请围绕“论数据访问层设计技术及其应用”论题,依次从以下三个方面进行论述。
1.概要叙述你参与管理和开发的与数据访问层设计有关的软件项目,以及你在其中所担任的主要工作。
2.详细论述常见的数据访问层设计技术及其所包含的主要内容。
3.结合你参与管理和开发的实际项目,具体说明采用了哪种数据访问层设计技术,并叙述具体实施过程以及应用效果。

摘要:
2022年3月,我负责了某公司基于云原生理念的“自动化运维系统”的建设项目,由我担任系统架构设计师,负责系统架构设计工作,在该系统架构设计中,我们采用分层架构,主要分为表示层、业务逻辑层和数据访问层,在数据访问层,我们使用ORM的方式进行数据的获取,将这些ORM数据操作逻辑封装为DAO,给业务逻辑层调用,同时还使用了离线数据的方式来存储非实时数据,本文针对数据访问层的需求分析、设计和实现过程进行说明。该项目总投入近450万,历时15个月,于2023年6月交付至今,不仅帮助运维人员高效、安全的管理云上应用和后端服务器资源,同时帮助开发和测试人员实现应用的快速迭代和测试,大大提升了团队之间的协作效率,消除了运维和开发之间的壁垒,得到了用户的一致好评。
正文:
随着云原生技术的发展,企业也逐渐引入相关技术,在基础设施层,越来越多的企业开始购买云上服务器,如应用服务器企业可选择阿里云的ECS服务器,数据库服务器企业可选择阿里云的RDS,DNS服务企业可选择阿里云的域名解析,云上资源购买十分方便,在页面中点击几下即可购买成功,但在实际工作中,不能随意购买,需要结合企业成本和服务器资源使用情况来综合考量,避免资源浪费,所以对云上资源的成本、资源使用情况的可视化管理就很重要。同时,随着容器技术和微服务架构的发展,企业应用也都选择微服务架构,采用容器的方式部署在kubernets集群中,在这种情况下,应用的快速发布、容器资源管理、监控告警就显得尤为重要。
为了实现云上资源的可视化管理和基于云原生应用的快速发布,我所在的公司决定开发一个“自动化运维”系统,我们称之为云平台,并在2022年3月正式启动该项目的建设工作,我被任命为系统架构设计师,负责系统架构设计工作。该项目总投入450万元人民币,建设周期从2022年3月至2023年6月截止,历时15个月。该系统主要包括应用中心、发布中心、监控中心、成本中心、容器中心、权限管理和变更管理七大模块,应用中心是整个系统的数据中心,其他模块的功能都围绕“应用”来进行资源的展示和操作;发布中心以“应用”为单位,向用户提供应用的快速发布功能;监控中心以“应用”为单位,向用户提供应用的监控告警功能;成本中心以“应用”为单位,向用户展示每个应用的成本;容器中心以“应用”为单位,展示应用的相关容器资源;权限管理是对用户分类,使得不同的用户可看到不同的模块;变更管理主要对云上资源的变更进行管控,避免对云上资源的误操作导致系统故障。
本项目采用分层架构的方式进行架构设计,主要分为表现层、业务逻辑层和数据访问层,分层架构的设计可以很好的降低代码逻辑的耦合度,提高系统的可扩展性。本文主要介绍数据访问层的设计。
数据访问层的技术主要包含如下:
在线访问,例如Java中的Mybatis框架,通过在xml文件中书写SQL语句,然后将SQL的返回值放到对应的Java类中,这个种方式需要编程人员熟练掌握SQL语句的书写,优点是灵活性很高;
Orm对象关系映射方式,例如Java中的Hibernate和Golang语言中的Gorm,程序员不需要写Sql语句,只需要定义数据库中表对应的类,通过Create、Update等方法的调用就能进行数据的操作,操作简单,适合表结构简单,业务逻辑不需要跨多个表进行数据操作的场景;
Dao方式,将数据访问层的逻辑进行封装,暴露给上层Service的只是一些数据操作的接口,当数据访问层进行逻辑修改、切换数据库或增加数据库类型时,上层逻辑不需要变更,提升了数据访问层的逻辑独立性。
离线数据访问,将历史数据或非实时数据进行收集统计,供用户后期查询使用。
在本项目中,主要使用Orm方式进行数据的操作,使用Dao的方式对数据的操作逻辑进行封装,使用离线数据的方式提供应用相关信息的搜索功能,下面从需求分析到技术设计分别详细介绍。
在需求分析阶段,首先根据需求设计用例图,以应用中心为例,开发希望在平台中进行新功能的快速发布和迭代,测试人员希望能在平台中便于查看相关日志信息排查报错,运维人员希望能在平台中管理所有的云上资源,配置监控告警,对云上资源进行维护,领导层希望能在平台中查看所有资源的每个成本、每日成本和是否存在资源浪费的情况。
在概要设计阶段,主要设计E-R图,根据以上需求,以应用中心为例,一个应用可以有多个环境,一个环境可有多个应用,应用和环境是多对多的关系,一个集群可有多个应用,一个应用只能属于一个集群,集群和应用是一对多的关系。
在数据的操作中,我们选择了Golang语言的Gorm框架,由于我们是基于云原生理念的运维平台,云原生架构主要开发语言是Golang语言,所以我们选择了Golang语言作为编程语言,数据操作框架选择了简单、容易理解的Gorm框架,以应用中心为例,首先设计好表结构,然后在程序中设计每个表对应的程序类文件,最后在在Main函数中书写代码建立数据库连接和表的创建。
表和类的关系建立之后,我们对数据的操作进行封装,该层为Dao层,负责业务逻辑中所有相关的数据库中数据的操作逻辑,在该层包含应用、环境、集群等的新增、删除、按照字段修改、按照行修改、根据某个字段的多行查询和单行查询,Dao层的数据操作逻辑可以给多个上层Service类中进行调用。
最后是离线数据的应用,在应用中心的应用搜索功能中,相关信息不需要是实时数据,所以我们采用了离线的方式进行存储,应用相关信息众多,包含应用名、环境、集群、实例名、实例Ip、集群节点名、集群节点Ip、负责人、部门等信息,维度很多,用户可能根据任意字段进行搜索,这些信息有的分布在mysql数据库的多个表中,有的需要通过Kubernets的Api获取,数据存储位置多样,为了搜索信息的快速返回和降低开发难度,我们书写定时任务,将这些分散的数据进行重新组合,存储到Elasticsearch中,进行数据集中管理,开发人员只需要调用Elasticsearch的Api,将用户搜索的关键字作为参数,就能很方便的实现应用相关信息的模糊搜索和精确搜索。
经过近15个月的项目开发,“自动化运维系统”顺利投入使用,开发人员和测试人员可通过该系统实现应用发布的自动化,无需运维人员的协助,消除了运维和开发的固有壁垒;运维人员可通过该系统高效管理云上资源,实时查看云上资源的使用率和成本,减少资源浪费,提高资源使用率。当然,在本项目中还有一些不足之处,在进行云上资源成本统计时,最初我们通过阿里云的费用接口来拉取各个产品的成本,由于产品很多,写了很多逻辑,后来通过和阿里云的技术人员沟通,可以在阿里云平台上将所有产品的费用一键转储到oss中,直接通过oss的sdk即可快速查询所有产品的费用,后来我们开发人员快速修改下成本获取的逻辑,并没有对项目产生什么影响。由于架构合理且考虑周全,进展顺利,得到了公司技术人员的认可,大大提高了技术团队的协作效率。