一个软件是怎么被开发出来的?
先得知道软件定位人群、用户群体、有什么功能、要实现什么效果等。
需要得到需求规格说明书、产品原型。
需求规格说明书其中前后端工程师要关注的就是产品原型图。
产品原型图你看这个产品原型,是不是很丑?要优化,就看UI(设计师)的。
包括UI设计、数据库设计、接口设计等。
UI设计,就是原型图界面这么丑,不能做成这样。
数据库设计,就是设计存数据的结构。
接口设计,就是设计前后端交互规则。
就是写代码嘛。
包括项目代码、单元测试。
这个写代码,就是根据原型、接口文档去写。
有的人会说,“直接用页面测试嘛!”
一般这时候,前端页面都没看到,所以还不能联调,所以还是单元测试。
产出测试用例、测试报告等。
测试包括压力测试、性能测试等。
比如查到数据,花了几秒。
比如每秒钟1k的并发,能不能抗住。
测试没问题,项目就ok了,就交付使用了。
软件环境安装、配置。
搭建软件运行环境。
对整个项目分工,负责进度把控。
可能会用到项目管理软件,比如禅道、ones。
禅道 ones除了项目经理,第二牛气的:
进行需求调研分析,输出需求调研文档、产品原型。
跟上面领导打交道比较多,但不是领导胜似领导,只是一个岗位名称。意思就是,我出需求,你来实现,是提要求的,所以一般就牛气一点。
(出需求的产品经理,是程序员的天敌)
根据产品原型输出界面效果图。
不一定是小姐姐的哦。
项目整体架构设计,即项目整体结构的搭建,还有技术选型等。
比如架构是选微服务还是单体,用什么技术,设计什么模块,
以及一些棘手的问题,都是架构师去做。
架构师不一定很牛,有牛逼的也有菜的。有些大公司,有小组,其中就有架构师组。里面的,不一定都是你能佩服到高山仰止的哦~
代码实现。
喏,苦逼打代码的来了。
编写测试用例,输出测试报告。
软件环境搭建,运行项目。
在公司内可能还有其他细化方向,比如还有DBA,即数据库管理员。
他们就只写SQL语句。
比较理想的情况,是上面的岗位都有。但进公司,你会发现总会缺那么几个专职岗位,这些细分工作就被其他人兼职做了。
2类人,一类人就是敲代码的程序员,兼任了开发、测试、运维甚至架构,可能还有UI,也可能UI是外包出去的。
第二类人就兼任了项目经理、产品经理。这样的配置比起分两个人来有好有坏。好处是他或她懂技术,可以和他去聊。(有的产品经理,功能实现做不出来,就是技术不行,可以搜一下 识别手机壳颜色打架 ,体会一下程序员和产品的爱恨情仇)坏处呢,就是不敢怼他了。第一,他是懂行的。第二,他是领导啊,你敢怼?[手动滑稽]
一共4个模块,分别是父模块sky-take-out,实体模块sky-pojo,公共资源模块sky-common,业务代码模块sky-server。
父工程,管理依赖版本,聚合其他模块,实现模块的统一管理。
父工程进行版本管理包括一下3种类:
实体类POJO或Entity。保证属性名和数据库表的字段名一一对应。
数据传输对象DTO,封装前端传过来的请求参数。
视图对象VO,封装前端需要接收的响应数据。
包含DTO类、Entity类和VO类存放公共资源,比如工具类、常量类、枚举类、异常类等。
存放业务代码,比如三层架构中表现层、业务层、持久层的代码。
如下图:
前端把请求发送给nginx,再由nginx将请求发送给后端服务器。
反向代理的3个好处之一。下面详细介绍。
因为nginx可以存访问数据的缓存,比如如果有10次相同的访问,nginx就可以把缓存返回给前端,只用返回1次后端而不用再访问10次后端。
存在服务器集群时,前端发送给nginx,由nginx选择调配策略,选择性的调配服务器,这就叫负载均衡。
直接暴露后端端口,有被攻击的风险;而只暴露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;
}
权重方式,默认为1,权重越高,被分配的客户端请求就越多。权重可以就当作分配给该地址的概率。比如如下实验:
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的几率。
验证成功。
yapi是在线项目接口管理工具,需要联网;
Swagger是本地部署的接口管理工具。