# Java项目 **Repository Path**: WuJinbo1998/java-project ## Basic Information - **Project Name**: Java项目 - **Description**: 阶段一:单体电商项目架构,开发与上线(1~5周) 阶段二:从单体到高可用集群演进(6-8周) 阶段三:逐个击破分布式核心问题(9-17周) 阶段四: 基于SpringCloud改造微服务(18-25周) 阶段五:Docker,K8S容器化(26-30周) 阶段六:Netty与JVM性能调优(31-40周) - **Primary Language**: Java - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-12-22 - **Last Updated**: 2022-08-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: Java, Project ## README # 项目介绍 电商项目 2021.12-2022.4 项目为本地测试练习开发,未实际上线。主要解决的难点问题:用户注册、登录,购物车实现,文件上传,恶意访问、流量高峰的限流。 1、熟悉掌握单体电商项目架构,前后端分离:前端-Controller-Service-Mapper-数据库,电商项目的商品、订单、购物车、用户中心等模块的开发; 2、高可用集群演化,使用Nginx实现网关层的反向代理、负载均衡; 3、熟悉分布式相关技术:Redis/Elasticsearch/RabbitMQ/Mycat,并解决分布式相关问题:分布式会话和单点登录,分布式锁,分库分表,分布式事务,接口幂等性; 4、基于SpringCloud微服务化项目:common-domain-platform架构,domain下将项目拆分为各个微服务:主搜、商品、购物车、鉴权、用户、订单模块,熟悉SpringCloud生态下的各个微服务组件; - 200字版本 项目为本地测试练习开发,未实际上线。主要解决的难点问题:用户注册、登录,购物车实现,流量高峰的限流。 1、熟悉掌握单体电商项目架构,前后端分离; 2、高可用集群演化,使用Nginx实现网关层的反向代理、负载均衡; 3、熟悉分布式相关技术:Redis/Zookeeper/Kafka,并解决分布式相关问题; 4、基于SpringCloud微服务化项目,熟悉SpringCloud生态下的各个微服务组件; # 阶段一:单体电商项目架构,开发与上线(1~5周) ## 一、架构 客户端(浏览器)——tomcat静态资源服务器(后续Nginx)——springboot动态资源服务器(-RestTemplate-支付中心)——数据库 前端——Controller Service Mapper(DAO)——数据库 ### 1. Controller(控制层) 接收请求 处理请求 返回响应 Controller (Class) 可继承自定义的BaseController通用Controller @RestMapping 返回json对象 前后端分离,一般都是后端返回json交给前端进行页面渲染 调用Service将查询到的数据结构包装成json返回 ### 2. Service(业务逻辑层) Service (Interface) 可继承自定义的BaseService通用Service ServiceImpl (Class) 自动注入mapper接口(Mybatis工厂生产实现类) 调用Mapper查询数据库,封装成对象 一个Service可以调用多个Mapper和多个Service ### 3. Mapper(数据访问层) Mapper/DAO (Interface) 可继承BaseMapper(Mybatis Plus?) .xml文件映射 通常使用Map传参(单参数也可以用Map,方便以后功能拓展) 1. 继承BaseMapper的普通Mapper(适用于简单的sql语句) Service调用其父类方法 2. 自定义Mapper(适用于复杂的sql语句,如多表联查) select语句属性注入,查询结果映射到对象(可以是复杂的数据结构) Mapper接口中方法形参映射到xml sql语句中的#{ } 使用注解@Param 4. POJO 4.1. POJO 类似javabean,对应数据库中的一张表 4.2. BO 从请求体中接收到的数据封装到的对象 4.3. VO 响应体中返回的对象,交给前端渲染 5. Common(通用组件) 二、Controller Service Mapper描述的实体对象通常是什么? 对象是某种事物类型:如用户信息、种类表、轮播图、商品、地址、购物车、订单... Mapper要映射到一张(只使用BaseMapper)或多张表(自定义Mapper实现),比Service更细化 # 阶段二:从单体到高可用集群演进(6-8周) ## 一、Nginx 基于HTTP的反向代理web服务器(网关层) 1. Nginx实现网关层的反向代理、动静分离 2. 搭建tomcat集群(负载均衡) 3. 网关层限流 ## 二、Keepalived 检测服务器状态 1. 解决Nginx的单点故障,实现高可用 HA 2. keepalived + nginx 高可用集群(双机主备,双主热备) 3. 自动重启Nginx ## 三、LVS Linux虚拟服务器 ## 四、Haproxy TCP/HTTP高可用代理 1. RabbitMQ 主备 2. MyCat 的高可用 HA(MySQL命令是通过TCP协议传输的) 搭建Nginx集群(lvs充当调度者,只转发请求,不处理请求) ## 五、Redis 分布式缓存中间件 1. 搭建redis主从复制,实现读写分离(主写从读) 2. Redis 高可用解决方案 哨兵机制 3. 搭建redis集群(一般三主三从) 4. Redis 作为服务层与数据库之间的缓存中间件 4.1. 经常查询且不经常更改的数据 e.g. 首页轮播图 4.2. 临时的数据e.g. 未登录时添加了商品的购物车(后续登录后要同步至登录用户的购物车) 5. 缓存雪崩及雪崩预防 永不过期(必要时人为地删除缓存);过期时间错开(系统启动时初始化大量缓存);多层缓存结合 e.g. →redis→memcached(过期时长设置的更久)→数据库;采购第三方redis ### 阶段三:分布式 6. Redis + cookie 实现分布式会话(redis中存放 token: 用户id;cookie中存放token) 6.1. 用户注册、登录、退出登录,要在redis生成、销毁对应token(用户信息变化时token也要变化) 6.2. 分布式会话拦截器(防止非法用户恶意篡改其他用户信息) 6.3. 实现相同顶级域名的单点登录 拓展:CAS单点登录(顶级域名不同时的解决方案) 7. Redis 实现分布式锁(内部的单线程),同理可基于Redis的Redisson客户端实现分布式锁 7.1. 解决电商的超卖问题 7.2. 接口的幂等性(重复执行问题)a. 有唯一业务号的操作,业务号作为key即可 b. 没有唯一业务号的操作,使用token作为锁 8. 生成分布式ID 9. Redis + Lua 的分布式限流 (中间件限流、服务层限流) # 阶段三:逐个击破分布式核心问题(9-17周) ## 一、Elasticsearch 分布式搜索引擎 1. es 实现商品分页搜索与高亮(es的倒排索引) 2. 搭建es集群 分片 + 备份(分片和其备份不能放在同一台服务器上) ## 二、Logstash 数据同步 1. 实现 es 与 数据库 之间的数据同步 2. 同步边界 2.1. id 只能同步新增,不能同步更新 2.2. update_time 定时任务到期检查更新时间,更新的就更新(更推荐) 删除不能同步,可以通过更新时间进行逻辑删除 ## 三、FastDFS 阿里OSS 分布式文件系统 FastDFS 实现分布式架构下的头像上传与修改,配置fastdfs-nginx-module实现文件服务器 (单体项目时的方案是,将上传的文件作为静态资源存放在Nginx服务器) ## 四、RabbitMQ 分布式消息队列 1. 搭建RabbitMQ镜像队列集群 2. 消息的可靠性投递 2.1. 消息落库,对消息状态进行打标 2.2. 消息的延迟投递,做二次确认,回调检查(减少数据库操作)(更主流) 3. 分布式事务的解决方案,最终一致方案,解决支付失败等问题 ## 五、Kafka 分布式消息队列 1. Kafka集群模式 2. 海量日志收集 elk技术栈 (Elasticsearch Logstash kibana) Kalfka做缓冲 2.1. 日志输出 log4j2(远程代码执行漏洞?) 2.2. 日志收集 FileBeat 2.3-5. elk环境 2.3. 日志过滤 Logstash 2.4. 日志持久化 Elasticsearch 2.5. 日志可视化 Kibana 2.6. 监控告警 Xpack-Watch ## 六、Elastic-Job 分布式定时任务框架 es-job 定时关闭超时未支付订单 (单体项目时的方案是springtask) ## 七、Zookeeper 分布式协调组件 (与redis比较相似,但redis更偏向于分布式缓存,而zk偏向分布式协调,znode小于1k) 1. zk 实现分布式锁(瞬时节点有序),同理可基于Zookeeper的Curator客户端实现分布式锁 1.1. 解决电商的超卖问题 1.2. 基于Zookeeper的Curator客户端实现分布式锁 2. 采用Zookeeper集群做负载均衡代理、集群选主、集群管理与注册 Kafka, ActiveMQ 的环境都依赖于Zookeeper 3. 生成分布式ID ## 八、MyCat 数据库中间件(服务端代理) 1. 读写分离、分库分表 2. MyCat 的高可用 HA(Keepalived + Haproxy 双主热备) 3. MyCat不支持UUID的方式(分布式全局id) 4. 分布式事务(基于 XA 协议的两阶段提交) ## 九、Sharding-JDBC 数据库中间件(客户端代理) 1. 读写分离、分库分表 2. Sharding-Jdbc支持UUID方式(自动生成UUID作为主键,即分布式全局id) 3. 分布式事务(基于 XA 协议的两阶段提交) ## 十、Lua 脚本(集成Redis) 在 Redis 中预加载 Lua 脚本(多段Redis指令、逻辑),执行过程原子性。用法:java程序中使 Redis 执行 Lua 脚本 ## 十一、Guava Google工具包 RateLimiter 客户端限流 # 阶段四: 基于SpringCloud改造微服务(18-25周) ## 一、架构 1. common 公共组件、公共依赖项(e.g. 工具类、pojo类、枚举类、各种base类、aspect、config) 2. domain 微服务模块: 2.1. search 主搜模块 商品搜索,类目搜索,轮播图列表,es 2.2. item 商品中心 商品详情页,获取SKU(库存量单位),商品主图 2.3. cart 购物车模块 添加、删除、修改、清空商品,redis 2.4. auth 权限校验(鉴权)模块 生成、校验、更新token,网关鉴权服务 gateway 2.5. user 用户管理模块 用户注册、登录,地址管理,用户查询,用户信息、头像修改 2.6. order 订单模块 创建、查询订单,订单状态修改,关闭超时订单 --每个模块内部: 2.1. api 纯接口层(原service中的接口),不是原来的controller层;后续将会使用 Feign 组件,通过接口发起微服务之间的调用 2.2. controller / web 业务层、application启动类 2.3. service api层中service接口的实现类 2.4. mapper 2.5. pojo 3. platform 平台组件 3.1. 服务治理(注册中心) Eureka 3.2. 服务(容错)聚合 Turbine 3.3. 服务(容错)监控 Dashboard 3.4. 配置中心 Config(server) 3.5. 服务网关 Gateway 3.6. 数据追踪 Zipkin (server) # 阶段五:Docker,K8S容器化(26-30周) # 阶段六:Netty与JVM性能调优(31-40周)