该项目是仿照抖音和小红书开发的,功能主要包括视频、留言、粉丝、消息和用户等相关模块。主要是采用SpringBoot、Spring和MyBaits这三大框架来开发的。最终部署采用集群的方式。详细实现细节可以见具体后端代码,下文将从前端过渡到后端,逐步概括性的讲解应用的技术,重点在后端。
该项目采用前后端分离的模式进行的开发,所谓前后端分离就是将前端和后端的项目分离开,然后各自独立部署,独立开发。这样做一方面可以前后端并行开发,独立调试,增加开发效率,而且在开发中,前后端的分工明确。
在项目中,我们也要遵守一个内网互通原则。在本地调试的过程中,内网互通往往需要我们关闭本地防火墙和Linux虚拟机的防火墙,并链接同一WiFi,保证处于同一网段。
uni-app是一个使用Vue.js开发所有前端应用的框架,开发者编写一套代码就可以在多个平台上发布,并且可以进行条件编译。同时具有丰富的组件和api可以使用。
HBuilderX是一个轻巧、急速的轻如编辑器,强如IDE的合体版本。具有良好的扩展性和插件市场。在此项目中使用该工具开发前端。
uniCloud是DCloud在阿里云和腾讯云的serverless服务上封装而成的,而serverless是目前很火的概念,是下一代真正的云。
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是一个可以简化我们书写POJO类的项目,需要在项目中加上如下坐标:
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
dependency>
然后,在相关的POJO类中添加适当的注解,就可以达到简化如geter/seter这类方法。
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 是在 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
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是由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是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。主要用于服务的注册和配置中心。使用过程中需要引入以下坐标:
<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}
ndency>
yml文件:
```yml
spring:
cloud:
nacos:
config:
server-addr: 192.168.1.159:8848 # 配置中心的地址
file-extension: yaml # 指定配置的文件格式
可以添加如下注解,进行自动刷新:
${prefix}-${spring.profiles.active}.${file-extension}
Nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。