发表于: 2020-12-23 23:36:33

1 1454


今天完成的事情:


深度思考


明天计划的事情:


任务三


遇到的问题:

以下


收获:
2.什么是参数校验,前端和后端需要分别做校验吗?Validation的好处和坏处分别是什么,在真实项目中需要使用Validation吗?
校验器和拦截器是不同的。
参数校验:一个叫做 BeanValidation 的 Spring 验证框架。
参数校验的目的:无论是前端还是后台,都需对用户输入进行验证,以此来保证系统数据的正确性
BeanValidation 的官方参考实现是 Hibernate Validator(与 Hibernate 没有关系),用于对 Java Bean 中的字段值进行校验。
项目中,通常使用较多是前端的校验,比如页面中js校验。对于安全要求较高点建议在服务端进行校验。
优点:可以很方便的对参数校验。
缺点:涉及数据库的复杂校验逻辑没法处理。
真实项目这个没看到
感觉就是一个类似检查用户输入账号时是否输入,是否输入错误的问题

                 https://juejin.im/post/5e6636da6fb9a07cb24aaf00



3.SpringMVC分页查询和显示
搜了一下,这个应用很常见。各种搜索引擎都会用到,知乎倒是没用过这个,可以一直往下翻。
实现了一个固定显示 10 条数据的分页,目的是怕有人使用where 1 = 1 之后,如果拼接的if条件都不符合条件,就会出现sql语句查全表的情况,在这种情况下就会导致数据过多,塞满内存,不断GC(垃圾收集),导致整个服务宕掉。
而且显示十页数据也可以用户关注最前面的信息,想到百度搜索基本就只会看第一页的类容。

所以需要使用分页查询



4.“内网IP+端口”和“外网IP+端口”和"域名"三种方式方式的差别是什么?什么时候用内网?什么时候用外网IP,什么时候用域名访问?
阿里云服务器就有内网和外网之分。
内网IP只能在局域网访问,类似学校+网吧,可以联机打cs,魔兽3
外网IP就是公网,可以在任何连通网络的地方访问。LOL
域名只是一个方便记忆的字符串,背后还是要靠 dns 翻译为 ip 地址,还有个好处就是可以随便换 ip,只要域名一样的话对于客户来说用起来都一样,然后不同的三级域名可以定向到不同的服务器。
内网:在局域网上进行测试,nginx 转发到局域网应用服务器,局域网分享资料传输文件。这个再之前公司就又一个内网,在上面可以看到很多资料,但也有因为权限不够不能看的

外网:需要暴露服务到互联网的时候



5.内网IP和外网IP的区别是什么,在服务器上测试接口是否被防火墙屏蔽的时候,该用内网IP检测,还是该用外网IP检测?

上面说了,外网应该无法访问到内网,在服务器上一般测试的都是用外网IP。可以在Linux上开启防火墙,这个可以对端口号进行关闭,阿里云上的安全组也可以


6.在Linux服务器上,有哪些工具是可以测试接口的,怎么用Wget或者是Curl分别发送Rest的四种请求?


postman,wget,curl


curl 详细使用方式参考博文:https://itbilu.com/linux/man/4yZ9qH_7X.html


Curl 发送四种请求只要添加 -x 参数然后加上请求方法:


$ curl -X DELETE itbilu.com/examlple.html

$ curl -X GET  itbilu.com/examlple.html


wget 只找到 post 与 get:
Get:
curl  "http://example.cn/disciple/20" 返回信息下载到本地
curl -i "http://example/disciple/20" 显示全部信息
curl -l "http://example/disciple/20" 只显示头部信息
curl -v "http://example/disciple/20" 显示  get 请求全过程

wget  "http://example/disciple/20"


Post
curl -d  "param1=value1&param2=value2" "http://example/disciple/20"
curl -H  "Content-Type:application/json" -H "Data_Type:msg"

        -X POST --data  '{"dmac": "00:0C:29:EA:39:70", "trojan_id":  50030}'


wget  --post-data 'uaer=foo&password=bar' "http://example/disciple/20"


7.PostMan是什么,为什么要使用他来测试接口,除了Postman,还有哪些工具可以测试?
网页调试与发送http请求的应用
因为其使用方便,可以模拟各种网页请求,所以用它来测试接口。
其他工具:

Fiddler  soapui jmeter python


8.该怎么模拟假数据,为什么在真实项目中,我们通常都是先定义接口,再写假数据,再去写业务逻辑?
用json-taglib 编写假数据
方便前后端并行开发:

需求->原型图->前后端一起确定接口文档,UI开始切图->前端模拟接口调试或者后端写假数据给前端调试


    9.Service返回的结果是否要打日志,应该打什么样的日志,为什么? 

    需要。

    Service层中,涉及到大量业务逻辑操作,我们往往就需要在一个业务操作完成后(不管成败或失败),生成一条日志。

    日志内容:操作人 动作 操作对象 操作内容 操作前内容 操作后内容 ip 操作时间····

    遇到问题方便排查,做出了错误操作也可以恢复。

     

     

    10.Service返回的结果是否要判空,为什么? 

    这个不太清楚,网上也说众说纷纭。就目前我的项目来说只有查询的时候会涉及这个问题,我返回的是一个 List,这里说的空是指 null 吧。

    我的直觉来说返回 null 是一个很不负责任的做法,设计 service 的时候就不该这样做。

     

     

    11.Controller里应该怎么处理Service的异常,大段的Try Catch 会有什么坏处? 

    解决异常首先从 controller 的数据校验开始,这一步解决好能少很多 service 错误,最后也无法避免的异常只能是遇到了之后 try catch 写应对逻辑。

    当然  try catch 一定要是指向具体的报错,不要用 catch(Exception e) 这样,因为也许一些错误不让他崩溃会导致更严重的后果。

     

    12.怎么查看Nginx的访问请求时间,多少的响应时间是合理的,并发1000和单线程访问的差别是什么,Nginx可以支持多少并发,Tomcat可以支持多少并发,为什么要在Tomcat之前配置一个Nginx 

    配置 nginx accesslog 来查看具体请求时间。

    log_format  main  '$remote_addr - $remote_user [$time_local]  "$request" '

                          '$status $body_bytes_sent "$http_referer" '

                          '"$http_user_agent" "$http_x_forwarded_for  "|$request_time|$upstream_response_time';    

     

    (1)request_time

    官网描述:request processing time in seconds with a milliseconds resolution; time elapsed between the first  bytes were read from the client and the log write after the last bytes were sent to the client 

    指的就是从接受用户请求的第一个字节到发送完响应数据的时间,即包括接收请求数据时间、程序响应时间、输出

    响应数据时间。

     

    (2)upstream_response_time

    官网描述:keeps times of responses obtained from upstream servers; times are  kept in seconds with a milliseconds  resolution. Several response times are separated by commas and colons like addresses in the $upstream_addr variable

    是指从Nginx向后端(php-cgi)建立连接开始到接受完数据然后关闭连接为止的时间。

     

    响应时间应该在 50ms 以下是正常的。

    单机访问静态资源的话,nginx 上限是 2W 左右(我网上搜的,感觉这个很难说,应该和配置有关系吧)

    Tomcat  1w 左右。

     tomcat 前配置 nginx 原因:

          1,配置动静分离减轻tomcat 的压力

          2,方便实现负载均衡

          3,万一应用服务器挂了,nginx 可以定向到错误页

     

    13.域名和端口号是怎么对应起来的?应该通过域名访问吗,从域名服务商到服务器的流程是怎么样的? 

    额,域名和端口对应是什么意思?域名不应该是对应 ip 地址吗?

    http 的话默认是 80 端口,直接用 ip 或者用域名可以访问是因为都是默认 80 端口,就像 ftp 默认 21 端口,https 默认443 端口。

    如果自定义了端口的话,无论域名还是ip 都需要在其后加上端口号才能访问。

    应该通过域名访问吗?这个问题好奇怪,对于一些大网站的话还是应该用域名访问,因为通常会配置 cdn 之类的,体验会比较好。而且谁没事去记 ip 地址啊···

     

    从浏览器到服务器到浏览器的流程:

    A.浏览器输入 url 回车

    B.浏览器查找缓存

    C.查找 host 文件,没找到-D,找到了-G

    D.查找本地 DNS 解析器缓存,没找到-E,找到了-G

    E.查找本地 DNS 服务器-F

    F.迭代查找,根域名->顶级域名->····->子域名->IP

    G.发起 TCP 三次握手

        第一次:客户端发送 syn->服务器

        第二次:服务器接收syn确认客户端发送正常,发送syn->客户端

        第三次:客户端接受syn,确认自己收发正常,服务器收发正常,建立 TCP 连接成功,完成三次握手

    H.发起 http 请求

    I.服务器响应请求,浏览器接受数据

    J.浏览器解析数据,渲染页面

    K.四次挥手,关闭 TCP 连接

        第一次:浏览器发送 FIN 请求断开连接

        第二次:服务器发送 ACK 同意断开连接

        第三次:服务器发送 FIN 请求断开连接

        第四次:浏览器返回 ACK 同意断开连接

     

     

    14.端口是什么含义,怎么判断一个端口是否被占用了,如何判断一个端口是否被防火墙拦截,怎么用Telnet判断端口号是否打开? 

    一台服务器能同时处理多种事务,但是只有一个 ip 地址,不同的服务就选择占用不同的端口号来收发自己的信息。

    查看端口是否占用:

    lsof  -i:8080

    netstat  -anp|grep 8080

     

    判断是否防火墙拦截:

    telnet  ip:port

    提示 Escape character is··· 就没有被拦截

     

     

    15.WEB服务器通常要配置哪几个端口,如果一台服务器上有多个不同的WEB服务,该怎么规划端口的使用,修真院的端口分配是怎么样的? 

    通常就是 80(http)443(https)

    有多个 web 服务就用 nginx 暴露出 80 443,接受到请求再映射到本地的其他服务的端口去

     

    16.常用的性能统计命令有哪些,TopVmstat,free等命令都有什么用处,CPU占用率,内存使用分别代表什么含义?到什么情况下,应该产生报警信息? 

    序号

            命令

            功能

    1        

    Uptime        

    快速查看负载情况

    2

    dmesg    ]tail        

    输出系统日志的最后10

    3        

    vmstat    1        

    输出系统核心指标

    4        

    mpstat -P ALL    1        

    显示每个CPU的占用情况

    5        

    pidstat 1

    输出进程的CPU占用率

    6        

    iostat -xz 1

    查看磁盘IO情况

    7        

    free    -m        

    查看内存的使用情况

    8

    sar -n DEV 1

    网络设备的吞吐率

    9

    sar -n TCP,ETCP 1

    查看TCP连接状态

    10        

    Top        

    相对全面的查看系统负载的来源

    Top

    通过该命令可以相对全面的查看系统负载的来源,top命令还支持排序,可以按照不同的列排序,方便查找出诸如内存占用最多的进程、CPU占用率最高的进程等。

     

    top命令相对于前面一些命令,输出是一个瞬间值,如果不持续盯着,可能会错过一些线索。这时可能需要暂停top命令刷新,来记录和比对数据。

     

    可以使用htop 命令来查看系统的使用情况。可以使用键盘的F3 : 搜索进程, F4 : 过滤器,按关键字搜索,F5 : 显示树形结构, F6 : 选择排序方式, F7/ F8 : 减少增加nice值,这样就可以提高/降低对应进程的优先级,F9 : 杀掉选中的进程, F10 : 退出htop

     

    htop命令的优点:

    快速查看关键性能统计数据,如CPU(多核布局)、内存/交换使用;

    可以横向或纵向滚动浏览进程列表,以查看所有的进程和完整的命令行;

    杀掉进程时可以直接选择而不需要输入进程号;

    通过鼠标操作条目;

    top启动得更快

     

    Vmstat

    r:等待在CPU资源的进程数。这个数据比平均负载更加能够体现CPU负载情况,数据中不包含等待IO的进程。如果这个数值大于机器CPU核数,那么机器的CPU资源已经饱和。

    free:系统可用内存数(以千字节为单位),如果剩余内存不足,也会导致系统性能问题。下文介绍到的free命令,可以更详细的了解系统内存的使用情况。

    si,  so:交换区写入和读取的数量。如果这个数据不为0,说明系统已经在使用交换区(swap),机器物理内存已经不足。

    us,  sy, id, wa, st:这些都代表了CPU时间的消耗,它们分别表示用户时间(user)、系统(内核)时间(sys)、空闲时间(idle)、IO等待时间(wait)和被偷走的时间(stolen,一般被其他虚拟机消耗)。

     

    Free

    该命令可以查看系统内存的使用情况,-m参数表示按照兆字节展示。最后两列分别表示用于IO缓存的内存数,和用于文件系统页缓存的内存数。

    第二行-/+ buffers/cache,看上去缓存占用了大量内存空间。这是Linux系统的内存使用策略,尽可能的利用内存,如果应用程序需要内存,这部分内存会立即被回收并分配给应用程序。因此,这部分内存一般也被当成是可用内存。

    如果可用内存非常少,系统可能会动用交换区(如果配置了的话),这样会增加IO开销(可以在iostat命令中提现),降低系统性能。

     

     

     

    17.为什么要知道响应时间的分布情况,如果一个请求很慢,它的时间可能会被耗费在哪里? 

    知道了响应时间分布才能发现问题并且去做优化。

    读写数据库,机器负载过高,发送的数据过多···

     

    18.怎么查看Resin或者是Tomcat中的DB访问时间和Controller时间,有没有可能用Aop的方法自动记录Controller的时间和DB时间?Controller时间和DB时间的区别是什么,在你写的业务逻辑里,相差有多大? 

    不清楚现有的框架,我会选择手动打时间点来记录。

    有可用的 aop 方法来记录访问时间。

    controller的耗时包括了 db 的耗时。

     

     

    19.怎么判断WEB容器是否收到了一个Http请求,WEB容器中的Access.log是什么意思,包含哪些字段,代表什么含义,是哪里配置修改字段的。 

    Accesslog 即访问日志,记录的就是接收到的请求信息。

    具体的字段不同的应用服务器都不太一样,这里贴一份 resin 的文档:

    官方文档的解释:

    PATTERN

    DESCRIPTION

    %b

    result content length

    %D

    time taken to complete the request in    microseconds (since   3.0.16)

    %h

    remote IP addr

    %{xxx}i

    request header xxx

    %{xxx}o

    response header xxx

    %{xxx}c

    cookie value xxx

    %{xxx}n

    request attribute

    %{xxx}p

    request parameter

    %r

    request URL

    %s

    status code

    %S

    requested session id

    %{xxx}t

    request date with optional time format    string.

    %T

    time taken to complete the request in seconds

    %u

    remote user

    %U

    request URI

    %v

    name of the virtual host serving the request

     

    来自 <https://www.jnshu.com/daily/112267?total=41&page=5&uid=40015&sort=0&orderBy=3>

     

     

     

    20.为什么通常都是将部署文件放置在/data/盘下,在云服务器中数据盘和系统盘的区别是什么? 

    系统盘和数据盘的创建方式区别:

    • 系统盘:随ECS云服务器一起创建,随着ECS云服务器一起释放,生命周期与系统盘所挂载的ECS实例相同,只能有一个。
    • 数据盘:可以和ECS一起创建,也可以单独创建数据盘,可以有多个。

     

     

    21.常用的主流数据库有哪些,Mysql有几种安装方式? 

    Mysql Oracle DB2 SQLServer PostgreSQL

    下载 rpm 安装包

     zip / tar.gz 安装包

    Yum 从源安装

     

    22.有哪些常用的云服务器公司,Linux服务器和Windows服务器的差别是什么,Linux有哪些主流的版本,不同版本之间的差别在哪里?  

    阿里云 腾讯云 AWS A zure

    Linux 一般都直接用命令行,方便同属部署多个服务器

    Windows 图形界面很直观,不方便同时部署多台 windows 服务器

     Debian 系与 readhat 

    Readhat 主打商业授权,提供技术支持。提供免费开源的 centos

    Ubuntu 主打图形界面,桌面办公

     

     

    23.什么是ssh?如何在linux服务器上从网站下载文件? 

    Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境[1]。SSH通过在网络中创建安全隧道来实现SSH客户端与服务器之间的连接[2]。虽然任何网络服务都可以通过SSH实现安全传输,SSH最常见的用途是远程登录系统,人们通常利用SSH来传输命令行界面和远程执行命令。

    来自 <https://zh.wikipedia.org/wiki/Secure_Shell>

     

    Wget 或者 curl 都可以用来下载文件。

     

    24.C标签是什么,为什么要使用C标签,有哪些常见的指令? 

    JSTL中的核心库,为日常任务提供通用支持,如显示和设置变量、重复使用一组项目、测试条件和其他操作(如导入和重定向Web内容)。

     

    C标签具体分析

    1  c:out    用于在JSP中显示数据

    2  c:set    用于保存数据

    3  c:remove    用于删除数据

    4  c:catch     用来处理产生错误的异常状况,并且将错误信息储存起来

    5  c:if    与我们在一般程序中用的if一样

    6  c:choose    本身只当做c:whenc:otherwise的父标签

    7  c:when     c:choose的子标签,用来判断条件是否成立

    8  c:otherwise     c:choose的子标签,接在c:when标签后,当c:when标签判断为false时被执行

    9  c:import     检索一个绝对或相对 URL,然后将其内容暴露给页面

    10  c:forEach     基础迭代标签,接受多种集合类型

    11  c:forTokens    根据指定的分隔符来分隔内容并迭代输出

     

     

    25.什么叫反向代理?为什么要使用反向代理? 

    正向代理:去客户机指定的位置获取指定的内容

    反向代理:去获取客户指定的内容

    反向代理的应用:负载均衡、防火墙

     

    26.Nginx的作用是什么,在WEB服务前端配置Nginx的好处是什么,除了Nginx,还有别的反向代理服务器吗? 

    作用:代理。

    好处:

          1,配置动静分离减轻应用服务器的压力

          2,方便实现负载均衡

          3,万一应用服务器挂了,nginx 可以定向到错误页

    种类:Squid Varnish Nginx ApacheTS HAProxy

     

     

    27.为什么要用start.sh,stop.sh,deploy.sh 来完成容器的启动,停止和部署,而不是直接用容器自带的命令? 

    方便 流程固化 安全、防止打错指令出问题

     

     

    28.什么是Filter,什么是Interceptor,他们的区别是什么,和AOP又是什么关系? 

    Filter 过滤器:过滤字符编码、做一些业务逻辑判断,主要用于对用户请求进行预处理,同时也可进行逻辑判断。

    Interceptor 拦截器:拦截用户请求,进行处理,比如判断用户登录情况、权限验证,只要针对Controller请求进行处理,是通过HandlerInterceptor

     

    FilterInterceptor的区别

    1. Filter是基于函数回调(doFilter()方法)的,而Interceptor则是基于Java反射的(AOP思想)。
    2. Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。
    3. Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用。
    4. Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。
    5. 在action的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。
    6. Filter在过滤是只能对request和response进行操作,而interceptor可以对request、response、handler、modelAndView、exception进行操作。

     

     

    29.使用Annotaion的时候需要有哪些配置,他的加载过程是怎么样的? 

    需要在Spring配置文件中注册驱动

    <mvc:annotation-driven/>

    扫描指定路径下的注解-》解析注解-》执行注解行为

     

    30.AnnotationXML两种配置的差别,为什么更喜欢使用Annotaion来配置Spring MVC 

    Annotation 的方式耦合度更高,但是读起来更加清晰,注解与作用对象一目了然。

    Xml 的的方式把我绕的有点晕,特别是我现在这个小项目三个 Spring xml 配置我已经分不清它们是干什么的了,当然这也可能是我太菜了。



返回列表 返回列表
评论

    分享到