java面试项目经历说辞(Spring全家桶,mybatis,mybatis-plus,redis,rabbitMQ,ES)

本文是一位Java开发工程师对自己参与的零食售卖商城项目进行的详细讲解,涵盖了登录模块(包括多种登录方式)、搜索功能(Elasticsearch实现)、支付流程(微信支付为例)等方面,涉及到的技术包括SpringBoot、Vue、Mybatis、RabbitMQ、Elasticsearch等。在登录模块,重点介绍了JWT、验证码处理和OAuth第三方登录。在搜索功能中,详细阐述了Elasticsearch的前缀提示和搜索功能实现。支付模块则涉及微信支付接口调用及消息队列(RabbitMQ)在高并发场景下的应用。

以下内容仅为我的某个项目简介说辞,仅供参考

各位面试官下午好:
    我叫XX,籍贯是XXXX,于2020年本科毕业,毕业至今一直从事与java开发工程师的相关开发工作,曾在XXXX公司有过一年多的开发经历。
    我熟悉的技术栈有:Spring全家桶mybatismybatis-plusredisrabbitMQESvue等,在之前一年的开发过程中我一共有着两个项目的开发经验,一个是零食售卖商城,一个是二手手机回购网站,由于我最近几个月主要时间都是开发这个零食售卖商城,所以我以此项目为中心做一个大致的介绍。
    首先,这个零食售卖商城是基于springbootvue开发的一个B2C类型的商城,主要分为前台的商城系统与后台的管理系统。
    前台的主要页面有:登录注册页面,首页,商品详情页面,购物车详情页面,订单结算页面以及最后的订单状态查看页面。
    后台的主要模块有:登录注册,用户权限的管理与设置,轮播图、类别、商品、订单详情的管理还有流水的记录等等。
    在此项目中我主要负责的是前台的登录,首页的搜索功能,还有支付功能模块的开发。
    登录模块中我们主要是有三种登录方式,分别是我们本平台的用户通过用户名和密码登录,手机号验证登录,遵从oAuth协议第三方平台登录。
    对于用户名密码的登录方式,我们采用了验证码与密码的双重认证和jwt生成的双token处理,在双重认证的验证码方面我们通过Nginx服务器对其采用限流刷新,对于密码我们采用的是springSecurity中的密码加密,主要原理就是对MD5处理后的密码二次撒盐处理,验证的时候就是将数据库密码取出盐值与用户输入密码MD5加密与一次撒盐处理后的结果进行比对验证,如果登录成功我们就会对其颁发两个token,对于双token就是access_tokenrefresh_tokenaccess_token主要作用是保证用户每一次操作的安全性,而refresh_token就是为了保证access_token的安全性。
    对于手机号验证码验证,我们主要通过阿里云短信服务实现,由于大多操作都是阿里云中的授权操作,这里我就不过多阐述。
    对于oAuth的第三方登录方式我们主要是QQ,微信,支付宝这三种,以QQ登录为例大致流程是:用户点击相应的第三方图标,当我们后端服务器会携带client_idscope,去调用腾讯的授权服务器,这个时候就会在我们页面出现一个授权页面,接着用户扫描授权页面中的二维码,或者输入用户名密码的方式同意此登录之后,腾讯的授权服务器将会向我们后端服务器返回一个code码,然后我们后端服务器通过client_id,code码,client_secret等几个参数获取一个access_token,最后我们就能通过此token去访问腾讯的资源服务器,获取用户的基本信息从而对相应信息进行处理,这样我们就实现了一个基本的社交登录。
    然后对于首页的搜索功能我们采用的是Elasticsearch,查询主要分为两块内容:
    1. 第一个前缀提示,我们做了拼音和中中文的前缀搜索,因为这个功能是项目中用的最多的功能,对速度要求很高,然后ES针对这种前缀专门提供了一种数据类型叫 completion;首先根据 pinyin和ik分词器提供现有的功能基础上自定了分词器,然后再定义 mapping,将需要进行前缀提示字段的类型设置为 completion, 分词器使用的是我们自定义的分词器;再通过 logstash 导入现有的数据,然后即可实现前缀提示功能;因为我们词库不完善,所以需要不停的纳入高频词库,我们所采取的方式,当用户执行搜索的时候,将用户搜索的词库投递 RabbiMQ中,然后消息的消费方,判断目前是否拥有该词,如果没有,通过使用 rediszset类型增加被搜索到次数;接着在后台管理系统中针对高频词(我们公司定义是100次)进行审核,审核通过的词就添加数据库中,然后我们借助于阿里的Canla 自定义 starter 同步数据。
    2. 搜索功能,首先要定义 mapping,将需要进行搜索的字段的 分词器设置 ik_max_word; 通过 logstash打入全量数据,然后就是搜索,前端使用高亮展示;对于增量数据我们还是借助于阿里的Canla 自定义 starter 同步数据。
    最后我负责的支付模块大致流程是这样的:
    当用户点击立即购买或者提交订单的这个时候数据库就会记录一笔订单,同时将此消息存储到rabbitMQ当中并设置的订单超时时间是一天,当用户一天未支付rabbitMQ就会将次订单号自动转发到死信队列, 然后监控订单状态的系统去对接此死信队列,判断此订单号是否支付,然后修改对应的支付状态。
     当用户点击付款的这个时候,可选择微信支付或者支付宝支付
    以微信支付为例,当用户选中微信支付的时候服务器会调用统一的微信支付接口,而微信支付接口需要与微信服务器建立连接,其中在建立连接时就需要三个必要的参数,分别是商户账号AppId,商户编号,商户key(秘钥)
    通过上述参数来构造PayConfig接口实现类,通过此实现类去建立微信的连接,建立连接之后就需要与微信的服务器进行通信,通过必要的参数来获得,支付链接,通过支付链接来生成二维码,从而实现微信二维码支付,上述提到的必要参数包括:支付说明、订单号、支付模式、支付金额、交易的类型、支付完成时微信回调方法的接口(需要内网穿透)。
     成功调用微信服务器对应接口之后,可得到用户支付的的必要参数,如支付短连接和支付金额,商品信息等等,通过这些必要参数由前端生成支付界面,然后用户就可自行支付,
    当用户扫码并付款后,这个时候会有较为多的消息需要处理
    比如(对微信服务器支付后结果的处理、订单状态的修改、支付流水的记录、支付积分的累计、消费劵的领取),通过上述的分析我们清晰的意识到如果上述问题用同步的方式处理那将是一个非常耗时的任务,所以当时我们采取了MQ(消息队列)来处理消息,又基于rabbitMQ强大的功能性,我们选择了此面向消息的中间件。
    此需求的处理显而易见肯定是在高并发的场景之下完成,我们设计了三个系统来保证消息的完整性,有消息的生产系统消息的补偿系统消息消费后后续系统操作
     消息的生产系统:在消息的生产系统包含了crud的大多操作,所以这个时候就需要事务,通过事务的具有的特性来完成以下步骤:1. 支付相关消息的编写(支付流水的记录,支付状态的修改等等), 2. 将投递给MQ的消息存储到数据库, 3. 将消息投递给MQ。完成上述事务之后, 这个时候消息的主要操作就到了rabbitMQ当中,rabbitMQ需要判断消息是否到达了交换机与队列,如果到达到了最终的队列就将消息消费掉之后进行删除,只要在交换机或者队列的任意一个步骤出错就什么都不做。
    消息的补偿系统:定时扫描数据库中未被消费的消息,将未被消息的消息进行重复投递。
     消息消费的后续系统操作:上述两个系统保证了消息的可靠性投递,这最后一个系统就将这些消息来进行业务处理,主要包含了以下业务:支付流水的记录,消费积分的记录,订单状态的修改,消费劵的领取等等。
    上述就是我在此项目中所做的大致流程。

在现代软件开发和系统架构设计中,有许多常见的IT技术栈组件被广泛使用。以下是一些关键组件及其用途和特点: ### Spring Cloud Alibaba Netflix Components Spring Cloud Alibaba 提供了一系列组件来支持分布式系统的开发与管理。其中,Netflix 组件如 Hystrix、Ribbon 和 Feign 被集成以提供服务容错、负载均衡和服务间通信的功能。例如,Hystrix 可以帮助实现服务的断路器模式,防止服务雪崩效应[^4]。 ### MyBatisMyBatis Plus MyBatis 是一个优秀的持久层框架,它支持定制化 SQL 查询、存储过程以及高级映射[^2]。MyBatis Plus 在此基础上增加了许多便捷的功能,如自动分页、逻辑删除等,简化了数据访问层的开发工作,并且提供了更强大的查询构建能力[^3]。 ### Redis Redis 是一种内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。由于其基于内存的操作特性,Redis 提供了非常快速的数据读写速度。此外,它还支持多种数据类型,如字符串、哈希表、列表、集合等,并且可以通过持久化机制将数据保存到磁盘上[^5]。 ### Oracle 和 MySQL Oracle 和 MySQL 都是关系型数据库管理系统(RDBMS),它们都支持 ACID 事务处理。Oracle 通常用于企业级应用,提供高级别的可扩展性和安全性;而 MySQL 则因其开源、轻量级和易用性而在 Web 应用中非常流行[^2]。 ### Kafka Apache Kafka 是一个分布式的流处理平台,它可以处理实时数据 feeds。Kafka 被设计为具有高吞吐量的特点,适合大规模消息处理场景。它能够同时处理大量的信息流,并保证消息传递的可靠性[^1]。 ### RabbitMQ RabbitMQ 是一个开源的消息代理和队列服务器,提供了一个可靠的消息传递中间件解决方案。它支持多种协议,并且可以部署为集群以提高可用性和性能。RabbitMQ 常用于解耦服务、流量削峰以及实现异步处理等场景。 ### Elasticsearch Elasticsearch 是一个分布式的搜索和分析引擎,适用于需要对大量数据进行快速全文检索和实时分析的应用场景。它具备水平扩展的能力,可以通过增加节点来提升搜索性能和容量。 ### Prometheus 和 Grafana Prometheus 是一个监控系统和时间序列数据库,它通过拉取指标的方式收集监控数据,并提供了灵活的查询语言来操作这些数据。Grafana 则是一个可视化工具,允许用户创建仪表板来展示来自 Prometheus 或其他数据源的指标数据。两者结合可以构建出强大的监控和告警系统[^1]。 这些技术栈组件各自解决特定领域的问题,并且经常被组合起来使用,以满足复杂的企业级应用程序的需求。在选择具体的技术时,应考虑项目的规模、团队的技术背景以及业务需求等因素。 --- ```java // 示例:Spring Boot 中配置 MyBatis Plus 的简单配置类 @Configuration public class MyBatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值