个人介绍
熟练 springboot、springcloud、mybatis、mysql、redis
熟悉 小程序、vue、elementui 等前端技术
熟悉以 oauth2 为基础的认证框架 shiro、spring security 并结合 jwt 令牌
熟悉 RBAC 权限管理并实现动态权限
熟悉 SEO 优化,nodejs 等服务端渲染,结合 nginx 对网站 url 进行配置
熟悉 elasticsearch、logstash、kibana 的基本应用
熟练使用 rabbitmq 等消息队列完成状态被动更新、业务模块通信、解耦等
熟悉 linux
工作经历
2022-04-18 -2023-06-30中山市南区街道良都社区工作人员
社区工作,前期主要做疫情防控工作,后面政策放开之后社区找人做 web 网站系统,本人负责与开发公司谈需求
2020-12-19 -2022-02-28银鹿科技(中山)有限公司后端开发
自研 AI 能力,开发门户网站,另外做 web 项目 工作期间完成了公司门户网站(搜索)、论坛、和网站管理控制台后端开发,另外做了一些小项目。
教育经历
2016-09-01 - 2020-07-01吉林大学珠海学院视觉传达设计本科
大二开始自学 java,毕业后到培训到学了半年后工作
技能
概述 前端使用*小程序实现,java 进行后台开发。以 springcloud 微服务为主要技术栈,主要实现商城销售商品主链路的开发(包含首页商品列表、商品分类-搜索、商品详情、购物车、订单、支付等从商品浏览到下单的完整链路) 以 pig4cloud 开源版开源框架为基础进行快速开发 主要技术栈 springboot springcloud(nacos、gateway、feign、hystrix、config等) mybatis mysql redis elasticsearch logstash nginx rabbitmq rocketmq spring-security seata zookeeper nodejs vue 微服务模块 - pig4cloud 核心模块(nacos、admin、auth、gateway) - 商品模块 - 搜索模块 - 订单模块 - 库存模块 - 支付模块 主要技术点 1. 商品模块 提供商品信息查询功能,有 spu、sku 等概念,spu 除了有基本的标题、价格、图片、分类等基本信息外,还有规格选择时的可视规格、默认选中 sku 等额外信息 spu 与 sku 为一对多关系,sku 还由 spec(规格)组成,关系也是一对多,sku 需要维护一组组的 spec 名称及其可选值,其中的关系较为复杂 商品模块需要处理这些关系,并处理好数据返回给前端 2. 搜索模块 使用 Elasticsearch 实现搜索能力,支持中文分词(ik)、拼音、自动补全提示功能。 支持过滤特定搜索条件(如分类、价格范围),支持特定需求排序(如价格升序) 数据基于 mysql 进行存储及更新,通过 logstash 定时任务 sql 读取数据库数据,过滤后输出到 es 中,保证数据实时更新 3. 订单模块(含购物车) 用户选定商品,及其 sku 后,可选择数量并将商品加入到购物车,前端将购物车使用 storage 进行存储 购物车会在一定条件下与后端数据进行同步及校验,后端提供了同步及校验接口 后端将购物车数据存储在 redis 中,前端请求校验时,会对购物车每一项的 sku 进行如商品状态(是否上架、可购买)、库存是否充足(限购)、 价格(是否发生变更等) 上述操作会向商品模块及库存模块请求数据,使用 feign 进行远程调用 完成购物车校验后,用户即可进行下单,订单创建页面用户需填写收货信息并对商品进行确认、选择支付方式(*), 点击支付后,后端会先尝试验证并创建订单、校验商品状态、价格、库存(后面介绍),创建订单后返回前端 前端根据订单信息访问后端拉起预支付接口,向三方支付平台发起预支付请求,返回表单信息,并在小程序中拉起支付页面(*) 用户完成支付后,三方服务器会访问后端预留的异步通知接口,后端验签、校对金额、更改订单状态、扣减库存、完成支付等,订单即完成 4. 库存模块(关于库存验证、锁定和扣减) 本系统设计订单支付有一个指定的时间范围(如 15 分钟),用户创建订单后到完成支付系统获得三方异步通知前,是有一定的时间差的, 在这个时间差内,用户已经预定的商品其他人将不可购买(避免超卖),但用户不一定会完成支付,所以不能直接到数据库中扣减库存。 本系统采用了库存锁定(预留)机制,用户下单后,系统会锁定一部分库存(使用 {oid}::{skuId}::{buyCount} 作为 redisKey 并设置一个 timeout), 在进行库存计算时,会将这些锁定库存计算再内,若用户完成支付,则删除这些锁定库存,并再数据库扣减库存,若用户超时未完成支付, 则 redis key 过期自动删除这些锁定库存 关于库存扣减加锁,库存扣减可以通过 skuId 使用数据库主键索引在写时加上数据库行锁,并使用 where 条件判断 库存 >= 购买数量,成立即成功扣减, 但考虑到数据库性能瓶颈,在 java 代码中需要进行一次预先判断,java 层面的锁我使用了 zookeeper curator 客户端实现分布式锁, 锁 key 使用 skuId 避免并发操作同一 sku,锁范围内查询库存并验证 使用 reids 扣减库存提高并发量 为了提高并发量,经过一系列验证进行数据库库存扣减前,使用 redis 进行扣减操作,而不直接使用数据库,此处需要借助 lua 脚本完成,在 lua 脚本中, 从 redis 获取当前库存量,计算购买数量并扣减库存,由于 redis 是单工作线程且 lua 脚本执行不会被打断,所以不需要额外加锁, redis 基于内存具有更高效的处理能力。在扣减成功后,使用 rabbitmq 发送异步通知,数据库根据消息再进行库存扣减,根据当前压力进行调整。 此方案在高并发的同时,也有缺点,就是 redis 在极端情况下可能会丢失数据,可以采用集群或其他同步备份方案优化 5. 支付模块 由于使用了*小程序,所以以*支付为主 支付流程也比较简单 - 提交订单信息拉起预支付 - 根据返回预支付表单给前端拉起支付界面 - 支付完成后,*服务器异步通知后端预留的接口 - 后端验签、核对订单信息(价格等)、扣减库存、更改订单状态等 - 返回 success 给*服务器 6. 其他技术点 分布式事务问题 微服务间调用就必须考虑分布式事务的问题,如本系统支付成功后,更改订单状态和扣减库存,都需要远程调用其他服务,我使用了三种不同的方式实现 - seata 最简单的实现方式,加上 @GlobalTransational 即可,特点是同步,强一致性,性能较慢 - rocketmq 原生事务消息 先给 broker 发送半消息,本地事务执行成功后,再发送后续消息,broker 确认后,投递消息到队列,消费者消费消息 保证本地事务一定成功,但不能保证消费成功,要考虑消费失败的处理(消息重发、补偿机制),消费者要避免重读消费消息 特点是异步,BASE 理论,最终一致性 - rabbitmq 自己维护本地消息表 在本地事务执行中,往数据表插入一条记录(消息打标,记录事务状态),本地事务记录需要与业务表操作保证强一致性,在一个事务中, 本地事务完成后,发送一条消息到 rabbitmq,消费者接收到消息后,根据消息进行处理,若处理成功,则改变本地消息表中的状(或达最大重试次数), 需要考虑失败补偿,或人工处理 特点是异步,BASE 理论,最终一致性
网站地址:bbs.1616ai.com 概要(阅读该项目前,请先查看 1616ai开放平台项目介绍) ai 星球是一个集论坛、资讯功能于一体的网站,与1616ai 开放平台(1616ai.com)相互配合。用户可以在此发布文章,资讯,并与其他用户参与讨论 技术栈 springboot mybatis mysql redis mango elasticsearch logstash nginx rabbitmq shiro nodejs vue 主要模块 - 文章模块 - 搜索模块 - 用户模块 - 站内消息模块 - 单点登录模块 - 推荐模块 主要技术点 1. 文章模块 用户可发布文章(支持富文本,后端依托第三方插件实现富文本安全过滤,保留合法代码),支持图片上传,外部链接等 文章编辑支持存储草稿,后端需要维护文章状态(如:草稿、待审核、审核不通过、公开发布(审核通过)、删除等状态) 文章支持不同的阅读权限(如:私密、关注、公开等),不同用户获取文章列表时,亦药对阅读权限进行验证 文章发布后支持修改编辑功能,使用 mango 存储修改后的文章副本,进入到待审核状态,需要保证审核通过之前, 原文章不受到影响,待审核通过后,将 mango 中的数据覆盖到数据库中的文章进行更新,并删除 mango 中的数据 文章发布需要审核,对接了第三方人工智能 API 接口进行审核 文章支持标签分类 文章支持点赞、收藏 文章可被其他用户发表评论并回复评论,评论回复实现了二级展示(数据库表记录回复目标,并在查询数据时使用特殊算法进行处理), 可以追踪回复目标用户,回复内容亦可点赞 实现了 redis(文章 ID 作为 key)缓存 2. 搜索模块 使用了 Elasticsearch 实现搜索能力,支持中文分词(ik)、拼音、自动补全提示功能 支持文章标题和正文搜索,并根据相关性进行排序 支持过滤功能(标签、权限等) 数据基于 mysql 进行存储及更新,通过 logstash 定时任务 sql 读取数据库数据,过滤后输出到 es 中,保证数据实时更新 支持查看搜索历史记录,支持搜索结果收藏 3. 推荐模块(结合站内权限) 管理员等拥有特殊权限的账号,可发布特殊类型的文章,并展示在站内特殊位置,如页面上方轮播图,文章置顶等 另外,使用 redis zset 实现了文章热度排行榜 4. 用户模块 实现了论坛用户主页功能,可展示文章 实现了关注其他用户的功能,用户可看到哪些用户关注了自己,也可以看到自己关注了哪些用户,并可以跳转到其他用户主页 可对自己的文章进行管理(如:编辑、发布、删除、改变阅读权限等) 支持用户基本信息修改(密码、昵称、头像等信息) 开发了成就系统(任务)功能,如:进行一次收藏等,即可触发成就系统更新。用户进行每一次操作,都有可能被成就系统记录, 具体实现使用 rabbitmq 异步发送操作数据,累积成就进度,完成成就后,用户还会收到站内消息提示 5. 站内消息模块 用户操作可能触发站内消息提示,如成就完成,评论被回复、点赞、收藏等,在消息触发点使用 rabbitmq 发送异步消息到用户消息仓库(mysql), 前端网站定期到服务端检查并拉取消息 消息进行了分类,如系统消息、成就消息、用户消息等 在消息界面,支持点击消息进行跳转、删除消息等操作 6. 单点登录模块 该网站除了论坛外,还做了 AI能力搜索门户(另一个项目 1616ai.com),其中就支持了单点登录,使用 shiro + jwt 进行实现 支持用户名密码及*号登录、*扫码登录,一步自动注册等功能 登录成功后,发放 jwt 令牌存储至浏览器中,访问接口时,使用 Authorization 携带令牌头,后端进行验证并获得用户信息 7. SEO 优化 为了被搜索引擎收录,对 SEO 进行优化,java 端依旧保持了 restapi 风格,加入了 nodejs 作为前端服务器中转,用户打开文章页面时, 会被 nginx 转发到 nodejs 服务器,nodejs 访问 javaapi 加载文档,最后返回到前端的就是一个完整内容的文档(去除了浏览器到 java 端的直接 xhr 请求) 页面静态化,请求地址重写为 {文章 ID}.html 的形式 8. 其他技术 使用了 nginx 做反向代理服务器,包括静态资源的下载,请求重写、转发等 前端使用了 vue + elementui 进行开发,支持移动端自适应(前端非本人开发) 数据库使用 mysql + snowflake 雪花算法实现分布式唯一主键,使用 mybatis-plus 快速查询
项目地址:1616ai.com 概要 1616ai是一个整合全网人工智能接口的搜索引擎,通过收集整合大量其他AI平台的开放能力,对其进行归纳分类,便于开发者快速搜索,快速对比不同平台相似的开放能力,以选取最优的进行使用。 平台提供了效果对比(如图像类),价格对比等功能,还收录了该开放能力的官网,文档,试用链接等,方便开发者快速查找定位。 阅读前请先看图,对该项目有一个大概的了解,后面可能会提到一些名词:图一为主页,搜索框用于搜索,图二为搜索结果,每一个搜索结果都是一个 AI 产品(支持点赞、收藏),图三为产品详情页,展示效果图、价格、可评论 该项目后端为本人一人独立完成 模块 搜索模块(主要) 单点登录模块 用户模块 站内消息模块 SEO 优化(nodejs 和 nginx) 主要技术栈 springboot mybatis mysql redis elasticsearch logstash nginx rabbitmq shiro nodejs vue 主要技术点 1. 搜索模块 使用 Elasticsearch 实现搜索能力,支持中文分词(ik)、拼音、自动补全提示功能。 支持结合标签搜索(过滤特定搜索条件) 搜索结果根据相关度评分排序 数据基于 mysql 进行存储及更新,通过 logstash 定时任务 sql 读取数据库数据,过滤后输出到 es 中,保证数据实时更新 支持查看搜索历史记录,支持搜索结果收藏 2. 单点登录模块 该网站除了搜索功能外,还做了论坛功能(另一个项目 bbs.1616ai.com),其中就支持了单点登录,使用 shiro + jwt 进行实现 支持用户名密码及*号登录、*扫码登录,一步自动注册等功能 登录成功后,发放 jwt 令牌存储至浏览器中,访问接口时,使用 Authorization 携带令牌头,后端进行验证并获得用户信息 3. 用户模块 支持用户基本信息修改(密码、昵称、头像等信息) 开发了成就系统(任务)功能,如:进行一次收藏等,即可触发成就系统更新。用户进行每一次操作,都有可能被成就系统记录, 具体实现使用 rabbitmq 异步发送操作数据,累积成就进度,完成成就后,用户还会收到站内消息提示 其他论坛相关功能在另一个项目中描述 4. 站内消息模块 用户操作可能触发站内消息提示,如成就完成,评论被回复、点赞、收藏等,在消息触发点使用 rabbitmq 发送异步消息到用户消息仓库(mysql), 前端网站定期到服务端检查并拉取消息 消息进行了分类,如系统消息、成就消息、用户消息等 在消息界面,支持点击消息进行跳转、删除消息等操作 5. SEO 优化 为了被搜索引擎收录,对 SEO 进行优化,java 端依旧保持了 restapi 风格,加入了 nodejs 作为前端服务器中转,用户打开产品页面时, 会被 nginx 转发到 nodejs 服务器,nodejs 访问 javaapi 加载文档,最后返回到前端的就是一个完整内容的文档(去除了浏览器到 java 端的直接 xhr 请求) 页面静态化,请求地址重写为 {产品 ID}.html 的形式 6. 其他技术 使用了 redis 做缓存、记录状态信息等 使用了 redis 做产品热度排行功能,具体使用 zset 实现,支持实时更新 使用了 nginx 做反向代理服务器,包括静态资源的下载,请求重写、转发等 前端使用了 vue + elementui 进行开发,支持移动端自适应(前端非本人开发) 数据库使用 mysql + snowflake 雪花算法实现分布式唯一主键,使用 mybatis-plus 快速查询 对表格(产品价格展示)进行处理,项目的数据来源为 python 爬虫(爬虫不是本人写的),爬下来的是磁盘文件,本人使用 java 读取文件内容,进行解析、过滤、转换格式后进行存储