前言 这是作者第一个开发的后端项目,坚持学习技术和记录学习过程

提示:以下是本篇文章正文内容,仅供参考

一、软件开发整体介绍

了解在软件开发过程中的开发流程, 以及软件开发过程中涉及到的岗位角色,角色的分工、职责, 并了解软件开发中涉及到的三种软件环境。

软件开发流程

角色分工

实际过程中可能因为人员配置紧张,需要程序员兼任

岗位/角色 对应阶段 职责/分工
项目经理 全阶段 对整个项目负责,任务分配、把控进度
产品经理 需求分析 进行需求调研,输出需求调研文档、产品原型等
UI设计师 设计 根据产品原型输出界面效果图
架构师 设计 项目整体架构设计、技术选型等
开发工程师 编码 功能代码实现
测试工程师 测试 编写测试用例,输出测试报告
运维工程师 上线运维 软件环境搭建、项目上线

软件环境

1 开发环境(development)

软件开发人员在开发阶段使用的环境就是开发环境,一般外部用户无法访问。这些应用软件仅仅在软件开发过程中使用, 项目测试、上线时,我们不会使用这套环境了,这个环境就我们作为是开发环境。

2  测试环境(testing)

当软件开发工程师,将项目的功能模块开发完毕,并且单元测试通过后,就需要将项目部署到测试服务器上,让测试人员对项目进行测试。那这台测试服务器就是专门给测试人员使用的环境, 也就是测试环境,用于项目测试,一般外部用户无法访问。

3  生产环境(production)

当项目开发完毕,并且由测试人员测试通过之后,就可以上线项目,将项目部署到线上环境,并正式对外提供服务,这个线上环境也称之为生产环境。

往往开发环境大多数都是本地的电脑环境和局域网内的环境,

测试环境一般是一台独立测试服务器的环境,

生产环境可以是机房或者云服务器等线上环境。

二、项目介绍

功能架构:体现项目中的业务功能模块

产品原型:用于展示项目的业务功能,不是最终的页面效果,一般由产品经理设计

技术选型:展示项目中使用到的技术框架和中间件等

用户层:构建系统管理后台的前端页面

网关层:Nginx是一个服务器,主要用来作为Http服务器,部署静态资源,访问性能高。Nginx的两个比较重要的作用: 反向代理和负载均衡。

应用层

SpringBoot: 快速构建Spring项目,  简化Spring项目的配置开发。

SpringMVC:SpringMVC是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合,可以无缝集成。

Spring Task: 由Spring提供的定时任务框架。

httpclient: 主要实现了对http请求的发送。

Spring Cache: 由Spring提供的数据缓存框架。

JWT: 用于对应用程序上的用户进行身份验证的标记

阿里云OSS: 对象存储服务,在项目中主要存储文件,如图片等。

Swagger: 可以自动的帮助开发人员生成接口文档,并对接口进行测试

POI: 封装了对Excel表格的常用操作。

WebSocket: 一种通信网络协议,使客户端和服务器之间的数据交换更加简单,用于项目的来单、催单功能实现。

数据层

MySQL: 关系型数据库, 本项目的核心业务数据都会采用MySQL进行存储。

Redis: 基于key-value格式存储的内存数据库, 访问速度快, 经常使用它做缓存。

Mybatis: 本项目持久层将会使用Mybatis开发。

pagehelper: 分页插件。

spring data redis: 简化java代码操作Redis的API。

工具

git: 版本控制工具, 在团队协作中, 使用该工具对项目中的代码进行管理。

maven: 项目构建工具。

junit:单元测试工具,开发人员功能实现完毕后,需要通过junit对功能进行单元测试。

postman: 接口测试工具,模拟用户发起的各类HTTP请求,获取对应的响应结果。

三、开发环境搭建

前端工程基于nginx(资源必须在非中文目录内)

后端工程基于maven进行项目构建,并且分模块开发

对工程的每个模块作用说明:

序号 名称 说明
1 sky-take-out maven父工程,统一管理依赖版本,聚合其他子模块
2 sky-common 子模块,存放公共类,例如:工具类、常量类、异常类等
3 sky-pojo 子模块,存放实体类、VO、DTO等
4 sky-server 子模块,后端服务,存放配置文件、Controller、Service、Mapper等

分析sky-common模块的每个包的作用:

名称 说明
constant 存放相关常量类
context 存放上下文类
enumeration 项目的枚举类存储
exception 存放自定义异常类
json 处理json转换的类
properties 存放SpringBoot相关的配置属性类
result 返回结果类的封装
utils 常用工具类

分析sky-pojo模块的每个包的作用:

名称 说明
Entity 实体,通常和数据库中的表对应
DTO 数据传输对象,通常用于程序中各层之间传递数据
VO 视图对象,为前端展示数据提供的对象
POJO 普通Java对象,只有属性和对应的getter和setter

分析sky-server模块的每个包的作用:

名称 说明
config 存放配置类
controller 存放controller类
interceptor 存放拦截器类
mapper 存放mapper接口
service 存放service类
SkyApplication 启动类

Git版本控制

1 本地创建Git仓库,管理代码

2 远程创建一个空的仓库(gitee)

3 把本地文件推送到远程仓库

 数据库环境搭建

将.sql文件导入MySQLWorkbeach创建表文件

前后端联调测试

重要注意点:

这部分在登录页面时一定要将sky-take-out的sky-server/src/main/resources/mapper中的application-dev.yml文件中的username和password修改为自己MySQL的账号密码,否则会一直循环运行错误

(作者自己在这个地方找错误找了快2个小时,都快要心碎力竭了😭)

nginx反向代理: 将前端发送的动态请求由nginx转发到后端服务器

nginx 反向代理的好处:

  • 提高访问速度

    因为nginx本身可以进行缓存,如果访问的同一接口,并且做了数据缓存,nginx就直接可把数据返回,不需要真正地访问服务端,从而提高访问速度。

  • 进行负载均衡

    所谓负载均衡,就是把大量的请求按照我们指定的方式均衡的分配给集群中的每台服务器

  • 保证后端服务安全

    因为一般后台服务地址不会暴露,所以使用浏览器不能直接访问,可以把nginx作为请求访问的入口,请求到达nginx后转发到具体的服务中,从而保证后端服务的安全。

nginx 反向代理的配置方式:

server{
    listen 80;
    server_name localhost;
    
    location /api/{
        proxy_pass http://localhost:8080/admin/; #反向代理
    }
}

proxy_pass:该指令是用来设置代理服务器的地址,可以是主机名称,IP地址加端口号等形式。

nginx 负载均衡

当如果服务以集群的方式进行部署时,那nginx在转发请求到服务器时就需要做相应的负载均衡。其实,负载均衡从本质上来说也是基于反向代理来实现的,最终都是转发请求

nginx 负载均衡的配置方式:

upstream webservers{
    server 192.168.100.128:8080;
    server 192.168.100.129:8080;
}
server{
    listen 80;
    server_name localhost;
    
    location /api/{
        proxy_pass http://webservers/admin;#负载均衡
    }
}

upstream:如果代理服务器是一组服务器的话,我们可以使用upstream指令配置后端服务器组。

根据webservers名称找到一组服务器,根据设置的负载均衡策略(默认是轮询)转发到具体的服务器。

nginx 负载均衡策略:

名称 说明
轮询 默认方式
weight 权重方式,默认为1,权重越高,被分配的客户端请求就越多
ip_hash 依据ip分配方式,这样每个访客可以固定访问一个后端服务
least_conn 依据最少连接方式,把请求优先分配给连接数少的后端服务
url_hash 依据url分配方式,这样相同的url会被分配到同一个后端服务
fair 依据响应时间方式,响应时间短的服务将会被优先分配

完善登录功能

问题:员工表中的密码是明文存储,安全性太低。

解决思路:

  1. 将密码加密后存储,提高安全性

  2. 使用MD5加密方式对明文密码加密(是单向加密的,是不可解密的)

实现步骤:

  1. 修改数据库中明文密码,改为MD5加密后的密文

  2. 修改Java代码,前端提交的密码进行MD5加密后再跟数据库中密码比对

导入接口文档

开发方式就是基本当前企业主流的前后端分离开发方式,那么这种方式就要求先将接口定义好,这样前后端人员才能并行开发,就需要将接口文档导入到管理平台,为后面业务开发做好准备。

前后端分离开发流程

第一步:定义接口,确定接口的路径、请求方式、传入参数、返回参数。

第二步:前端开发人员和后端开发人员并行开发,同时,也可自测。

第三步:前后端人员进行连调测试。

第四步:提交给测试人员进行最终测试。

导入接口用Apifox

Swagger

Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。 它的主要作用是:

  1. 使得前后端分离开发更加方便,有利于团队协作

  2. 接口的文档在线自动生成,降低后端开发人员编写接口文档的负担

  3. 功能测试: 通过在项目中引入Springfox ,即可非常简单快捷的使用Swagger。

knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案

目前,一般都使用knife4j框架。

使用步骤

  1. 导入 knife4j 的maven坐标

    在pom.xml中添加依赖

  2. 在配置类中加入 knife4j 相关配置

  3. 设置静态资源映射,否则接口文档页面无法访问

  4. 访问测试

Yapi和Swagger的区别: 

Yapi 是设计阶段使用的工具,管理和维护接口

Swagger 在开发阶段使用的框架,帮助后端开发人员做后端的接口测试

常用注解

通过注解可以控制生成的接口文档,使接口文档拥有更好的可读性

注解 说明
@Api 用在上,例如Controller,表示对类的说明
@ApiModel 用在上,例如entity、DTO、VO
@ApiModelProperty 用在属性上,描述属性信息
@ApiOperation 用在方法上,例如Controller的方法,说明方法的用途、作用

总结

今天主要学习了软件开发流程介绍,苍穹外卖项目的功能架构和技术栈和开发环境的搭建。学习过程总有磕磕绊绊,但还是一步一步完成了阶段任务。

靡不有初,鲜克有终。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐