1.软件开发流程和人员分工是怎样的?
软件开发流程
一个软件是怎么被开发出来的?
需求分析
先得知道软件定位人群、用户群体、有什么功能、要实现什么效果等。
需要得到需求规格说明书、产品原型。
其中前后端工程师要关注的就是产品原型图。
你看这个产品原型,是不是很丑?要优化,就看UI(设计师)的。
设计
包括UI设计、数据库设计、接口设计等。
UI设计,就是原型图界面这么丑,不能做成这样。
数据库设计,就是设计存数据的结构。
接口设计,就是设计前后端交互规则。
编码
就是写代码嘛。
包括项目代码、单元测试。
这个写代码,就是根据原型、接口文档去写。
有的人会说,“直接用页面测试嘛!”
一般这时候,前端页面都没看到,所以还不能联调,所以还是单元测试。
测试
产出测试用例、测试报告等。
测试包括压力测试、性能测试等。
比如查到数据,花了几秒。
比如每秒钟1k的并发,能不能抗住。
测试没问题,项目就ok了,就交付使用了。
上线运维
软件环境安装、配置。
搭建软件运行环境。
角色分工
项目经理
对整个项目分工,负责进度把控。
可能会用到项目管理软件,比如禅道、ones。
除了项目经理,第二牛气的:
产品经理
进行需求调研分析,输出需求调研文档、产品原型。
跟上面领导打交道比较多,但不是领导胜似领导,只是一个岗位名称。意思就是,我出需求,你来实现,是提要求的,所以一般就牛气一点。
(出需求的产品经理,是程序员的天敌)
UI设计师
根据产品原型输出界面效果图。
不一定是小姐姐的哦。
架构师
项目整体架构设计,即项目整体结构的搭建,还有技术选型等。
比如架构是选微服务还是单体,用什么技术,设计什么模块,
以及一些棘手的问题,都是架构师去做。
架构师不一定很牛,有牛逼的也有菜的。有些大公司,有小组,其中就有架构师组。里面的,不一定都是你能佩服到高山仰止的哦~
开发工程师
代码实现。
喏,苦逼打代码的来了。
测试工程师
编写测试用例,输出测试报告。
运维工程师
软件环境搭建,运行项目。
其他
在公司内可能还有其他细化方向,比如还有DBA,即数据库管理员。
他们就只写SQL语句。
特殊情况
比较理想的情况,是上面的岗位都有。但进公司,你会发现总会缺那么几个专职岗位,这些细分工作就被其他人兼职做了。
最低配置
2类人,一类人就是敲代码的程序员,兼任了开发、测试、运维甚至架构,可能还有UI,也可能UI是外包出去的。
第二类人就兼任了项目经理、产品经理。这样的配置比起分两个人来有好有坏。好处是他或她懂技术,可以和他去聊。(有的产品经理,功能实现做不出来,就是技术不行,可以搜一下 识别手机壳颜色打架 ,体会一下程序员和产品的爱恨情仇)坏处呢,就是不敢怼他了。第一,他是懂行的。第二,他是领导啊,你敢怼?[手动滑稽]
2.后端项目有哪几个模块?每个模块有哪些内容?
一共4个模块,分别是父模块sky-take-out,实体模块sky-pojo,公共资源模块sky-common,业务代码模块sky-server。
父模块sky-take-out
父工程,管理依赖版本,聚合其他模块,实现模块的统一管理。
实体模块sky-pojo
包括一下3种类:
实体类POJO或Entity。保证属性名和数据库表的字段名一一对应。
数据传输对象DTO,封装前端传过来的请求参数。
视图对象VO,封装前端需要接收的响应数据。
公共资源模块sky-common
存放公共资源,比如工具类、常量类、枚举类、异常类等。
业务代码模块sky-server
存放业务代码,比如三层架构中表现层、业务层、持久层的代码。
3.登录流程是怎样的,描述清楚。
如下图:
4.反向代理和负载均衡是什么?
反向代理
前端把请求发送给nginx,再由nginx将请求发送给后端服务器。
负载均衡
反向代理的3个好处之一。下面详细介绍。
反向代理的3个好处
1.提高访问速度
因为nginx可以存访问数据的缓存,比如如果有10次相同的访问,nginx就可以把缓存返回给前端,只用返回1次后端而不用再访问10次后端。
2.进行负载均衡
存在服务器集群时,前端发送给nginx,由nginx选择调配策略,选择性的调配服务器,这就叫负载均衡。
3.保证后端服务安全
直接暴露后端端口,有被攻击的风险;而只暴露nginx,由nginx来间接调用服务器,这就保障了后端服务的安全。
代码实现
在nginx中,conf文件夹下的nginx.conf中:
server {
listen 80;
server_name localhost;
....
}
说明nginx监听的是80端口。
然后看下面:
server {
listen 80;
server_name localhost;
location / {
root html/sky;
index index.html index.htm;
...
}
}
location告诉程序,如果访问写好的前端页面都放在html/sky文件夹下。看一眼,确实。
继续往下看:
server {
listen 80;
server_name localhost;
...
# 反向代理,处理管理端发送的请求
location /api/ {
proxy_pass http://localhost:8080/admin/;
#proxy_pass http://webservers/admin/;
}
...
}
这边的代码就是说,只要访问api路径下的资源,就自动反向代理到localhost:8080/admin/路径下。
再继续就到负载均衡了:
server {
listen 80;
server_name localhost;
...
# 反向代理,处理用户端发送的请求
location /user/ {
proxy_pass http://webservers/user/;
}
upstream webservers{
server 127.0.0.1:8080 weight=90 ;
server 127.0.0.1:8088 weight=10 ;
}
}
上面的代码就是反向代理/user路径的资源。代理到webservers下的路径。这个webservers可以当作一个别名。
然后再看这个webservers,这里就用到负载均衡了。对于127.0.0.1:8080的路径,分配90的权重;对于127.0.0.1:8088的路径,分配10的权重。
对于负载均衡,有不同的策略值得说一下。
负载均衡的不同策略
轮询
默认方式。即一人一次。
上面如果是轮询,写法如下:
upstream webservers{
server 127.0.0.1:8080;
server 127.0.0.1:8088;
}
weight
权重方式,默认为1,权重越高,被分配的客户端请求就越多。权重可以就当作分配给该地址的概率。比如如下实验:
weight实验
nginx的配置文件中,nginx.conf文件内部如下:
upstream testservers {
server 127.0.0.1:8080 weight=4;
server 127.0.0.1:8081 weight=1;
}
server {
listen 80;
server_name localhost;
... # 省略其他配置
# 自定义反向代理
location /testPort/ {
proxy_pass http://testservers/test/;
}
...
}
可以看到,我们设置了访问/testPort下的资源时,就自动跳转到8080、8081下的/test资源下的路径。而8080、8081端口的权重,分别为4和1。
在后端写一个测试的controller类:
package com.sky.controller.admin;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
@RestController
@RequestMapping("/test")
@Slf4j
@Api(tags = "负载均衡接口使用测试")
public class TestPortController {
@Value("${server.port}")
private String port;
@ApiOperation("测试端口")
@GetMapping("/port")
public String port() {
return port + " " + LocalDateTime.now();
}
}
可以看到,会返回端口号和访问时间。
在拦截器中(com.sky.interceptor.JwtTokenAdminInterceptor)加入放行代码:
if (1==1) {return true;}
默认端口为8080,启动它。然后新建一个启动类,用系统属性参数设置端口为新的8081。然后启动。
然后启动nginx,开始测试:
输入地址(可以自己思考一下为什么这样输)
http://localhost/testPort/port
看结果:
基本上就是4:1的几率。
验证成功。
5.Swagger和yapi有什么区别?
yapi是在线项目接口管理工具,需要联网;
Swagger是本地部署的接口管理工具。