项目里程碑
项目里程碑下图是项目原计划的时间线![img](https://img-blog.csdnimg.cn/img_convert/6969d56763beda3ddf7050abefbd5ed0.png)
项目技术架构
![在这里插入图片描述](https://img-blog.csdnimg.cn/3e7d5e21263c476ba6b0226f4135953a.png#pic_center)
下面介绍各个技术:
DNS(Domain Name Server,域名服务器)是进行域名(domain name)和与之相对应的IP地址 (IP address)转换的服务器。DNS中保存了一张域名(domain name)和与之相对应的IP地址 (IP address)的表,以解析消息的域名。 域名是Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。域名是由一串用点分隔的名字组成的,通常包含组织名,而且始终包括两到三个字母的后缀,以指明组织的类型或该域所在的国家或地区。
WAF,Web应用防护系统(也称为网站应用级入侵防御系统。全称:Web Application Firewall)。Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。
**CDN,**全称是 Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。
防火墙(Firewall)技术是通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障,以保护用户资料与信息安全性的一种技术。 防火墙技术的功能主要在于及时发现并处理计算机网络运行时可能存在的安全风险、数据传输等问题,其中处理措施包括隔离与保护,同时可对计算机网络安全当中的各项操作实施记录与检测,以确保计算机网络运行的安全性,保障用户资料与信息的完整性,为用户提供更好、更安全的计算机网络使用体验。
Nginx 是一个高性能的 HTTP 和反向代理 Web 服务器,同时也提供了IMAP/POP3/SMTP服务。其特点是占有内存少,并发能力强,事实上 Nginx 的并发能力在同类型的网页服务器中表现较好。
Spring WebFlux 是一个异步非阻塞式 IO 模型,通过少量的容器线程就可以支撑大量的并发访问。是 Spring5 添加新的模块,用于web开发,功能与 SpringMVC 类似。底层使用的是 Netty 容器,而传统的 SpringMVC 是基于 Servlet 的。异步非阻塞的框架在Servlet3.1 以后才支持,核心是基于 Reactor 的相关api实现。
项目开发流程
项目开发流程下图是一个项目完整的开发流程
![在这里插入图片描述](https://img-blog.csdnimg.cn/b214497545a24d63b22632607c801367.png#pic_center)
项目结构
项目结构下图是本项目的代码包说明
![在这里插入图片描述](https://img-blog.csdnimg.cn/3593fc6e66c740499ca4d4d3479d9969.png#pic_center)
数据库设计
数据库设计我们队主要负责酒店的搜索模块的开发。MySQL中只设计搜索模块的枚举即可。
搜索枚举表
![在这里插入图片描述](https://img-blog.csdnimg.cn/3b4d4782dcd349788af5bf37887888ce.png#pic_center)
搜索枚举的数据
![在这里插入图片描述](https://img-blog.csdnimg.cn/d9e8dc36b97a430bb14e6a56f65f551e.png#pic_center)
知识点
面试题
面试题
MySQL 索引在什么情况下会失效?
- 如果条件中有or,即使其中有条件带索引也不会使用。
- like查询是以%开头,则会导致索引失效;但是以%结束,不会导致索引失效。
- 如果查询的类型是字符串,那一定要在条件中将数据使用引号引用起来,否则会导致索引。
- where条件后中使用不等于(!= 或者<>)的时候,索引会失效。
- is null或者is not null 也会导致无法使用索引。
- 对于多列联合索引,不符合最左前缀法则的话会导致索引失效。
常见的索引失效情况如下图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/cdf78dd5516e4c7d8b35ae74e6d8c39a.png#pic_center)
如何查看 SQL 的执行计划?
在 SQL 语句前添加关键字——explain,即可查看当前语句的执行计划。
说一下 MySQL 的隔离级别有几个,并详细介绍?
Mysql的有四种隔离级别,分别是:读取未提交、读已提交、可重复、可串行化。
1、读未提交(READ_UNCOMMITTED)
读未提交,该隔离级别允许脏读取,其隔离级别是最低的。换句话说,如果一个事务正在处理理某一数据,并对其进行了更新,但同时尚未完成事务,因此还没有提交事务;而以此同时,允许另一个事务也能够访问该数据。
2、 读已提交(READ_COMMITTED)
读已提交是不同的事务执行的时候只能获取到已经提交的数据。 这样就不会出现上面的脏读的情况了。 但是在同一个事务中执行同一个读取,结果不一致 不可重复读示例 可是解决了脏读问题,但是还是解决不了可重复读问题。
3、可重复读(REPEATABLE_READ)
可重复读就是保证在事务处理理过程中,多次读取同一个数据时,该数据的值和事务开始时刻是一致的。 因此该事务级别限制了不可重复读和脏读,但是有可能出现幻读的数据。
4、可串行化(SERIALIZABLE)
可串行化是最严格的事务隔离级别。它要求所有的事务排队顺序执⾏行行,即事务只能一个接一个地处理,不能并发。
幻读(PhantomRead):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就有几列数据是未查询出来的,如果此时插入和另外一个事务插入的数据,就会报错。
脏读(DrityRead):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。
不可重复读(Non-repeatableread):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。
什么是 MVCC?
MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。
说一下 MySQL 的 binlog 文件(二进制日志)?
详细结束见:https://blog.csdn.net/u012834750/article/details/79533866
说一下 MySQL 的 redolog 文件( 重做日志)?
详细结束见:https://blog.csdn.net/u012834750/article/details/79533866
说一下 MySQL 的 undolog 文件( 回滚日志)?
详细结束见:https://blog.csdn.net/u012834750/article/details/79533866
数据库底层有哪些存储引擎?
MySQL 共有9种,常用的为 InnoDB(在 MySQL5.5 之后为默认存储引擎)![在这里插入图片描述](https://img-blog.csdnimg.cn/3bfd4d5ea1f04fd4b935493dc6209cb1.png#pic_center)
详解见:https://bisal.blog.csdn.net/article/details/121154560
MySQL 底层存储的数据结构?
使用的是 B+树 的数据结构
事务的特性?
1、原子性(Atomicity) 事务的原⼦性是指事务必须是⼀个原子的操作序列单元。事务中包含的各项操作在⼀次执行过程中,只允许出现两种状态之一。 全部执行成功 全部执行失败 事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执⾏过程中出错, 会回滚到事务开始前的状态,所有的操作就像没有发⽣一样。也就是说事务是⼀个不可分割的整体,就 像化学中学过的原子,是物质构成的基本单位。
2、⼀致性(Consistency) 事务的一致性是指事务的执⾏不能破坏数据库数据的完整性和一致性,一个事务在执⾏之前和执行之 后,数据库都必须处以⼀致性状态。 比如:如果从A账户转账到B账户,不可能因为A账户扣了钱,而B账户没有加钱。
3、隔离性(Isolation) 事务的隔离性是指在并发环境中,并发的事务是互相隔离的。也就是说,不同的事务并发操作相同的数 据时,每个事务都有各自完整的数据空间。⼀个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务是不能互相干扰的。
4、持久性(Duration) 事务的持久性是指事务⼀旦提交后,数据库中的数据必须被永久的保存下来。即使服务器系统崩溃或服务器宕机等故障。只要数据库重新启动,那么一定能够将其恢复到事务成功结束后的状态。
MySQL有哪些锁?
MySQL的锁有:行锁、表锁、共享锁、排他锁、乐观锁、悲观锁以及间隙锁。
ElasticSearch知识点
简介
ElasticSearch(简称 ES)是一个分布式,可扩展,近实时的高性能都多与数据分析引擎,提供了收集,分析,存储数据三大功能。主要特性:分布式,零配置,亦庄亦用,自动发现,索引自动分片,索引副本机制,RestFul风格接口,多数据源和自动搜索负载。ES基于 java 编写,内部使用 Lucene 做索引及搜索,通过进一步封装 Lucene 解决了 Lucene内部的复杂性,对外提供一个rest形式的API,对开发人员很友好,让全文搜索更简单。
核心概念
- index:索引。包含一堆有相似结构的文档数据,比如可以有一个酒店索引,酒店分类索引,房间索引。一个 index 包含很多 document,一个 index 就代表了一类类似的或者相同的document,比如说一个hotel index,酒店索引,里面可能就存放了所有的酒店品数据,所有的酒店的document。
- Near Relatime:近实时。从写入数据到可以被搜索有一个小延迟(大概一秒);基于es搜索和分析可以达到秒级。
- Cluster:集群。包含多个节点,每个节点属于哪一个集群是通过配置(集群名称,默认是elasticsearch)来决定的。项目中只有一个节点。
- Node:节点。集群当中的一个节点,节点也有一个名称,默认是随机分配的,节点名称很重要(在执行运维管理操作的时候),默认节点会加入到一个名为“elasticsearch”的集群。如果直接启动一堆节点,默认会加入名为elasticsearch的集群。
- Document:文档。es当中的最小单元,一个document可以是一条商品数据,也可以是一条订单数据,通常用JSON数据结构表示,每个index下的type当中,都可以去存储多个document,一个document中可以有多个field,field就是一个数据字段。
- type:类型。每个索引当中都可以有一个type或者多个type,type是index的一个逻辑数据分类。一个type下的document,都有相同的field,比如博客系统,有一个索引,可以定义用户type,博客type,评论type等等。
- shard:单台机器无法存储大量的数据,ES 可以将一个索引当中的数据切分为多个 shard,分布在多台机器上存储,有了shard就可以横向扩展,存储更多的数据,让搜索和分析等操作分布在多台机器上去执行,提升吞吐量和性能,每个shard都是一个Lucene index项目中shard为设置为3。
![在这里插入图片描述](https://img-blog.csdnimg.cn/4c41689490154e43bac50216027e06df.png#pic_center)
- replica:任何一个服务器随时都有可能宕机或者故障,此时shard就有可能丢失,因此可以为每个shard创建多个replica副本,replica可以在shard故障时提供备用服务,以保证数据不会丢失,多个replica可以提升搜索操作的吞吐量和性能。primary shard(建立索引时一次设置,不能修改,默认5个),replica shard(随时修改数量,每个shard默认一个)。默认每个索引10个shard,5个primary shard,5个replica shard,最小的高可用配置,是2台机器。
ES 是一个非常强大的搜索引擎。被广泛地使用于各个 IT 公司。ES 是由 Elastic 公司创建,是一个免费及开放的项目。同时,ES 还有两个很好的伙伴: Logstash、 Kibana 。这个三个项目组合在一起,就形成了 ELK 软件栈。他们三个共同形成了一个强大的生态圈。简单地说,Logstash 负责数据的采集,处理(丰富数据,数据转换等),Kibana 负责数据展示,分析,管理,监督及应用。Elasticsearch 处于最核心的位置,它可以帮我们对数据进行快速地搜索及分析。
ES的下载地址:https://www.elastic.co/cn/downloads/past-releases#elasticsearch
全文搜索
全文检索是指:通过一个程序扫描文本中的每一个单词,针对单词建立索引,并保存该单词在文本中的位置,以及出现的次数;用户查询时,通过之前建立好的索引来查询,将索引中单词对应的文本位置,出现的次数返回给用户,因为有了具体文本的位置,所以就可以将具体内容读取出来了。
docker部署ES
docker 的安装详细见:https://blog.csdn.net/qq_44529550/article/details/123150430
docker部署 es 详细见:https://blog.csdn.net/qq_44529550/article/details/123777652
接口设计
使用 apipost 工具设计酒店
搜索模块的接口。
![在这里插入图片描述](https://img-blog.csdnimg.cn/35f3d82fc64b4490804e72dfc28dc08c.png#pic_center)
酒店搜索接口信息
![在这里插入图片描述](https://img-blog.csdnimg.cn/4c30949882e04c1a82941b95df19b4d5.png#pic_center)
获取枚举列表接口信息
添加枚举的接口信息
![在这里插入图片描述](https://img-blog.csdnimg.cn/fa8114d485244ca993a1ecab6d902098.png#pic_center)
修改枚举接口信息
![在这里插入图片描述](https://img-blog.csdnimg.cn/e8d5caae4abe4b2aa6c19a4013ada58d.png#pic_center)
删除枚举接口信息
![在这里插入图片描述](https://img-blog.csdnimg.cn/92609e461b744d29ac1176eb4574dfd9.png#pic_center)
查询枚举接口信息
![img](https://img-blog.csdnimg.cn/img_convert/bcce53a22b0d7e5b56d59ea83fc0a5d1.png)
总结
总结经过这一个多月的时间,项目终于接近尾声,项目的代码我没有写多少,刚开始自己写了关于枚举增删改查的部分代码,但在开会时,有其他的同学写的比我好,比我规范,所以的将我的代码全部删了,使用同学写得优秀的代码。我们队开发的是酒店的搜索模块,主要是使用 ElasticSearch(简称ES)来搜索酒店信息。ES 我是第一次接触到,所以刚开始时,在 B站上看了相关教程的视频,查阅了相关的ES官方文档和博客文档。 自己查阅资料学习,刚开始都不知道怎么下手,因为在上班学习的,一天抽出一两个小时学习,学习了一个星期左右才能学会,使用Kibana进行ES的操作,使用PUT关键字创建索引。这种学习很锻炼自己,让自己从不知道这个东西是什么到如何快速的运行这个东西。从无到有,让自己队工具有自己的。除了学习ES之外,还使用docker部署的项目使用到的工具:
通过本项目,让我知道了一个产品项目从0到1的过程,其中使用哪些中间件,在哪一步应该什么,对自己技术掌握的情况了解(感觉啥也不会)。希望我能加强我的技术方面的练习,熟悉每个技术栈,能够结合实际情况灵活的使用技术,我个人有时比较死脑经,就是转不过弯来,希望以后能改掉自己的毛病。在此,特别感谢师哥,给我们指导代码的规范、各种资料的共享,和我们聊个人的发展并给出宝贵的建议。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)