苍穹外卖总结

完成总结

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

苍穹外卖

经历和收获

学这个项目之前,我学的是黑马的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。

操作步骤:

  1. 需要导入Spring Data Redis的依赖
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. 配置redis的相关信息
redis:
    host: localhost
    port: 6379
    password: 123456
    database: 10
  1. 编写配置类用来加载配置信息
@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;
    }
}
  1. 通过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。应用场景包括:缓存数据,防止重复请求,提高性能。

有几个常用注解:

  1. @EnableCaching 开启缓存注解功能,通常加在启动类上

  2. @Cacheable 在方法执行前先查询缓存中是否有数据,如果有数据,则直接返回缓存数据;如果没有缓存数据,调用方法并将方法返回值放到缓存中

  3. @CachePut 将方法的返回值放到缓存中

  4. @CacheEvict 将一条或多条数据从缓存中删除

起步依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>    
    <artifactId>spring-boot-starter-cache</artifactId>                                   
</dependency>

WebSocket

WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接, 并进行双向数据传输。

当客户端发送一个 WebSocket 请求时,服务器将发送一个协议响应以确认请求。在握手期间,客户端和服务器将协商使用的协议版本、支持的子协议、支持的扩展选项等。一旦握手完成,连接将保持打开状态,客户端和服务器就可以在连接上实时地传递数据。

WebSocket 协议使用的是双向数据传输,即客户端和服务器都可以在任意时间向对方发送数据,而不需要等待对方的请求。它支持二进制数据和文本数据,可以自由地在它们之间进行转换。

既然WebSocket支持双向通信,功能看似比HTTP强大,那么我们是不是可以基于WebSocket开发所有的业务功能?

这种问题显而易见,答案是否定的。那么为什么是否定的呢,原因主要有三点:

  1. WebSocket既然是长连接,那么服务器长期维护长连接就需要一定的成本,会增大程序的开销
  2. WebSocket不像HTTP一样更加广泛,各个浏览器对其支持程度不一
  3. WebSocket 是长连接,受网络限制比较大,需要处理好重连
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值