Contents

简历项目-鸡翅Club

项目内容

名称:刷题Club 描述:刷题Club是一款专门为程序员打造的沟通交流社区,采用主流的微服务框架+主流C端技术栈来做为技术架构。旨在统一程序员信息差,进行平台统一化,程序员可以在平台,完善自身知识,刷自身薄弱点面试题,配合练习,模拟面试,简历分析模块来提升程序员面试能力。 技术栈: SpringBoot+SpringCloud Alibaba+SSM+Mysql+Redis+Nacos+Gateway+Minio

项目职责

  • 采用微服务领域拆分思想,对项目进行领域设计,划分为4个微服务,业务解耦,专注自身职责;
  • 基于Nacos来实现业务项目的服务注册与发现及业务动态配置切换;
  • 选取主流鉴权框架Satoken来替代传统的Secruity,提高开发效率,降低上手难度;
  • 采用Gateway配合redis实现统一的鉴权及分布式会话共享功能,在网关层实现全局异常处理;
  • 使用ThreadLocal配合网关拦截器,Feign拦截器,封装用户上下文全局工具
  • 登录模块抽取微信微服务,实现微信对接回调与sdk统一封装,设计出无业务性的微信对接服务;
  • 采取工厂+策略模式实现微信消息解耦处理、不同题目类型入库处理,采取适配器实现oss对接;
  • 使用websocket实现前端与后端的实时信息推送,扩展心跳机制,连接鉴权等
  • 封装自定义的esclient,支持多索引切换,封装了常用的业务函数,实现网站的高亮搜索功能;
  • 基于futuretask及completablefuture实现了分类标签的并发查询,提高查询效率
  • 封装了自定义的线程工厂,实现了线程池间的日志区分,提升了日志排查效率。

准备的问题

Gateway如何实现统一鉴权的

在网关层集成了satoken-redis插件,用户通过认证后会将用户信息和token全部存储到redis中。在前端发送请求时需要在请求头中携带token,网关层通过获取请求头中的token与redis中的token进行比对鉴权。 在网关层实现全局的过滤器,鉴权成功后会将请求拷贝一份并将用户信息添加到请求头中再转发到下游,下游服务无需鉴权,只需要在请求头中获取用户信息即可。 为了防止服务A通过Fegin调用服务B时丢失请求头,所以在下游的服务中都配置了feign的拦截器,将请求头中的用户信息添加到feign的请求头中。同时下游也会编写一个拦截器用于将用户的信息添加到ThreadLocal中,方便下游服务使用。

微服务是怎么拆分的

拆分成四个微服务:

  1. 用户认证微服务处理用户信息,认证逻辑
  2. 刷题模块,负责题目、标签、分类刷题逻辑
  3. 连续服务,负责模拟考试,练习记录逻辑
  4. 圈子模块,负责发布帖子,交流、点赞逻辑

怎么集成Nacos进行服务的注册与发现

首先需要引入nacos的依赖,只进行配置管理需要spring-cloud-start-alibaba-naocs-config,若需要服务注册与发现则需要引入spring-cloud-start-alibaba-naocs-discovery,同时还需要spring-cloud-start-bootstrap。然后在服务的application.yml的同级目录创建bootstrap.yml文件,配置nacode的端口,命名空间等信息,项目启动即可将服务注册到naocs中。

nacos的配置动态刷新如何实现的

通过在配置类上使用@RefreshScope注解,当nacos中的配置发生变化时,会自动刷新配置类中的属性值。原理是nacos会和本地服务建立长轮询,当配置发生变化时,会通知本地服务刷新内存中的配置。

如何对接微信公众号登陆的,流程是什么

用户扫码关注微信公众号,发送验证码,然后系统监听到验证码信息,向用户发送一个随机生成的验证码,并以openid:code的形式将验证码存储到redis中,用户输入验证码在认证中心完成登陆,系统会下发一个token给前端,前端拿到token后存到本地,后续每次请求都携带此token。

系统如何监听用户给微信公众号发送信息的

对接微信公众号的消息回调接口,提供一个请求URL地址、token,加解密请求体内容的key。请求URL就是微信服务向本地的服务发送消息的地址,微信接收到用户信息会向这个地址发送信息。token是用来签名的,会和请求中的token进行比对。后台服务收到消息后会可以向用户发送消息。

回调消息的校验,微信会发送一个Get请求,包含了签名、时间戳、随机数等信息,后台拿到后采用同样的加密方式,一般是sha1加密后比对,一致就校验成功并原样返回

使用了哪些设计模式

使用了工厂加策略模式处理了不同类型题目的解析和处理逻辑,使用适配器模式实现OOS服务的对接。

工厂+策略模式解决的是内存业务多样性的问题,适配器模式解决的是外部依赖不稳定的问题。

WebSocket相关

WebSocket的使用流程是先引入依赖,然后建立一个端点,设置请求的路径,然后在端点中实现OnOpen、OnClose、OnMessage、OnError等方法。除此之外还需要建立一个用户信息和Session之间的映射关系,用于后续进行消息的发送。 这个系统的websocket认证是配合网关层实现的,首先和前端约定好在请求后面凭借token,ws请求到达网关层时会先解析该token是否是有效的,有效的则放行,反之拦截。 第二点是先配置ws,将从请求路径中获取到的 认证信息存到端点的配置中,请求到达ws端点成功连接OnOpen方法会读取该认证信息然后建立与Session的映射关系。 OnOpen是建立连接后立即执行,OnMessage是收到客户端消息后执行、OnClose是断开连接前执行、OnError是发生错误时执行。 心跳机制就是前端定时发送ping消息到后端,后端收到后回复pong消息,如果后端在一定时间内没有收到ping消息就会关闭连接。

CompletableFature是如何使用的

这个主要是项目有多个分类,每个分类都需要查询标签列表,一开始使用的是先查分类再依次查每个分类的标签列表进行的。后面使用CompletableFuture进行优化,先查询出所有的分类,然后把查询单个分类下的标签列表的操作封装成异步任务放到自定义的线程池中,最后使用使用CompletableFuture并行执行这些异步任务并使用future.get()阻塞的获取任务执行结果。

自定线程工厂是如何封装的

需要自定义一个线程工厂类去实现ThreadFactory类,然后重写自定义线程工厂的构造函数,允许传入一个name并将这个name拼接到线程名称中,最后在线程配置类中创建自定义的线程时使用这个自定义的线程工厂创建即可。