苍穹外卖Day01项目日志

news2024/11/15 4:41:00

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.coloradmin.cn/o/798824.html

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

相关文章

C# 继承,封装,多态等知识点

一:面向对象的三大特征:继承性,封装性,多态性 1:继承性:继承主要描述是类与类之间的关系,通过继承可以在无需重新编写原有的类的情况下,对原有的类的功能进行扩展。 2:封…

【Lua学习笔记】Lua进阶——协程

文章目录 协程协程的定义和调度StatusRunning 协程 协程是一种并发操作,相比于线程,线程在执行时往往是并行的,并且线程在创建销毁执行时极其消耗资源,并且过长的执行时间会造成主进程阻塞。而协程可以以并发时轮值时间片来执行&…

法大大携手盘子女人坊,以数字化唤醒国风摄影新体验

第三方数据显示,目前,我国共有163万家摄影相关企业,有约1900个从事摄影相关业务的品牌,且预计到2025年艺术摄影市场规模将达到7063.18亿元。艺术摄影行业作为在时代进步、科技发展以及人民生活水平提高的推动下逐渐发展起来的行业…

flutter:角标

角标应该非常常见了,以小说app为例,通常会在小说封面的右上角上显示当前未读的章数。 badges 简介 Flutter的badges库是一个用于创建徽章组件的开源库。它提供了简单易用的API,使开发者可以轻松地在Flutter应用程序中添加徽章效果。 官方文…

day42-Live User Filter(实时用户过滤器)

50 天学习 50 个项目 - HTMLCSS and JavaScript day42-Live User Filter&#xff08;实时用户过滤器&#xff09; 效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport…

【深度学习】【三维重建】windows11环境配置tiny-cuda-nn详细教程

【深度学习】【三维重建】windows11环境配置tiny-cuda-nn详细教程 文章目录 【深度学习】【三维重建】windows11环境配置tiny-cuda-nn详细教程前言确定版本对应关系源码编译安装tiny-cuda-nn总结 前言 本人windows11下使用【Instant Neural Surface Reconstruction】算法时需要…

饱和(非饱和)激活函数

1.什么是饱和&#xff08;非饱和&#xff09;激活函数 若h(x)满足&#xff1a;&#xff0c;则h(x)称为饱和激活函数&#xff0c;例如sigmoid和tanh&#xff0c;否则为非饱和激活函数&#xff0c;例如Relu及其变体。 2.非饱和激活函数的优势有两点 能解决所谓的“梯度消失”问…

剑指offer10-II.青蛙跳台阶问题

这道题和上一道斐波那契一模一样&#xff0c;如果你要到达第n个台阶&#xff0c;你有两种方法&#xff0c;第一种是到达n-1级然后跳一下&#xff0c;第二种是到大n-2级然后跳两下&#xff0c;所以到达n级的方法数就是到达n-1级的方法数加上到达n-2级的方法数。其实就是和斐波那…

Hightopo 使用心得(5)- 动画的实现

在前一篇文章《Hightopo 使用心得&#xff08;4&#xff09;- 3D 场景 Graph3dView 与 Obj 模型》中&#xff0c;我们通过使用 ht.Default.startAnim() 让一个直升飞机飞了起来。其实&#xff0c;在 HT for Web 中&#xff0c;有多种手段可以用来实现动画。 我们这里仍然用直升…

20.1:ABC对应123问题

规定1和A对应、2和B对应、3和C对应…26和Z对应 那么一个数字字符串比如"111”就可以转化为: “AAA”、“KA"和"AK” 给定一个只有数字字符组成的字符串str&#xff0c;返回有多少种转化结果 一&#xff1a;暴力方法 public static int number(String str) {…

使用 NVM(Node Version Manager)管理 Node.js 版本

使用 NVM&#xff08;Node Version Manager&#xff09;管理 Node.js 版本 步骤一&#xff1a;安装 NVM NVM 是一个用于安装和管理不同版本的 Node.js 的工具。首先&#xff0c;你需要确保你的系统上已经安装了 NVM。可以通过以下命令检查 NVM 是否已经安装&#xff1a; nvm …

尚硅谷大数据项目《在线教育之采集系统》笔记002

视频地址&#xff1a;尚硅谷大数据项目《在线教育之采集系统》_哔哩哔哩_bilibili 目录 P032 P033 P033 P034 P035 P036 P032 P033 # 1、定义组件&#xff0c;为各组件命名 a1.sources r1 a1.channels c1 a1.sinks - k1# 2、配置sources&#xff0c;描述source a1.sour…

【已解决】 Celery 报错:AttributeError: ‘EntryPoints‘ object has no attribute ‘get‘

【已解决】 Celery 报错&#xff1a;AttributeError: EntryPoints object has no attribute get 1、起因2、实验环境3、解决方案 1、起因 今天闲来无事学习 Celery 分布式任务队列&#xff0c;写好代码发布并执行&#xff0c;报错了 AttributeError: EntryPoints object has n…

芯片竞争总是一个王朝颠覆另一个王朝,壁仞科技会是下一个么?

AI的水位渐高&#xff0c;过河的船也随之身价暴涨。 刚刚解锁万亿美元市值的英伟达&#xff0c;是AI芯片产业中少有的“豪华游轮”。根据澎湃新闻的报道&#xff0c;受到禁售消息的影响&#xff0c;A800芯片近期价格出现大幅上涨。事实上&#xff0c;A800只是A100的替代&#…

QT【day3】

思维导图&#xff1a; 闹钟&#xff1a; //widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTimerEvent> #include<QTimer> #include<QTime> //时间类 #include<QPushButton> //按钮类头文件 #include<QDebug&…

论文笔记--GloVe: Global Vectors for Word Representation

论文笔记--GloVe: Global Vectors for Word Representation 1. 文章简介2. 文章概括3 文章重点技术3.1 两种常用的单词向量训练方法3.2 GloVe3.3 模型的复杂度 4. 文章亮点5. 原文传送门6. References 1. 文章简介 标题&#xff1a;GloVe: Global Vectors for Word Representa…

使用阿里云OSS+PicGo搭建图床

需求&#xff1a;对于写博客来说&#xff0c;图片确实是一个重要的问题。对于大量图片的上传&#xff0c;手动操作确实会非常耗时。为此借助图床提高写博客时处理图片的效率。 1. 阿里云OSS 阿里云对象存储服务OSS&#xff08;Object Storage Service&#xff09;&#xff1a;是…

1000*B. Buttons

#include<bits/stdc.h> using namespace std; typedef long long ll; int n,sum; int main(){scanf("%d",&n);for(int i1;i<n-1;i) sumi*(n-i);cout<<sumn;return 0; }

进阶高级测试专项,Pytest自动化测试框架总结(一)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、框架简介 pyt…

Cesium态势标绘专题-进攻箭头(标绘+编辑)

标绘专题介绍:态势标绘专题介绍_总要学点什么的博客-CSDN博客 入口文件:Cesium态势标绘专题-入口_总要学点什么的博客-CSDN博客 辅助文件:Cesium态势标绘专题-辅助文件_总要学点什么的博客-CSDN博客 本专题没有废话,只有代码,代码中涉及到的引入文件方法,从上面三个链…