完成总结
苍穹外卖是我做的第一个后端项目,里面用到了大量的增删改查,前后大概花了两个月的时间学习和打磨。我希望第一个项目能作为基础,为之后的项目做好铺垫,所以学的也比较细,其中大部分接口都是我自己先手写,手写完成之后再去看视频,很像以前上高中时做完题对答案的一样,看看我代码写的是否规范,看看我的逻辑是否没有纰漏。这个项目中有大量的增删改查的接口,每次写完一个接口,在测试通过的时候,都会收获巨大的成就感。

经历和收获
学这个项目之前,我学的是黑马的javaweb,对那门课网上有很多说法,有的说好,有的说难。就我个人而言,那门课的特点就是难,跨度大,不过也很详尽。那门课我学了很久,前后大概跨了一个学期和两个假期,我第一次学到Mybatis的时候,感觉很抽象很难,就跳过了,想先学一学JDBC作为铺垫,可能会容易接收一些。但是JDBC很简单,学完了依然觉得Mybatis抽象,接着又去学spring框架,这种框架我认为还是在项目中学习效果会更好。因为在一开始的时候,我仍然不理解spring是干什么的,controller、service、mapper三层架构都是什么作用。我看了javaweb的课程,觉得javaweb可能学的太粗率,导致我不理解,接着我又去看来spring专门的视频,也是一知半解。我就干脆硬着头皮继续学习javaweb,好在最后虽然还是不太理解,但最起码的认识有了。
spring是一种用于简化复杂的企业开发的轻量级框架,是一种轻量级IOC和AOP的容器框架。
我当初一直没有明白,为什么使用spring框架,代码会多出那么多看似无用的controller这样的地方,把他们全部集中在一起,像以前写算法题一样不好吗?为什么还会说它是未来简化开发而存在?
带着这样的疑问,我开始学习了苍穹外卖,这个项目是我第一个真正的项目。按照黑马给出来的规划,这门课程可以在15天左右学完,如果只学习后端的话,12天就可以完成,但我足足学了两个月。首先是因为我开始写这个项目的时候,刚好开学了,开学之后的学校课程会压缩很大一部分时间,其实很多天都不能完整的学完规划的一天的内容,就半天半天,有时候一天课程的四分之一这样学习。而且刚开始,也不太熟练,各种报错,各种调试,不光代码问题,有时候推送也会出现很大的问题。
很多时候,学习的大部分时间都浪费在了“修电脑”上,可能学了五个小时,有三个半小时在调bug和修电脑。当时还很着急,觉得这严重拖后了我学习的进度,确实是这样,不过它仍然教会了我一些东西,比如阅读报错信息,比如调试技巧,比如git的一些命令操作。这个项目虽然网上说很烂大街,但是我仍然认为它作为第一个项目是非常优秀的,大量的crud,对spring整合mabatis框架更加熟悉,对项目开发有了一个比较明确的认识,知道这些项目真正是怎么写出来的,这都是不可或缺的。

技术回顾
这个项目用到了很多技术,虽然都不难,有些很重要的用的也非常浅,但对我都有很大的帮助。比如Echarts做图表,这获取并不是一个核心技术,但它能做出来一个可视化的报表,这让我觉得很新奇。比如redis,以前一直听说redis,可谓如雷贯耳,大名鼎鼎,但是一直不知道究竟redis是什么,这样一个非常重要的东西,在这个项目中,共花费了大概一天多的时间学习,学的也比较浅显,但我终于知道redis究竟是什么了,也知道redis大概怎么用了。
Nginx和Tomcat
这并不是一个新遇到的技术,这个技术在javaweb中就有所提到,这个项目中也就是顺带一提,再次讲到了Nginx的反向代理。Tomcat几乎没怎么出现,但是在spring中内嵌了Tomcat。SpringBoot默认web程序启用内嵌容器tomcat,默认监听8080端口。

MD5和JWT
MD5是一种密码,可以将一串字符加密,这个过程是不可逆的,也就意味着,只能加密,不能解密。我们使用这个密码对数据库中的密码进行加密,保护数据安全。在java程序中,登录需要输入密码时,因为无法解密,不能将数据库中的加密密码解密后和从前端接收到的数据比较,所以可以将前端接收到的密码先加密,去和数据库中的密码做比较。
JWT在javaweb和这个项目中有着重介绍。主要作用是将原始JSON进行安全封装,主要有三部分构成Header(令牌类型、签名算法等),载荷(携带信息),签名(防伪)组成。因为有签名算法加密运算,所以可以保证信息的安全性和时效性,常用于登录验证等场景。
redis非关系型数据库
以前在学习MySQL时,介绍了关系型数据库,比如mysql,Oracle等。关系型数据库是指采用了关系模型来组织数据的数据库。简单来说,关系模式就是二维表格模型,所以以前一直存储数据都是通过表格来存储。那么为什么要学习redis呢?redis是一个开源的、基于内存的键值存储数据库。它是使用键值来存储数据,既然如此,它就没有不是关系型数据库,也就是非关系型数据库。它提供了一个高性能的键值(key-value)存储系统,不仅支持简单的键值对,还支持丰富的数据结构,如字符串、哈希、列表、集合等。与传统关系型数据库相比,Redis 的主要优势在于速度极快,它将数据存储在内存中,而不是硬盘,这使得数据读写操作的速度比传统数据库快了数百倍,适合需要快速响应的场景。
这里需要提一点,我这学期刚好学习计组和操作系统,我在学习redis那天的课程的时候,还没太明白什么是内存外存,又过了两天,计组和操作系统讲到了这里,理解了主存、辅存、缓存的区别和不同,对redis的理解会更加深入一点。主存直接与CPU交换信息,所以要求速度快,但是价格较高,如果需要大量的存储空间,那么对于价格是很大的要求。而辅存,也就是硬盘等,速度慢,但是价格低,可以扩展出大量的存储空间。这样的层次设计,可以将需要大量访问的资源放到主存中,不需要大量访问的可以放在辅存内。那么,redis将数据存储在内存中,也就是主存,速度必然要比硬盘快很多,这就是redis的强大之处。
像MySQL,有着JDBC,Mybatis,Mybatis-plus等为java提供操作数据库的技术一样,Spring框架中也有相关依赖,可以用java来操作redis。Spring 封装了 RedisTemplate 对象来进行对redis的各种操作,它支持所有的 redis 原生的 api。
操作步骤:
- 需要导入Spring Data Redis的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 配置redis的相关信息
redis:
host: localhost
port: 6379
password: 123456
database: 10
- 编写配置类用来加载配置信息
@Configuration
@Slf4j
public class RedisConfiguration {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
//输出日志
log.info("开始创建redis模板对象...");
//创建RedisTemplate对象
RedisTemplate redisTemplate = new RedisTemplate();
//设置redis的连接工厂对象
redisTemplate.setConnectionFactory(redisConnectionFactory);
//设置redis key的序列化器
redisTemplate.setKeySerializer(new StringRedisSerializer());
return redisTemplate;
}
}
- 通过redisTemplate对象操作redis
@SpringBootTest
public class SpringDataRedisTest {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void testRedisTemplate(){
System.out.println(redisTemplate);
//string数据操作
ValueOperations valueOperations = redisTemplate.opsForValue();
//hash类型的数据操作
HashOperations hashOperations = redisTemplate.opsForHash();
//list类型的数据操作
ListOperations listOperations = redisTemplate.opsForList();
//set类型数据操作
SetOperations setOperations = redisTemplate.opsForSet();
//zset类型数据操作
ZSetOperations zSetOperations = redisTemplate.opsForZSet();
}
}
Spring Cache
Spring Cache是Spring框架提供的一个抽象层,用于在应用程序中集成各种缓存技术。它的出现就像Spring一样,现在项目面临各类缓存的应用增多,在通用的Spring框架上,就需要有一种更加便捷简单的方式,来完成缓存的支持,它的底层可以切换不同的缓存实现,最常用的就是redis。应用场景包括:缓存数据,防止重复请求,提高性能。
有几个常用注解:
-
@EnableCaching 开启缓存注解功能,通常加在启动类上
-
@Cacheable 在方法执行前先查询缓存中是否有数据,如果有数据,则直接返回缓存数据;如果没有缓存数据,调用方法并将方法返回值放到缓存中
-
@CachePut 将方法的返回值放到缓存中
-
@CacheEvict 将一条或多条数据从缓存中删除
起步依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
WebSocket
WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接, 并进行双向数据传输。
当客户端发送一个 WebSocket 请求时,服务器将发送一个协议响应以确认请求。在握手期间,客户端和服务器将协商使用的协议版本、支持的子协议、支持的扩展选项等。一旦握手完成,连接将保持打开状态,客户端和服务器就可以在连接上实时地传递数据。
WebSocket 协议使用的是双向数据传输,即客户端和服务器都可以在任意时间向对方发送数据,而不需要等待对方的请求。它支持二进制数据和文本数据,可以自由地在它们之间进行转换。
既然WebSocket支持双向通信,功能看似比HTTP强大,那么我们是不是可以基于WebSocket开发所有的业务功能?
这种问题显而易见,答案是否定的。那么为什么是否定的呢,原因主要有三点:
- WebSocket既然是长连接,那么服务器长期维护长连接就需要一定的成本,会增大程序的开销
- WebSocket不像HTTP一样更加广泛,各个浏览器对其支持程度不一
- WebSocket 是长连接,受网络限制比较大,需要处理好重连
1万+

被折叠的 条评论
为什么被折叠?



