苍穹外卖Day01项目日志

1.软件开发流程和人员分工是怎样的?

软件开发流程

一个软件是怎么被开发出来的?

需求分析

先得知道软件定位人群、用户群体、有什么功能、要实现什么效果等。

需要得到需求规格说明书、产品原型。

需求规格说明书

其中前后端工程师要关注的就是产品原型图

产品原型图

 你看这个产品原型,是不是很丑?要优化,就看UI(设计师)的。

设计

包括UI设计、数据库设计、接口设计等。

UI设计,就是原型图界面这么丑,不能做成这样。

数据库设计,就是设计存数据的结构。

接口设计,就是设计前后端交互规则。

编码

就是写代码嘛。

包括项目代码、单元测试。

这个写代码,就是根据原型、接口文档去写。

有的人会说,“直接用页面测试嘛!”

一般这时候,前端页面都没看到,所以还不能联调,所以还是单元测试。

测试

产出测试用例、测试报告等。

测试包括压力测试、性能测试等。

比如查到数据,花了几秒。

比如每秒钟1k的并发,能不能抗住。

测试没问题,项目就ok了,就交付使用了。

上线运维

软件环境安装、配置。

搭建软件运行环境。

角色分工

项目经理

对整个项目分工,负责进度把控。

可能会用到项目管理软件,比如禅道、ones。

禅道
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,封装前端需要接收的响应数据。

包含DTO类、Entity类和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是本地部署的接口管理工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/11753.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库缓存服务——NoSQL之Redis配置与优化

目录 一、缓存概念 1.1 系统缓存 1.2 缓存保存位置及分层结构 1.2.1 DNS缓存 1.2.2 应用层缓存 1.2.3 数据层缓存 1.2.4 硬件缓存 二、关系型数据库与非关系型数据库 2.1 关系型数据库 2.2 非关系型数据库 2.3 关系型数据库和非关系型数据库区别: 2.4 非…

B076-项目实战--宠物上下架 展示 领养 收购订单

目录 上下架功能提供后台宠物列表实现 前台展示前台宠物列表和详情展示店铺展示 领养分析前台后端PetControllerPetServiceImpl 订单需求分析可能产生订单的模块订单模块额外功能 订单设计表设计流程设计 集成基础代码收购订单创建订单前端后端 上下架功能提供 后台宠物列表实…

深度学习算法的计算量

文章目录 一、FLOPs与FLOPS二、参数量parameters三、Latency与FPS四、结论 一、FLOPs与FLOPS 二、参数量parameters 三、Latency与FPS 四、结论

Spring 项目过程及如何使用 Spring

文章目录 1.创建 Spring 项目步骤1.1 创建 Maven 项目1.2添加 Spring 框架支持1.3 添加启动项2.如何使用 Spring2.1 存储 Bean 对象2.1.1 创建 Bean对象2.1.2 将 Bean对象注册到容器中 2.2 获取并使用 Bean对象2.2.1 使用 ApplicationContext 获取对象2.2.2 使用 BeanFactory 获…

基于LoRA进行Stable Diffusion的微调

文章目录 基于LoRA进行Stable Diffusion的微调数据集模型下载环境配置微调过程 推理WebUI部署 基于LoRA进行Stable Diffusion的微调 数据集 本次微调使用的数据集为: LambdaLabs的Pokemon数据集 使用git clone命令下载数据集 git clone https://huggingface.co/…

快速排序qsort讲解

hello大家好,我是c语言boom家宝,今天为大家分享的博客内容是qsort快速排序,简称快排的一个知识点的讲解。 在讲到快排之前,允许博主先提一嘴冒泡排序。大家在c语言的学习过程中,冒泡排序是必不可少会学习到的一个思想&…

有关合泰BA45F5260中断的思考

最近看前辈写的代码,发现这样一段代码: #ifdef SUPPORT_RF_NET_FUNCTION if(UART_INT_is_L()) { TmrInsertTimer(eTmrHdlUartRxDelay,TMR_PERIOD(2000),NULL); break; } #endif 其中UART_INT_is_L&am…

C++对C的加强(全)

目录 C对C的加强 命名空间 为什么要使用命名空间 怎么使用命名空间 命名空间的定义 命名空间的使用 使用域解析符 :: 使用using声明 内联命名空间 嵌套命名空间 随时将新的成员加入命名空间 命名空间中 函数的声明和实现分开 无名命名空间 命名空间取别名 使用u…

【通讯录】--C语言

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …

路由策略(重发布)

要求&#xff1a; 1、使用双点双向重发布 2、所有路由器进行最佳选路 3、存在备份路径&#xff0c;不得出现环路&#xff0c;和路由回馈 1.更改设备名称配置接口IP地址 R1 <Huawei>system-view [Huawei]sysname R1 [R1]interface GigabitEthernet 0/0/0 [R1-GigabitEt…

Python深度学习“四大名著”之一【赠书活动|第二期《Python机器学习:基于PyTorch和Scikit-Learn》】

近年来&#xff0c;机器学习方法凭借其理解海量数据和自主决策的能力&#xff0c;已在医疗保健、 机器人、生物学、物理学、大众消费和互联网服务等行业得到了广泛的应用。自从AlexNet模型在2012年ImageNet大赛被提出以来&#xff0c;机器学习和深度学习迅猛发展&#xff0c;取…

MATLAB与ROS联合仿真(慕羽☆)全套开源资料索引

自2021年9月份开始进行MATLAB与ROS联合仿真相关的研究&#xff0c;至2021年12月份研究基本上结束&#xff0c;至今&#xff0c;已经近两年时间&#xff0c;期间曾收到过很多小伙伴的私信&#xff0c;想让我出点教程&#xff0c;期间我也曾多次想要抽点时间出教程&#xff0c;但…

JMeter 怎么查看 TPS 数据教程,简单易懂

TPS 是软件测试结果的测量单位。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时&#xff0c;收到服务器响应后结束计时&#xff0c;以此来计算使用的时间和完成的事务个数。在 JMeter 中&#xff0c;我们可以使用以下方法查看 T…

华为战略方法论:BLM模型之关键任务与依赖关系

内容简介 在 BLM 模型中&#xff0c;执行部分包括四个模块&#xff0c;分别是&#xff1a; 关键任务与依赖关系&#xff1b;组织与绩效&#xff1b;人才&#xff1b;氛围与文化。 详细内容&#xff0c;大家可以参看下面这张图。 这四个模块其实是可以进一步划分成两个关键点…

MFC自定义控件使用

用VS2005新建一个MFC项目,添加一个Custom Control控件在窗体 我们需要为自定义控件添加一个类。项目,添加类,MFC类 设置类名字,基类为CWnd,你也可以选择CDialog作为基类 类创建完成后,在它的构造函数中注册一个新的自定义窗体,取名为"MyWindowClass" WNDCL…

8.11 PowerBI系列之DAX函数专题-TopN中实现N的动态

需求 实现 1 ranking by amount rankx(allselected(order_2[产品名称]),[total amount]) 2 rowshowing_boolean var v_ranking [ranking by amount] var v_topN-no [topN参数 值] var v_result int( v_ranking < v_topN_no) return v_result 3 将度量值2放入视觉对象筛…

大数据Flink(五十二):Flink中的批和流以及性能比较

文章目录 Flink中的批和流以及性能比较 ​​​​​​​​​​​​​​一、Flink中的批和流

【网络云盘客户端】——上传文件的功能的实现

目录 上传文件功能的实现 uploadtask的设计 设置上传的槽函数 uploadFileAction接口 uploadFile接口 定时上传文件 进度条的设计 上传文件功能的实现 上传文件功能实现 1.双击 ”上传文件 “的 QListWidgetItem 或者 点击 “上传” 菜单项 都会弹出一个文件对话框 2.在文…

华为云安装MySQL后,本地工具连接MySQL失败

华为云安装MySQL后&#xff0c;本地连接失败 排查问题步骤&#xff1a; 在此之前需要在MySQL创建用户&#xff0c;并赋予权限。 1、能否ping通。 在本地命令行(Windows&#xff1a;winR)通过ping命令&#xff0c;ping服务器地址&#xff0c;看能否ping通。不能则需要检查本地…

【C++入门】浅谈类、对象和 this 指针

文章目录 一、前言二、类1. 基本概念2. 类的封装3. 使用习惯成员函数定义习惯成员变量命名习惯 三、对象1. 基本概念2. 类对象的存储规则 四、this 指针1. 基本概念2. 注意事项3. 经典习题4. 常见面试题 一、前言 在 C 语言中&#xff0c;我们用结构体来描述一个事物的多种属性…