楔子
大部分情况下,普通人能接触到的项目都不会有什么技术含量,基本就是xxx管理系统,能参与的无非就是一些增删改查。这就导致面试的时候,在项目经验上缺乏竞争力。
那么,可不可以参考市面上优秀的开源项目,为自己量身定制一套项目经验呢?
思路
选定github
上一个开源项目:数据中台,编写一个项目经验。
下面是要解决的问题:
- 项目的背景是什么,都有哪些功能?项目总体都包含哪些模块呢?
- 我负责哪些模块呢?我负责了元数据管理这个微服务,这个服务都包含了哪些模块。
- 这些模块都是什么,大体实现了什么功能,有哪些联系
- 哪些是重点要说的,哪里有重难点技术。
项目经验总结
项目背景
YuAllData
数据中台旨在解决[编一个行业]数据分散在各个省份的数据孤岛问题,通过一个集中化的数据管理平台实现数据的统一,打破地域限制。
项目模块
主要包含了如下模块:
- 元数据管理模块
- 系统管理模块
- 数据集成模块
- 数据模型模块
- 数据标准管理模块
- 数据比对管理模块
- 等
元数据管理
我负责的是元数据管理模块,元数据(Metadata
)指的是数据的结构化信息,主要包含了数据源、数据表和数据字段,帮助用户进行数据的管理,主要包含了如下几个功能:
数据源
集成多种类型的数据库,如MySQL
、PostgreSQL
、Oracle
等。
新增或修改的时候,大体分为三步:
- 第一步:选择数据源类型,填写数据源名称(自定义的一个名称),选择启用或禁用,以及填写备注信息
- 第二步:录入主机、端口、数据库名称、用户名和密码
- 第三步:进行连通性检测,如果能够成功连接,保存信息
保存信息后,数据源记录的同步状态默认为未同步。此时需要点击同步按钮令其发起异步的数据同步。
过程中可以使用刷新缓存按钮看异步任务是否执行完成,刷新缓存 也是一个异步任务,先删除redis
中的数据(数据源、元数据表、元数据字段),然后重新查询放入redis
。
数据字段
数据字段的作用是能够看到所有数据源的表信息,以及每一个表都有哪些字段。
页面左侧是一个二级树,一级数据源,二级表名。
页面右侧分页展示了所有字段信息;右侧页面可以输入字段名称,模糊查询所有相关的字段,并且携带了字段归属于哪个表的信息。
点击页面左侧树的结点,可以仅展示一个数据源或一张表的所有字段信息。
每一个字段行右侧会有操作按钮,点击详情可以查看字段的具体信息,且可以添加变更记录(修改字段信息)。此处的变更记录仅仅是一个注释的作用,记录字段的版本变更,不会实际改变字段。
行级变更
与数据字段功能点配合使用,也是做字段的版本管理。只不过范围更大一点,能查看所有的变更记录,并进行管理。
数据地图
数据地图的作用是让用户快速查看某个表的结构信息。
选择数据库和数据表,查询出表的所有列,以树的形式,结合echarts
显示出来(echarts
是graph
关系图模式)。
该树大概分三级,一级为数据源名称、二级为表名称,三级为所有列名称。
数据查询
先输入一个字符串,然后选择类型,数据库、数据表还是数据源(字段),实现模糊查询。
SQL控制台
作用是帮助用户测试sql
语句,支持所有数据源。
选择数据源,输入sql
语句,运行、停止、格式化和重置。
数据市场
包含数据接口、API
日志、API Mask
几个功能。
数据接口
数据接口的作用是以可视化无代码的方式生成查询接口。
点击新增,弹出一个窗口,分为三步:
-
第一步-属性配置
API
名称:随意填写,不可重复API
版本:如v1.0.0
,依然是一个随意填写的字符串API
路径:不可重复,/
开头是可选的(实际源码/
是必填的,显然有问题)- 请求方式:
GET
或POST
两种 - 返回格式:只有
JSON
IP
黑名单:多个用英文的逗号分隔- 是否限流,如每
60
秒限制请求5
次 - 状态:默认为待发布,不可修改
- 备注
-
第二步-执行配置:
- 配置方式:分表引导模式和脚本模式
- 数据源:从已同步和启用的数据源中选择一个
- 数据库表
- 字段列表:每一行都可以勾选是否作为请求参数、或返回参数
-
第三步-参数配置:
- 针对选择的请求参数和返回参数进行配置
- 返回参数主要是示例值,当然可以添加可不添加
- 请求参数:可空、示例值、默认值
保存后,数据接口是待发布的。出于表设计规范和性能优化的目的,限流配置、执行配置、请求参数、返回参数都以MySQL
中的JSON
格式保存。
API日志
专门记录我们自己通过平台添加的数据接口的调用日志。
源码中的market-service-mapping
服务有数据日志相关的接口,但是没有得到调用。此功能刚好可以在数据接口控制器的postHanlde处处理,这部分刚好是空的。
API Mask(脱敏)
API
脱敏是指在通过API
传输或返回数据时,对敏感信息进行处理,以保护用户隐私或企业机密。脱敏的目的是确保敏感数据在传输或存储过程中不会被泄露或滥用,同时仍然保持数据的可用性和功能性。
选择一个数据接口,可以为其中的字段配置脱敏规则,有以下几种可选的配置:
- 正则替换:包含中文姓名、身份证号、固定电话、手机号码、地址、电子邮箱、银行卡号、公司开户银行联号等预设的正则规则;
- 加密算法:包含
BASE64
、MD5
、SHA_1
、SHA_256
、AES
和DES
。
比如现在有一个字符串字段,名为name
,我为它选择了AES
的加密方式。此时对应的数据接口就会受到影响:
- 删除:因为脱敏数据的存在,无法删除;
- 调用:因为存在了脱敏规则,所以会进行脱敏处理,详见数据接口的调用逻辑;
注意,同一数据接口同时启用的脱敏规则只能有一个。
简历上的项目经验怎么写
项目名称 :YuAllData
数据中台
项目时间:xxxx.xx - 至今
项目角色:核心开发工程师
项目简介 :YuAllData
数据中台旨在解决[编一个合适的行业]数据分散在各个省份的数据孤岛问题,通过一个集中化的数据管理平台实现数据的统一,打破地域限制。
技术栈 :jdk1.8
、SpringBoot
、SpringCloud
、MyBatisPlus
、MySQL
、RabbitMQ
、MySQL
负责模块:
- 元数据管理模块:提供针对数据源、数据表、数据字段的管理,包含数据源、数据字段、行级变更、数据地图、数据查询、
SQL
控制台、数据授权功能。 - 数据市场模块:通过可视化的方式快速创建查询接口,实现无代码的接口开发。包含数据接口、
API
日志、API
脱敏功能。
项目微服务介绍
实际介绍的时候要简略
YuAllData
数据中台主要包含了如下微服务:
eureka
注册中心conifg
配置中心gateway
网关- 系统基础支持服务
- 系统管理服务
- 元数据管理
- 数据市场
- 数据标准
- 数据比对
- 数据安全
- 数据质量
等等。我负责的是元数据管理模块和数据市场模块。
在元数据管理模块中,元数据(Metadata
)指的是数据的结构化信息,主要包含了数据源、数据表和数据字段。在数据源功能点中,根据数据源的类型、主机、端口、用户名、密码即可创建一个数据源,通过连通性检测后,发起一个异步操作,将数据源中所有的表,表中所有的字段都记录下来,最后刷新缓存(元数据、元数据授权都会写入redis
缓存,供其他功能点使用)。数据字段、数据地图、数据查询为元数据提供了查询功能,数据授权控制了不同角色对于元数据的操作权限。数据字段中还可以记录字段的版本变更记录,此处存在一个工作流,每次有需求修改字段信息(注释、类型等)时,都必须在此处记录,在此处记录不会实际修改字段信息。行级变更则是对于字段的版本变更记录的统一管理。
数据市场模块提供了以低代码的方式创建查询接口的功能。在数据接口功能点,可以创建数据接口,分为三步:属性配置、执行配置和参数配置。属性配置可以配置接口的基础信息,包括名称、路径、版本号、请求方式(GET``和POST
)、ip
黑名单,限流等。执行配置可选表引导模式或脚本模式,表引导模式是针对单表的查询语句,选择数据源和数据表后,显示所有字段,每一个字段都可以勾选作为请求参数或作为响应参数,脚本模式针对联表场景需手动写sql
语句。最后一步是参数配置,针对请求参数,可配置是否可空、示例值和默认值,针对响应参数可配置示例值。此时就可以添加接口,默认未发布,发布后即可进行接口的调用。接口调用过程会记录API
日志,在API
脱敏可以配置字符串类字段的加解密规则,如Sm4
、Aes
、Des
等等。
项目难点介绍
难点就定位在接口的发布和调用上。很难很复杂,你说它是一个难点不为过。
接口的发布
数据接口新建后,默认是未发布的。出于单独记录数据接口日志的目的,自定义的数据接口和API日志都在market-mapping
服务上。该服务使用@RabbitListener
注解绑定了fanout类型的交换机。在数据市场服务点击发布后,就会向指定的交换机推送一个消息,里面包含了接口的标识。
market-mapping
服务的MQ接收到消息后,做了两步操作:
- 将请求方式+请求路径作为key,数据接口实体作为value,存入全局的ConcurrentHashMap类型的静态变量中;
- 组装RequestMappingInfo,然后调用RequestMappingHandlerMapping的registerMapping方法注册接口,且指定处理请求的目标对象和目标方法。
接口的调用
RequestHandler是所有数据接口统一的控制器,可以接收@PathVariable、@RequestParam、@RequestBody三种类型的参数。接口具体的执行逻辑:
- 组合参数:创建一个map统一所有参数;
- 从
HttpServletRequest
对象中解析得到数据接口实体; - 使用Jackson的ObjectMapper将Object类型的数据接口实体转换为具体类型;
- 执行前置拦截器,进行密钥校验、黑名单校验、参数校验和限流校验;
- 调用接口,根据数据源的连接信息组装动态sql,然后执行,若存在脱敏规则,进行并行流式脱敏。
- 执行后置拦截器:记录api日志
- 进行响应:返回接口执行结果