仿抖音项目总结

仿抖音项目总结

项目介绍

该项目是仿照抖音和小红书开发的,功能主要包括视频、留言、粉丝、消息和用户等相关模块。主要是采用SpringBoot、Spring和MyBaits这三大框架来开发的。最终部署采用集群的方式。详细实现细节可以见具体后端代码,下文将从前端过渡到后端,逐步概括性的讲解应用的技术,重点在后端。

概述

该项目采用前后端分离的模式进行的开发,所谓前后端分离就是将前端和后端的项目分离开,然后各自独立部署,独立开发。这样做一方面可以前后端并行开发,独立调试,增加开发效率,而且在开发中,前后端的分工明确。

在项目中,我们也要遵守一个内网互通原则。在本地调试的过程中,内网互通往往需要我们关闭本地防火墙和Linux虚拟机的防火墙,并链接同一WiFi,保证处于同一网段。

前端

uni-app

uni-app是一个使用Vue.js开发所有前端应用的框架,开发者编写一套代码就可以在多个平台上发布,并且可以进行条件编译。同时具有丰富的组件和api可以使用。

HBuilderX

HBuilderX是一个轻巧、急速的轻如编辑器,强如IDE的合体版本。具有良好的扩展性和插件市场。在此项目中使用该工具开发前端。

uniCloud

uniCloud是DCloud在阿里云和腾讯云的serverless服务上封装而成的,而serverless是目前很火的概念,是下一代真正的云。

后端

knife4j

Knife4j的前身是swagger-bootstrap-ui,前身swagger-bootstrap-ui是一个纯swagger-ui的ui皮肤项目。是为JavaMVC框架集成Swagger生成Apiece文档的增强使用方案。以下是使用入门。
首先,在创建好的项目的pom.xml文件中引入knife4j的依赖包,Maven坐标如下:


<dependency>
    <groupId>com.github.xiaoymingroupId>
    
    <artifactId>knife4j-spring-boot-starterartifactId>
    <version>2.0.9version>
dependency>

其次,创建配置类,样板如下:

@Configuration
@EnableSwagger2WebMvc // 不同版本使用的注解是不同的,应该注意
public class Knife4jConfiguration {

    @Bean(value = "dockerBean")
    public Docket dockerBean() {
        //指定使用Swagger2规范
        Docket docket=new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(new ApiInfoBuilder()
                //描述字段支持Markdown语法
                .description("# Knife4j RESTful APIs")
                .termsOfServiceUrl("https://doc.xiaominfo.com/")
                .contact("[email protected]")
                .version("1.0")
                .build())
                //分组名称
                .groupName("用户服务")
                .select()
                //这里指定Controller扫描包路径
                .apis(RequestHandlerSelectors.basePackage("com.github.xiaoymin.knife4j.controller"))
                .paths(PathSelectors.any())
                .build();
        return docket;
    }
}

如果开发者使用的是Knife4j 2.x版本,并且Spring Boot版本高于2.4,那么需要在Spring Boot的yml文件中做如下配置:

spring:
    mvc:
        pathmatch:
            # 配置策略
            matching-strategy: ant-path-matcher

最后,新建一个Controller类,样例如下:

@Api(tags = "首页模块")
@RestController
public class IndexController {

    @ApiImplicitParam(name = "name",value = "姓名",required = true)
    @ApiOperation(value = "向客人问好")
    @GetMapping("/sayHi")
    public ResponseEntity<String> sayHi(@RequestParam(value = "name")String name){
        return ResponseEntity.ok("Hi:"+name);
    }
}

然后,就可以启动SpringBoot项目,并在浏览器中访问如下地址:
http://localhost:8080/doc.html,localhost:8080是地址和端口号,后面要有doc.html后缀。

Lombok

Lombok是一个可以简化我们书写POJO类的项目,需要在项目中加上如下坐标:


<dependency>
    <groupId>org.projectlombokgroupId>
    <artifactId>lombokartifactId>
dependency>

然后,在相关的POJO类中添加适当的注解,就可以达到简化如geter/seter这类方法。

Redis

Redis是一个使用ANSI C编写的开源、支持网络、基于内存、分布式、可选持久性的键值对存储数据库。在该项目中使用Redis,首先要引入Maven坐标:


<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-data-redisartifactId>
dependency>

然后再yml文件中进行相关配置:

spring:
  redis:
    host: 192.168.1.61  # 服务器地址
    port: 6379          # Redis服务端口号,默认是6379
    database: 0         # Redis中使用的数据库编号
    password: itzixi    # Redis的用户密码

这样就将Redis整合到SpringBoot项目中了。

Minio

MinIO 是在 GNU Affero 通用公共许可证 v3.0 下发布的高性能对象存储,是使用Golang语言实现的,可以用来云存储海量的照片、视频、音频、文件。首先要引入Maven库:


<dependency>
    <groupId>io.miniogroupId>
    <artifactId>minioartifactId>
    <version>8.2.1version>
dependency>

然后封装Minio工具类,详细代码见源代码。
最后在yml文件加入相关配置:

# MinIO 配置
minio:
  endpoint: http://192.168.1.176:9000     # MinIO服务地址
  fileHost: http://192.168.1.176:9000     # 文件地址host
  bucketName: orders                      # 存储桶bucket名称
  accessKey: root                         # 用户名
  secretKey: 12345678                     # 密码
  imgSize: 1024                           # 图片大小限制,单位:m
  fileSize: 1024                          # 文件大小限制,单位:m
MongDB

MongoDB 是非关系型数据库,也就是nosql,存储json数据格式会非常灵活,要比数据库mysql/MariaDB更好,同时也能为mysql/MariaDB分摊一部分的流量压力。可以用于保存非事务非核心的数据,此外,mongodb提供的gridfs提供小文件存储。首先要引入Maven依赖:

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-data-mongodbartifactId>
dependency>

然后在yml文件中添加如下信息:

spring:
  data:
    mongodb:
      uri: mongodb://root:[email protected]:27017 # 用户名:密码//@服务器地址:服务端口号
      database: imooc-red-book  # 使用的指定的数据库名

最后在启动类上加入如下注解:
@EnableMongoRepositories

RabbitMQ

RabbitMQ是由erlang语言开发的,基于AMQP(Advanced Message Queue Protocol)协议实现的,它是一种应用于应用之间的通信方法,MQ在分布式系统中应用非常广泛。主要应用于异步任务、提速、接口解耦和削峰等场景。首先,SpringBoot整合RabbitMQ需要引入以下坐标:


<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-amqpartifactId>
dependency>

并且需要添加如下配置

spring: 
  rabbitmq: 
    host: 192.168.1.204        # 服务器地址
    port: 5672                 # 服务的端口号
    username: admin            # 用户名
    password: admin            # 密码
    virtual-host: imooc-news   # 使用的虚拟节点的名字

最终创建如下配置类:

package com.imooc.api.config;

import com.rabbitmq.client.AMQP;
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMQConfig {

    // 定义交换机的名称
    public static final String EXCHANGE_MSG = "exchange_msg";

    // 定义队列的名称
    public static final String QUEUE_SYS_MSG = "queue_msg";

    // 创建交换机,放入springboot容器
    @Bean(EXCHANGE_MSG)
    public Exchange exchange() {
        return ExchangeBuilder                      // 构建交换机
                .topicExchange(EXCHANGE_MSG)    // 使用topic类型,并定义交换机的名称。https://www.rabbitmq.com/getstarted.html
                .durable(true)                      // 设置持久化,重启MQ后依然存在
                .build();
    }

    // 创建队列
    @Bean(QUEUE_SYS_MSG)
    public Queue queue() {
        return new Queue(QUEUE_SYS_MSG);
    }

    // 队列绑定交换机
    @Bean
    public Binding binding(
            @Qualifier(QUEUE_SYS_MSG) Queue queue,
            @Qualifier(EXCHANGE_MSG) Exchange exchange) {
        return BindingBuilder               // 定义绑定关系
                .bind(queue)                // 绑定队列
                .to(exchange)               // 到交换机
                .with("sys.msg.*")   // 定义路由规则(requestMapping映射)
                .noargs();                  // 执行绑定
    }
}
Nacos

Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。主要用于服务的注册和配置中心。使用过程中需要引入以下坐标:

<dependency>
    <groupId>com.alibaba.cloudgroupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>

然后,进行如下配置:

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.1.159:8848   # nacos 所在地址
  application:
    name: imooc-red-book                  # 注册的名字

# 打开监控
management:
  endpoint:
    web:
      exposure:
        include: '*'

若是用于配置中心,需要如下配置:
pom.xml:


<dependency>
    <groupId>com.alibaba.cloudgroupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>


<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-bootstrapartifactId>
dependency>

yml文件:

spring:
  cloud:
    nacos:
      config:
        server-addr: 192.168.1.159:8848   # 配置中心的地址
        file-extension: yaml              # 指定配置的文件格式

可以添加如下注解,进行自动刷新:
${prefix}-${spring.profiles.active}.${file-extension}

Nginx

ndency>

yml文件:
```yml
spring:
  cloud:
    nacos:
      config:
        server-addr: 192.168.1.159:8848   # 配置中心的地址
        file-extension: yaml              # 指定配置的文件格式

可以添加如下注解,进行自动刷新:
${prefix}-${spring.profiles.active}.${file-extension}

Nginx

Nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。

你可能感兴趣的:(spring,boot,mybatis,java-rabbitmq,spring,java)