# 学成在线xuecheng-plus **Repository Path**: ljx-li-jiaxuan/xuecheng-plus-project ## Basic Information - **Project Name**: 学成在线xuecheng-plus - **Description**: 微服务项目学成在线项目从0-1开发 目前git包括 后端工程+前端工程+Nginx+XXL-Job 有问题联系 QQ:1051431862 VX:ljx1051431862 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 20 - **Forks**: 1 - **Created**: 2024-04-17 - **Last Updated**: 2025-07-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: 微服务, 分布式, 教育类型, Java ## README ## 介绍 学成在线项目从0-1开发 ## 项目技术架构 ### 服务注册配置中心 技术栈:Nacos ### 网关 技术栈:GateWay 用于: 请求认证,转发路由各个微服务,设置白名单 ### 服务远程调用、服务熔断降级 技术栈: Feign远程调用服务,Hystrix熔断降级 用于: 各个服务之间远程调用接口,以及用Hystrix做熔断降级处理 ### 认证授权 技术栈:SpringSecurity+OAuth2+JWT 用于:账号密码认证、微信扫码登录认证 ### 分布式文件系统 技术栈: Minio 用于: 大文件断点续传技术,文件上传存储至Minio ### 分布式任务调度 技术栈: XXL-Job 用于: 媒资服务分片广播开启线程池处理视频任务,定时扫描消息表执行ES,MySQL数据同步问题 ### 分布式搜索 技术栈:ES(Elasticsearch)+Kibana 课程搜索 用于: 课程数据搜索、关键词高亮显示、动态查询条件 ### 分布式缓存性能优化 技术栈:Redis、jmeter测试 用于: 使用Redis缓存查询频繁的数据(课程数据) #### 解决缓存穿透: 1.校验key的规则符不符合当前项目 2.缓存空值,如果缓存了空值,要设置短暂的ttl时间,防止缓存雪崩 3.布隆过滤器,布隆过滤器中的数据id来源于数据库,会把库中所有的课程id存放至布隆过滤器中 所以需要提前做缓存预热,当新增课的时候,也会在布隆过滤器中新增 查询布隆过滤器,如果返回为0直接返回空,如果返回1不一定存在,因为可能存在hash值相同但是值却不同的数据导致误判 #### 解决缓存雪崩: 1.同步锁,给查询数据库的代码+锁 2.给同一类型的redis数据设置不同的随机ttl时间 3.缓存预热 #### 解决缓存击穿: 1.同步锁,同时只有一个线程去查数据库 2.热点数据不过期 ### 分布式锁 #### 1.基于数据库实现分布式锁 使用乐观锁,谁先修改版本号就意味着谁先抢到了锁,用于多线程处理视频任务 #### 2.基于redis实现分布式锁 redis提供了分布式锁的实现方案,比如:setNX、redisson #### 2-1.setNX实现分布式锁 setNX命令的工作过程是去set一个不存在的key,多个线程去设置同一个key,只能有一个线程设置成功,设置成功的线程拿到锁 key到期自动释放缺点:如果锁的过期时间设置太长,其他线程等待时长就会长,导致性能不好 如果锁的过期时间太短,那么很有可能会出现查询两次,多次,因为过期后释放锁 解决手动删除锁,可以先判断下是不是自己设置的锁,但是代码可能不具备原子性 为了避免删除别的线程设置的锁,需要使用redis执行lua脚本实现,就会具备原子性 手动释放锁缺点:由于过期时间太短,第一个线程进来后先加锁,处理时间大于了锁的时间,此时,锁过期,第二个线程进来加锁, 然后第一个线程刚好执行完,释放锁,他会把刚刚第一个线程的锁释放了 #### 2-2.redisson实现分布式锁 Redisson融入Java,把Java很多数据结构都实现了一系列接口,比如 Redisson也是实现了Java中ReentrantLock他也去实现的Lock接口 Redisson获取了锁之后,锁的过期时间默认为30秒,可以防止意外发生死锁的情况 如果锁的时间快过期,业务还没执行完,它会启动一个看门狗线程,锁快过期时就会自动续期,看门狗就可以解决setNX设置锁的时间问题 并且Redisson释放锁也自动实现了lua脚本的调用,保证了原子性 ### 支付 技术栈:对接支付宝沙箱扫描二维码下单支付 用于: 用户选课,如果是付费课程,生成二维码,扫描二维码,对接支付宝沙箱,进行支付,支付完成查看支付结果等 ### 消息队列 技术栈:RabbitMQ 支付完成后的消息通知 用于:用户下单支付完成后,会将支付完成的消息 通过消息队列,把支付结果发给每个与订单服务对接的其他微服务 , 其他微服务接收到支付成功的消息,然后去更新处理各自的业务。 #### 注意: 1.消息要发送到交换机 2.消息由交换机发送到队列 3.消费者收到消息进行处理 所以一定要确保消息的可靠性以及保证消息正常消费 #### 1.生产者确认机制 发送消息前使用数据库事务将消息保存到数据库表,成功发送到交换机,再将消息从数据库表删除 #### 2.MQ持久化 MQ收到消息进行持久化,配置交换机、队列、发送消息时设置持久化,保证MQ重启后消息不丢失 #### 3.确认机制 消费者消费成功后自动发送ack,防止重新消费(防止重新再处理业务) ### 部署 docker ### 有问题联系 QQ:1051431862 VX:ljx1051431862