如何编造一个项目经验?

楔子

大部分情况下,普通人能接触到的项目都不会有什么技术含量,基本就是xxx管理系统,能参与的无非就是一些增删改查。这就导致面试的时候,在项目经验上缺乏竞争力。

那么,可不可以参考市面上优秀的开源项目,为自己量身定制一套项目经验呢?

思路

选定github上一个开源项目:数据中台,编写一个项目经验。

下面是要解决的问题:

  1. 项目的背景是什么,都有哪些功能?项目总体都包含哪些模块呢?
  2. 我负责哪些模块呢?我负责了元数据管理这个微服务,这个服务都包含了哪些模块。
  3. 这些模块都是什么,大体实现了什么功能,有哪些联系
  4. 哪些是重点要说的,哪里有重难点技术。

项目经验总结

项目背景

YuAllData数据中台旨在解决[编一个行业]数据分散在各个省份的数据孤岛问题,通过一个集中化的数据管理平台实现数据的统一,打破地域限制。

项目模块

主要包含了如下模块:

  1. 元数据管理模块
  2. 系统管理模块
  3. 数据集成模块
  4. 数据模型模块
  5. 数据标准管理模块
  6. 数据比对管理模块

元数据管理

我负责的是元数据管理模块,元数据(Metadata)指的是数据的结构化信息,主要包含了数据源、数据表和数据字段,帮助用户进行数据的管理,主要包含了如下几个功能:

数据源

集成多种类型的数据库,如MySQLPostgreSQLOracle等。

新增或修改的时候,大体分为三步:

  • 第一步:选择数据源类型,填写数据源名称(自定义的一个名称),选择启用或禁用,以及填写备注信息
  • 第二步:录入主机、端口、数据库名称、用户名和密码
  • 第三步:进行连通性检测,如果能够成功连接,保存信息

保存信息后,数据源记录的同步状态默认为未同步。此时需要点击同步按钮令其发起异步的数据同步

过程中可以使用刷新缓存按钮看异步任务是否执行完成,刷新缓存 也是一个异步任务,先删除redis中的数据(数据源、元数据表、元数据字段),然后重新查询放入redis

数据字段

数据字段的作用是能够看到所有数据源的表信息,以及每一个表都有哪些字段。

页面左侧是一个二级树,一级数据源,二级表名。

页面右侧分页展示了所有字段信息;右侧页面可以输入字段名称,模糊查询所有相关的字段,并且携带了字段归属于哪个表的信息。

点击页面左侧树的结点,可以仅展示一个数据源或一张表的所有字段信息。

每一个字段行右侧会有操作按钮,点击详情可以查看字段的具体信息,且可以添加变更记录(修改字段信息)。此处的变更记录仅仅是一个注释的作用,记录字段的版本变更,不会实际改变字段。

行级变更

与数据字段功能点配合使用,也是做字段的版本管理。只不过范围更大一点,能查看所有的变更记录,并进行管理。

数据地图

数据地图的作用是让用户快速查看某个表的结构信息。

选择数据库和数据表,查询出表的所有列,以树的形式,结合echarts显示出来(echartsgraph关系图模式)。

该树大概分三级,一级为数据源名称、二级为表名称,三级为所有列名称。

数据查询

先输入一个字符串,然后选择类型,数据库、数据表还是数据源(字段),实现模糊查询。

SQL控制台

作用是帮助用户测试sql语句,支持所有数据源。

选择数据源,输入sql语句,运行、停止、格式化和重置。

数据市场

包含数据接口、API日志、API Mask几个功能。

数据接口

数据接口的作用是以可视化无代码的方式生成查询接口。

点击新增,弹出一个窗口,分为三步:

  1. 第一步-属性配置

    1. API名称:随意填写,不可重复
    2. API版本:如v1.0.0,依然是一个随意填写的字符串
    3. API路径:不可重复,/开头是可选的(实际源码/是必填的,显然有问题)
    4. 请求方式:GETPOST两种
    5. 返回格式:只有JSON
    6. IP黑名单:多个用英文的逗号分隔
    7. 是否限流,如每60秒限制请求5
    8. 状态:默认为待发布,不可修改
    9. 备注
  2. 第二步-执行配置:

    1. 配置方式:分表引导模式和脚本模式
    2. 数据源:从已同步和启用的数据源中选择一个
    3. 数据库表
    4. 字段列表:每一行都可以勾选是否作为请求参数、或返回参数
  3. 第三步-参数配置:

    1. 针对选择的请求参数和返回参数进行配置
    2. 返回参数主要是示例值,当然可以添加可不添加
    3. 请求参数:可空、示例值、默认值

保存后,数据接口是待发布的。出于表设计规范和性能优化的目的,限流配置、执行配置、请求参数、返回参数都以MySQL中的JSON格式保存。

API日志

专门记录我们自己通过平台添加的数据接口的调用日志。

源码中的market-service-mapping服务有数据日志相关的接口,但是没有得到调用。此功能刚好可以在数据接口控制器的postHanlde处处理,这部分刚好是空的。

API Mask(脱敏)

API脱敏是指在通过API传输或返回数据时,对敏感信息进行处理,以保护用户隐私或企业机密。脱敏的目的是确保敏感数据在传输或存储过程中不会被泄露或滥用,同时仍然保持数据的可用性和功能性。

选择一个数据接口,可以为其中的字段配置脱敏规则,有以下几种可选的配置:

  1. 正则替换:包含中文姓名、身份证号、固定电话、手机号码、地址、电子邮箱、银行卡号、公司开户银行联号等预设的正则规则;
  2. 加密算法:包含BASE64MD5SHA_1SHA_256AESDES

比如现在有一个字符串字段,名为name,我为它选择了AES的加密方式。此时对应的数据接口就会受到影响:

  1. 删除:因为脱敏数据的存在,无法删除;
  2. 调用:因为存在了脱敏规则,所以会进行脱敏处理,详见数据接口的调用逻辑;

注意,同一数据接口同时启用的脱敏规则只能有一个。

简历上的项目经验怎么写

项目名称YuAllData数据中台

项目时间:xxxx.xx - 至今

项目角色:核心开发工程师

项目简介YuAllData数据中台旨在解决[编一个合适的行业]数据分散在各个省份的数据孤岛问题,通过一个集中化的数据管理平台实现数据的统一,打破地域限制。

技术栈jdk1.8SpringBootSpringCloudMyBatisPlusMySQLRabbitMQMySQL

负责模块

  1. 元数据管理模块:提供针对数据源、数据表、数据字段的管理,包含数据源、数据字段、行级变更、数据地图、数据查询、SQL控制台、数据授权功能。
  2. 数据市场模块:通过可视化的方式快速创建查询接口,实现无代码的接口开发。包含数据接口、API日志、API脱敏功能。

项目微服务介绍

实际介绍的时候要简略

YuAllData数据中台主要包含了如下微服务:

  1. eureka注册中心
  2. conifg配置中心
  3. gateway网关
  4. 系统基础支持服务
  5. 系统管理服务
  6. 元数据管理
  7. 数据市场
  8. 数据标准
  9. 数据比对
  10. 数据安全
  11. 数据质量

等等。我负责的是元数据管理模块和数据市场模块。

在元数据管理模块中,元数据(Metadata)指的是数据的结构化信息,主要包含了数据源、数据表和数据字段。在数据源功能点中,根据数据源的类型、主机、端口、用户名、密码即可创建一个数据源,通过连通性检测后,发起一个异步操作,将数据源中所有的表,表中所有的字段都记录下来,最后刷新缓存(元数据、元数据授权都会写入redis缓存,供其他功能点使用)。数据字段、数据地图、数据查询为元数据提供了查询功能,数据授权控制了不同角色对于元数据的操作权限。数据字段中还可以记录字段的版本变更记录,此处存在一个工作流,每次有需求修改字段信息(注释、类型等)时,都必须在此处记录,在此处记录不会实际修改字段信息。行级变更则是对于字段的版本变更记录的统一管理。

数据市场模块提供了以低代码的方式创建查询接口的功能。在数据接口功能点,可以创建数据接口,分为三步:属性配置、执行配置和参数配置。属性配置可以配置接口的基础信息,包括名称、路径、版本号、请求方式(GET``和POST)、ip黑名单,限流等。执行配置可选表引导模式或脚本模式,表引导模式是针对单表的查询语句,选择数据源和数据表后,显示所有字段,每一个字段都可以勾选作为请求参数或作为响应参数,脚本模式针对联表场景需手动写sql语句。最后一步是参数配置,针对请求参数,可配置是否可空、示例值和默认值,针对响应参数可配置示例值。此时就可以添加接口,默认未发布,发布后即可进行接口的调用。接口调用过程会记录API日志,在API脱敏可以配置字符串类字段的加解密规则,如Sm4AesDes等等。

项目难点介绍

难点就定位在接口的发布和调用上。很难很复杂,你说它是一个难点不为过。

接口的发布

数据接口新建后,默认是未发布的。出于单独记录数据接口日志的目的,自定义的数据接口和API日志都在market-mapping服务上。该服务使用@RabbitListener注解绑定了fanout类型的交换机。在数据市场服务点击发布后,就会向指定的交换机推送一个消息,里面包含了接口的标识。

market-mapping服务的MQ接收到消息后,做了两步操作:

  1. 将请求方式+请求路径作为key,数据接口实体作为value,存入全局的ConcurrentHashMap类型的静态变量中;
  2. 组装RequestMappingInfo,然后调用RequestMappingHandlerMapping的registerMapping方法注册接口,且指定处理请求的目标对象和目标方法。

接口的调用

RequestHandler是所有数据接口统一的控制器,可以接收@PathVariable、@RequestParam、@RequestBody三种类型的参数。接口具体的执行逻辑:

  1. 组合参数:创建一个map统一所有参数;
  2. HttpServletRequest对象中解析得到数据接口实体;
  3. 使用Jackson的ObjectMapper将Object类型的数据接口实体转换为具体类型;
  4. 执行前置拦截器,进行密钥校验、黑名单校验、参数校验和限流校验;
  5. 调用接口,根据数据源的连接信息组装动态sql,然后执行,若存在脱敏规则,进行并行流式脱敏。
  6. 执行后置拦截器:记录api日志
  7. 进行响应:返回接口执行结果
相关推荐
海风极客几秒前
一文搞懂Clickhouse的MySQL引擎
后端·面试·架构
阳树阳树8 分钟前
Solidjs 响应式 & 编译原理初探
前端·javascript·面试
MurphyChen19 分钟前
前端请求进化史 :从 Form 到 Server Actions 🚀
前端·javascript·面试
猿java2 小时前
你使用过 Service Mesh吗?
java·面试·service mesh
_一条咸鱼_12 小时前
大厂Android面试秘籍:Activity 窗口管理模块(四)
android·面试·android jetpack
黑客老李13 小时前
面试经验分享 | 成都渗透测试工程师二面面经分享
经验分享·面试·职场和发展
狂炫一碗大米饭13 小时前
快刷每日面经😋
前端·面试
Yharim16 小时前
AllData数据中台源码分析
java·面试
就是我16 小时前
3种必须知道的JavaScript异步编程模型
前端·javascript·面试