发表于: 2022-06-27 19:45:27

1 527




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


分析服务响应时间分布,如:均值、中位值、P95值、P99值等如何计算


平均值

我们考察一个服务器的性能,除了QPS数据外,还会考察响应时间,当服务器负载增高时,往往会伴随着响应时间的增长,

但是这个值该如何度量,以精准的表现服务器当前之负载呢?


最常用的值为平均值,表示服务的平均响应时间,通过该值我们能够知道服务当前响应的所有请求耗时的平均值。 例如平均耗时为100ms,

表示服务器当前请求的总耗时/请求总数量,通过该值,我们大体能知道服务运行情况。 但是对于具体有多少个请求的耗时比100ms要大,

大多少,是200ms,还是500ms,还是1000ms,我们无从得知。 而且,平均值这个数据容易掩盖一些异常值问题,

比如,我的财富加马云财富的平均值也能过亿,所以,平均值这个数据项过于简单,提供的信息量太少。

那为什么我们通常采用平均值来衡量或者监控服务性能呢?

主要是由于该值容易计算。


中位值

如上所述,由于平均值不能反映数据分布及极端异常值的问题,可以考虑采用中位值来作为度量。


中位值如何计算?

我们假设某服务在1s内响应了100个请求,耗时为X1、X2 ... X100,可以对这100个数按照从小到大的顺序进行排序,

在排序后的列表的中间位置的值——即为中位值,假设为150ms。


那这个值,150ms,表示什么意思呢? 它表示,服务器响应的这100个请求里面有50个的请求耗时小于150ms,另有50个请求的耗时大于150ms。

如果,我们有一个服务qps为3万/s,经过计算响应耗时中位值为100ms,那么我们可以推断有1.5万个请求的耗时小于100ms,

也就是说我们有一半的用户的响应耗时小于100ms,据此我们就可以评估服务响应性能是否可以满足业务要求。


但是,这个中位值还有另外一个问题,我们只知道还有一半的请求耗时大于100ms,具体是大多少,大200ms,还是500ms,我们无法得知。


P95值与P99值


由于中位值只能反映中位数的问题,不能反馈更多信息,例如,我想知道该服务80%的请求耗时在多少ms以内,这些问题需要额外的数据指标。

P95——响应耗时从小到大排列,顺序处于95%位置的值即为P95值。

还是采用上面那个例子,100个请求按照响应时间从小到大排列,位置为95的值,即为P95值。 我们假设该值为180ms,那这个值又表示什么意思呢?

意思是说,我们对95%的用户的响应耗时在180ms之内,只有5%的用户的响应耗时大于180ms,据此,我们掌握了更精确的服务响应耗时信息。


P99.9值

亚马逊经常采用P99.9值,也就是99.9%用户耗时作为指标,也就是1000个用户里面,999个用户的耗时上限,如果测量与优化该值,

即可保证绝大多数用户的使用体验。 至于P99.99值,优化成本过高,而且服务响应由于网络波动、系统抖动等不能解决之情况,故暂不考虑该指标。


如何计算P分位值

如上说过平均值的计算方式,而P值需要将响应耗时从小到大排序,然后取得对应百分位之值。

如果服务qps较低,例如:100/秒,记录这100个耗时数据,然后排序,然后取得P分位值,倒不是难事。 

而如果qps较高,例如:30万/秒,如果还是采用记录+排序的方式,可以预见需要消耗大量内存与计算资源。


有没有简单的计算方式呢?

可以采用直方图来进行计算,该计算方式虽不是完全准确值,但精度非常高,误差较小。


直方图需要界定两个直方之间的跨度,一般采用等分形式,例如对于耗时统计需求,我们可以假定一个耗时上界,然后等分,

比如划分成100个区间,对于每个响应耗时落入对应的直方,如下图:


这样就避免了对全部数据进行排序,只需要根据各个直方中的数据数量,即可计算出95%位置位于哪个直方,

然后在该直方内部采用插值方法,计算出P95值。

另外,考虑到数据分布特点,服务耗时异常数据应该只是少数,但是异常值跨度可能很大,大部分耗时数据均靠近正常值,

如果直方统计采用等分形式,会导致大量数据堆积在一个直方中,如何解决这个问题?

可以采用非等分的跨度划分方式,例如采用指数形式划分,耗时越低的区间,跨度越小,精度约高。


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


18.怎么查看Resin或者是Tomcat中的DB访问时间和Controller时间,有没有可能用Aop的方法自动记录Controller的时间和DB时间?

Controller时间和DB时间的区别是什么,在你写的业务逻辑里,相差有多大?


怎么查看Resin或者是Tomcat中的DB访问时间和Controller时间?


使用日志查看DB访问时间和Controller时间。在Resin和Tomcat的文件路径下有log目录。log目录下的文件记录的是日志信息。



Tomcat ⽇志⽬录,包括服务器⽇志、 HTTP 访问⽇志、 Web 应⽤⽇志

服务器⽇志- catalina.out : 当前⽇志输出⽂件; catalina.${date}.log : 包含归档的⽇志⽂件

HTTP 访问⽇志 - localhost_access_log.${date}.txt

Web 应⽤⽇志 - localhost.${date}.log


用Aop的方法自动记录Controller的时间和DB时间?

Spring AOP 其实就是使用动态代理来对切面层进行统一的处理,动态代理的方式有:JDK动态代理和 cglib 动态代理,

JDK动态代理基于接口实现, cglib 动态代理基于子类实现。spring默认使用的是JDK动态代理,如果没有接口,spring会自动的使用cglib动态代理。


参考了CSDN的文章:https://blog.csdn.net/carrots_vegetables/article/details /82914300



数据库的时间类型

Mysql中经常用来存储日期的数据类型有三种:Date、Datetime、Timestamp。

【1】Date数据类型:用来存储没有时间的日期。Mysql获取和显示这个类型的格式为“YYYY-MM-DD”。

支持的时间范围为“1000-00-00”到“9999-12-31”。

【2】Datetime类型:存储既有日期又有时间的数据。存储和显示的格式为 “YYYY-MM-DD HH:MM:SS”。

支持的时间范围是“1000-00-00 00:00:00”到“9999-12-31 23:59:59”。

【3】Timestamp类型:也是存储既有日期又有时间的数据。存储和显示的格式跟Datetime一样。

支持的时间范围是“1970-01-01 00:00:01”到“2038-01-19 03:14:07”。


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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


accesslog是apache或者nginx等web service生成的日志,对应于网页的每一次请求,包含有大量的信息,

分析好accesslog可以对网站的运行情况有一个整体的认识,在出现问题的情况下,

也可以通过对accesslog的数据分析结果,大致定位出问题所在。


HTTP中,不管是请求还是响应,消息头是必须存在的,消息体是可选的.

每个消息头末尾都有1个换行符(\r\n).


特别地,不管是请求头还是响应头,最后一个消息头末尾有2个换行符(\r\n\r\n).

表现在:

假设存在消息体,那么消息头和消息体之间有1个空行.

假设没有消息体,那么请求头和响应头之间有1个空行.


所以HTTP服务器,只需要一直读,直到读取到2个换行符(\r\n\r\n),就可以认定为已经读取1个HTTP请求的所有头部信息.用PHP表达就是:

$headers = stream_get_line($tcp_stream, 4 * 8192, "\r\n\r\n");


然后再分析请求头:

1.如果存在"Content-Length: 1234",则继续读取指定长度的数据作为请求体,文件上传也属于这种类型.

2.如果存在"Transfer-Encoding: chunked",则读取分块传输的数据,直到终止块,终止块的内容是0后面接2个换行符(\r\n\r\n).

请求的消息头和消息体都读取完毕后,HTTP服务器就可以往这个TCP流里写入响应的消息头和消息体,完成一次请求的处理.

如果请求头中声明了"Connection: close"关闭连接,服务器在完成请求处理后,应该关闭这个TCP流.

这时HTTP服务器维持的TCP连接会进入TIME_WAIT状态,等待2MSL后变为CLOSED状态.


示例:



参数 说明 示例
$remote_addr   客户端地址 211.28.65.253
   $remote_user   客户端用户名称 --
   $time_local    访问时间和时区 18/Jul/2012:17:00:01 +0800
   $request   请求的URIHTTP协议 "GET /article-10000.html HTTP/1.1"
   $http_host 请求地址,即浏览器中你输入的地址(IP或域名) www.it300.com
   192.168.100.100
   $status    HTTP请求状态 200
   $upstream_status   upstream状态 200
   $body_bytes_sent   发送给客户端文件内容大小 1547
   $http_referer  url跳转来源 https://www.baidu.com/
   $http_user_agent   用户终端浏览器等信息 "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; GTB7.0; .NET4.0C;
   $ssl_protocol  SSL协议版本 TLSv1
   $ssl_cipher    交换数据中的算法 RC4-SHA
   $upstream_addr 后台upstream的地址,即真正提供服务的主机地址 10.10.10.100:80
   $request_time  整个请求的总时间 0.205
   $upstream_response_time    请求过程中,upstream响应时间 0.002


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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


为什么通常都是将部署文件房子data盘下?

因为重要文件不建议存在C盘,当系统一旦崩溃基本上这些资料都消失了。



服务器系统数据有什么区别

 系统是随服务器一起创建的,系统盘是通过镜像来为云服务器安装操作系统的,系统盘只能有1个;

数据是用来存储数据数据盘可以单独创建,数据盘最多可以创建16块。


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


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


1. MySQL数据库


MySQL是最受欢迎的开源SQL数据库管理系统,它由 MySQL AB开发、发布和支持。MySQL AB是一家基于MySQL开发人员的商业公司,

它是一家使用了一种成功的商业模式来结合开源价值和方法论的第二代开源公司。MySQL是MySQL AB的注册商标。

  MySQL是一个快速的、多线程、多用户和健壮的SQL数据库服务器。MySQL服务器支持关键任务、重负载生产系统的使用,

也可以将它嵌入到一个大配置(mass- deployed)的软件中去。


1、定位:

  开源、多平台、关系型数据库

  目前使用最广泛、流行度最高的的开源数据库。

  2、特点:

    (1)支持事务,符合关系型数据库原理,符合ACID,支持多数SQL规范,以二维表方式组织数据,有插件式存储引擎,支持多种存储引擎格式

    (2)用编译安装的方式,或者二进制包的方式,按照“安装软件-创建实例-库表用户初始化”,可以很快完成数据库部署

    (3)使用标准的SQL语句进行数据库管理,简单SQL语句的并发和性能较好,对视图、存储过程、函数、触发器等支持的不是太好

    (4)在命令行界面有一些常用的命令显示状态和性能,在图形界面方面,有比较多的开源监控工具来监控和记录数据库的状态,

            比如zabbix,nagios,cacti,lepus等

    (5)逻辑备份 mysqldump/mysqldumper ,物理备份 用xtrabackup等工具进行备份;

    (6)MySQL高可用有多种方案,官方有基础的master-slave主从复制,新版本的innodb cluster,第三方的有MHA等高可用方案;

    (7)MySQL水平拆分,可以通过水平拆分proxy中间进行逻辑映射和拆分,扩大MySQL数据库的并发能力和吞吐量。

    3、适用场景:

    默认的innodb存储引擎,支持高并发,简单的绝大部分OLTP场景;

    Tokudb存储引擎,使用高并发insert的场景;

    Inforbright存储引擎,可以进行列压缩和OLAP统计查询场景;

    4、选择注意:

    使用MySQL进行OLTP业务时,需要注意数据量级,如果数据量级过大,需要进行水平拆分;

    如果有OLAP需求,可以结合其他架构综合考虑。


2. Microsoft SQL Server数据库


SQL Server是由微软开发的数据库管理系统,是Web上最流行的用于存储数据的数据库,

它已广泛用于电子商务、银行、保险、电力等与数据库有关的行业。

    目前最新版本是SQL Server 2005,它只能在Windows上运行,操作系统的系统稳定性对数据库十分重要。并行实施和共存模型并不成熟,

很难处理日益增多的用户数和数据卷,伸缩性有限。

    SQL Server 提供了众多的Web和电子商务功能,如对XML和Internet标准的丰富支持,通过Web对数据进行轻松安全的访问,

具有强大的、灵活的、基于Web的和安全的应用程序管理等。而且,由于其易操作性及其友好的操作界面,深受广大用户的喜爱。


 1、定位:

    商业、Windows平台、关系型数据库

    最早接触、与微软体系结合紧密的的商业数据库,属于“微软技术体系”

    2、特点:

    (1)支持事务,符合关系型数据库原理,符合ACID,支持多数SQL规范,以二维表方式组织数据

    (2)在Windows平台,用图形界面进行软件安装;

    使用:在Windows平台,使用SQL Server Mangement Studio图形界面进行安装;

    (3)一般通过Windows资源管理和SQL server图形工具进行系统和数据库性能显示;

    (4)通常用第三方备份恢复软件进行备份恢复;

    高可用:通过共享存储和双机热备的方式,可以实现SQL Server数据库的高可用;

    (5) SQL Server数据库集群采用共存存储的方式,通过硬件垂直升级来对数据库集群进行扩展;

    3、适用场景:

    大多数OLTP场景(与微软体系配合)

    4、选择注意:

    SQL Server与微软技术体系结合比较紧密,绝大多数工作,都是通过图形界面完成,对于习惯使用命令行的DBA可能会有不习惯;

    SQL server对双引号,大小写,元信息的管理和处理方式,与其他数据库很不相同,需要注意;

    使用SQL Server满足OLTP业务,会有比较好的效果,但对于大数据量的OLAP业务,最好还是选用专门的OLAP架构,

       不要在同一个SQL Server实例上混用OLTP和OLAP业务;

    SQL server属于商业软件,需要注意版权和licence授权费用;



3. Oracle数据库


  Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。

可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。

它是一种高效率、可靠性好的 适应高吞吐量的数据库解决方案。

    1、定位:

    商业、多平台、关系型数据库

    功能最强大、最复杂、市场占比最高的商业数据库

    2、特点:

    (1)支持事务,符合关系型数据库原理,符合ACID,支持多数SQL规范,以二维表方式组织数据

    (2)Oracle单实例数据库部署相对容易,但Oracle RAC集群环境,部署的步骤和依赖条件都比较多;

    (3)通常使用命令行工具,进行各种数据库的管理,通常也可以用shell脚本和python脚本提高Oracle数据库管理效率;各种管理功能,都比较强大;

    (4)Oracle官方有比较全面的监控工具,常用的第三方监控平台,如zabbix,cacti,lepus等都有对Oracle数据库的各项指标的完善监控;

    (5)支持冷备份和热备份,可以用 exp/imp , expdp/impdp等进行逻辑备份和恢复,可以使用强大的RMAN工具进行专业的物理热备份和恢复;

    (6)Oracle数据库的高可用架构,可以用第三方双机热备软件,结合Oracle单实例实现;可以使用Oracle Dataguard,实现master和standby的备份;可以使用 Oracle RAC集群实现实例级别的高可用和负载均衡,使用ASM实现存储级别的高可用;

    (7)由于Oracle集群采用共享存储的方式,一般只能通过垂直硬件升级进行升级;

    3、适用场景:

    绝大多数OLTP场景,部分OLAP

    4、选择注意:

    Oracle从架构到运维,可以说是最难的数据库,学习和使用难度较高


4. Postgresql数据库


PostgreSQL是以加州大学伯克利分校计算机系开发的 POSTGRES,现在已经更名为PostgreSQL,版本 4.2为基础的对象关系型数据库管理系统(ORDBMS)。PostgreSQL支持大部分 SQL标准并且提供了许多其他现代特性:复杂查询、外键、触发器、视图、事务完整性、MVCC。同样,PostgreSQL 可以用许多方法扩展,比如, 通过增加新的数据类型、函数、操作符、聚集函数、索引。免费使用、修改、和分发 PostgreSQL,

不管是私用、商用、还是学术研究使用。

    PostgreSQL 是一个免费的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行。

       它提供了相对其他开放源代码数据库系统(比如 MySQL 和 Firebird),

        和专有系统(比如 Oracle、Sybase、IBM 的 DB2 和 Microsoft SQL Server)之外的另一种选择。



1、定位:

    开源、多平台、关系型数据库,功能最强大的开源数据库。

    2、特点:

    (1)支持事务,符合关系型数据库原理,符合ACID,支持多数SQL规范,以二维表方式组织数据;

    (2)postgresql需要先准备好Python等环境,然后编译安装软件,初始化数据库,启动实例,整个部署过程相对比较清晰;

    (3)postgresql数据库可以使用命令行方式进行管理,也可以通过pgadmin图形工具进行管理;各种管理功能,都比较强大;

    (4) 可以再命令行中查看各种性能视图和状态视图;相对其他其他数据库,并没有太好的图形监控工具和平台;

    (5)支持冷备份和热备份,可以用 COPY命令进行逻辑导出和导入;用pgdump和pgrestore进行物理备份和恢复;

    (6)postgresql 官方支持 master-standby复制;也可以用Slony-I第三方组件进行数据库同步;

    (7)postgresql可以通过修改源码实现的postgres-XC实现水平扩展;

    3、适用场景:

    绝大多数OLTP场景,部分OLAP

    适合目前互联网需要的一些信息,比如地理位置信息处理;

    以postgresql作为底层数据库的greenplum数据仓库,是主流的MPP数据仓库;

    基于postgresql的TimeScaleDB,是目前比较火的时序数据库之一;

    4、选择注意:

    Postgresql的架构、使用难度、功能性介于Oracle数据库和MySQL数据库之间,但因其开源的推动,各方面也有不错的发展;

    Postgresql目前还没有比较主流和好用的监控平台,这是postgresql数据库目前存在的一个不足。


5. Sybase数据库


 美国Sybase公司研制的一种关系型数据库系统,是一种典型的UNIX或WindowsNT平台上客户机/服务器环境下的大型数据库系统。

    Sybase提供了一套应用程序编程接口和库,可以与非Sybase数据源及服务器集成,允许在多个数据库之间复制数据,

       适于创建多层应用。系统具有完备的触发器、存储过程、规则以及完整性定义,支持优化查询,具有较好的数据安全性。

    Sybase通常与SybaseSQLAnywhere用于客户机/服务器环境,前者作为服务器数据库,后者为客户机数据库,

       采用该公司研制的PowerBuilder为开发工具,在我国大中型系统中具有广泛的应用。



6. DB2数据库


 DB2主要应用于大型应用系统,具有较好的可伸缩性,可支持从大型机到单用户环境,应用于所有常见的服务器操作系统平台下。

    DB2提供了高层次的数据利用性、完整性、安全性、可恢复性,以及小规模到大规模应用程序的执行能力,

具有与平台无关的基本功能和SQL命令。DB2采用了数据分级技术,能够使大型机数据很方便地下载到LAN数据库服务器,

使得客户机/服务器用户和基于LAN的应用程序可以访问大型机数据,并使数据库本地化及远程连接透明化。

    DB2以拥有一个非常完备的查询优化器而著称,其外部连接改善了查询性能,并支持多任务并行查询。 DB2具有很好的网络支持能力,

每个子系统可以连接十几万个分布式用户,可同时激活上千个活动线程,对大型分布式应用系统尤为适用。


7. Access数据库

Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点,

是 Microsoft Office 的系统程序之一。

    Microsoft Office Access是微软把数据库引擎的图形用户界面和软件开发工具结合在一起的一个数据库管理系统。

它是微软OFFICE的一个成员, 在包括专业版和更高版本的office版本里面被单独出售。

    MS ACCESS以它自己的格式将数据存储在基于Access Jet的数据库引擎里。它还可以直接导入或者链接数据(这些数据存储在其他应用程序和数据库)。

    软件开发人员和数据架构师可以使用Microsoft Access开发应用软件,“高级用户”可以使用它来构建软件应用程序。

和其他办公应用程序一样,ACCESS支持Visual Basic宏语言,它是一个面向对象的编程语言,可以引用各种对象,

包括DAO(数据访问对象),ActiveX数据对象,以及许多其他的ActiveX组件。可视对象用于显示表和报表,

他们的方法和属性是在VBA编程环境下,VBA代码模块可以声明和调用Windows操作系统函数。



      (1)完善地管理各种数据库对象,具有强大的数据组织、用户管理、安全检查等功能。

    (2)强大的数据处理功能

    (2)强大的数据处理功能(3)可以方便地生成各种数据对象,利用存储的数据建立窗体和报表,可视性好

    (4)作为Office套件的一部分,可以与Office集成,实现无缝连接

    (5)能够利用Web检索和发布数据,实现与Internet的连接。 Access主要适用于中小型应用系统,或作为客户机/服务器系统中的客户端数据库。



安装MySQL的方式常见的有三种:


 1、rpm包形式

 2、通用二进制形式

 3、源码编译(重点)


1、yum/rpm安装适合对数据库要求不太高的场合,例如并发不大,公司内部,企业内部的一些应用场景;

2、二进制安装比较简答方便,适合5.0-5.1和5.5-5.6系列,是很多专业DBA的选择;

3、普通linux运维人员多采用编译方式,5.0-5.1系列就是常规编译方式,5.5-5.6系列就是cmake编译方式。


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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


目前国内主流的云服务器品牌有阿里云、腾讯云、西部数码、百度云、华为云、京东云、UCLOUD、青云、金山云、天翼云

 这10家云服务厂商在国内都颇有知名度,尤其是像阿里云、腾讯云、百度云这种巨头,更是品牌影响力巨大。



linux服务器,运行的web组件是Apache+mysql, 支持PHP和MYSQL为主,部分linux能支持JSP。

 Windows服务器,运行的web组件是IIS,数据库为SQL server为主,IIS版本由6-8不等




linux系统主流的几个版本有什么区别?


1、Arch Linux也许 Arch 最主要的特点之一就是,它是一个独立的开放源代码的发行版(这意味着它不基于任何其他的发行版),

由于 Arch 采用滚动发布模式,因此你只要使用 pacman 执行定期的系统更新就可以获得最新的软件。


2、 CentOS虽然社区企业操作系统(Community ENTerprise Operating System)是用于 Linux 服务器的最有名、最常用的发行版,

但是它的桌面版本还在继续不断完善中。另外,它的稳健性、稳定性、和 100% 的二进制兼容性,

也使之成为了 Red Hat Enterprise Linux 的头号备选——特别是对云 VPS 供应商而言——也许这就是发行版持续增长的主要原因之一。


3、Manjaro基于 Arch Linux 的 Manjaro,目标在于利用让 Arch 成为一个伟大发行版的功能优势,同时提供一个更舒适的安装和运行体验,

无论是新手还是有经验的 Linux 用户,都可以开箱即用。

Manjaro 预装了桌面环境、图形应用程序(包括软件中心)和用于播放音频和视频的多媒体解码器。


4、 Mageia作为现在已经消失的 Mandriva Linux 的衍生品,受非盈利性组织支持的 Mageia 诞生于2010年,自那时起,

成为了台式机和服务器上的著名的安全而稳定的 Linux 发行版。


5. Fedora由 Red Hat 支持的 Fedora Project 构建和维护,这是一个世界性的志愿者和开发人员社区,

Fedora 之所以能够持续几年成为使用最广泛的发行版之一,是因为它有三个主要的可用版本:

Workstation (用于台式机) ,Server 和 Cloud 镜像,以及ARM 版本用于基于 ARM(通常为无操控外设)的服务器。

不过,也许 Fedora 最显着的特点是,它总是在率先将新的软件包版本和技术整合到发行版中。

此外, Red Hat Enterprise Linux 和 CentOS 的新版本都是基于 Fedora 的。


6、openSUSE既是一个滚动发布版本,又可当作是一个独立的定期发布版本,openSUSE 根据其开发人员的不同,

是系统管理员、开发人员和桌面用户 Linux 的发行版之选,无论你的经验水平处于哪种级别(受到初学者和极客们的一致好评)。

最重要的是,著名又屡获殊荣的 SUSE Linux Enterprise 产品基于 openSUSE。


7、 UbuntuCanonical,这个 Ubuntu 背后的公司,一直致力于使 Ubuntu 成为一个流行和普遍的发行版,

并且现在你可在智能手机、平板电脑、个人电脑、服务器和云 VPS 的上面看到 Ubuntu 的身影。此外,Ubuntu 基于 Debian,

并且是一款非常受新用户欢迎的发行版——这可能就是 Ubuntu 在一段时间内持续增长的原因。虽然在这个排名中没有计算进来,

但 Ubuntu 是其他 Canonical 系列发行版,如 Kubuntu、Xubuntu、Lubuntu 的基础。


8. Debian作为一个坚如磐石的 Linux 发行版,Debian 每2年发布新的稳定版本,并且你放心,每个版本都已经过彻底的测试。

虽然它主要用于服务器上,但现在它的桌面版本已经在功能和外观上得到了明显的改善。


9、 Linux MintLinux Mint 的著名口号 “From freedom came elegance” ,不只是说说而已。

基于 Ubuntu 的 Linux Mint,是一个稳定、功能强大、完整、易于使用的 Linux 发行版——我们还有很多很多的褒义词可以用来形容 Mint。

Mint 最显著的特点之一是,在安装过程中允许你从一个列表中选择桌面环境,并且你可以放心,一旦它安装完了之后,

你无需任何额外的配置步骤就能播放音乐和视频文件,因为标准安装提供了多媒体解码器的开箱即用。


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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


SSH(Secure Shell,安全外壳)是一种网络安全协议,通过加密和认证机制实现安全的访问和文件传输等业务。

传统远程登录或文件传输方式,例如Telnet、FTP,使用明文传输数据,存在很多的安全隐患。随着人们对网络安全的重视,这些方式已经慢慢不被接受。

SSH协议通过对网络数据进行加密和验证,在不安全的网络环境中提供了安全的登录和其他安全网络服务。作为Telnet和其他不安全远程shell协议的安全替代方案,

目前SSH协议已经被全世界广泛使用,大多数设备都支持SSH功能。


如何在linux服务器上从网站下载文件?

命令格式

wget URL地址

实例

wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.33-linux-glibc2.5-x86_64.tar.gz

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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


C标签是:核心标签,最常用的JSTL标签。


JSTL是apache对EL表达式的扩展(也就是说JSTL依赖EL),JSTL是标签语言。

JSTL标签使用以来非常方便,它与JSP动作标签一样,只不过它不是JSP内置的标签,需要我们自己导包,以及指定标签库而已。

JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。

JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 

除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。

根据JSTL标签所提供的功能,可以将其分为5个类别。

(1)核心标签:core

(2)格式化标签:fmt

(3)数据库标签:sql

(4)XML 标签:xml

(5)JSTL 函数


为什么要使用C标签?


JSTL的目标是为了简化JSP页面的设计。对于页面设计人员来说,使用脚本语言(默认值是JAVA语言)操作动态数据是比较困难的,

而采用标签和表达式语言相对容易一些,JSTL的使用为页面设计人员和程序开发人员的分工协作提供了便利。


JSTL 核心标签库(C标签)标签共有14个,功能上分为4类:


(1)表达式控制标签:

<c:out>标签:用来显示一个表达式的结果,与<%= %>作用相似,它们的区别就是标签可以直接通过"."操作符来访问属性。

<c:set>标签:用于设置变量值和对象属性。

<c:remove>标签:用于移除一个变量,可以指定这个变量的作用域,若未指定,则默认为变量第一次出现的作用域。

<c:catch>标签:主要用来处理产生错误的异常状况,并且将错误信息储存起来。


(2)流程控制标签:

<c:if>标签:判断表达式的值,如果表达式的值为 true 则执行其主体内容。

<c:choose>标签:与Java switch语句的功能一样,用于在众多选项中做出选择。

<c:when>标签:<c:when>在<c:choose>中,就相对于case在switch语句中。

<c:otherwise>标签:<c:otherwise>在<c:choose>中,就相对于default在switch语句中。


(3)循环标签:

它们封装了Java中的for,while,do-while循环。

<c:forEach>标签:更加通用的标签,因为它迭代一个集合中的对象。

<c:forTokens>标签:通过指定分隔符将字符串分隔为一个数组然后迭代它们。


(4)URL操作标签:

<c:import>标签:提供了所有<jsp:include>行为标签所具有的功能,同时也允许包含绝对URL

<c:url>标签:将URL格式化为一个字符串,然后存储在一个变量中。

<c:redirect>

标签:通过自动重写URL来将浏览器重定向至一个新的URL,它提供内容相关的URL,并且支持<c:param>标签。

<c:param>标签:用于在标签中指定参数,而且与URL编码相关。


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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


说到反向代理就先讲一下正向代理


正向代理:

客户端想要访问一个服务器,但是它可能无法直接访问这台服务器,这时候这可找一台可以访问目标服务器的另外一台服务器,

而这台服务器就被当做是代理人的角色 ,称之为代理服务器,于是客户端把请求发给代理服务器,

由代理服务器获得目标服务器的数据并返回给客户端。客户端是清楚目标服务器的地址的,而目标服务器是不清楚来自客户端,

它只知道来自哪个代理服务器,所以正向代理可以屏蔽或隐藏客户端的信息。

 

反向代理:

从上面的正向代理,你会大概知道代理服务器是为客户端作代理人,它是站在客户端这边的。

其实反向代理就是代理服务器为服务器作代理人,站在服务器这边,它就是对外屏蔽了服务器的信息,常用的场景就是多台服务器分布式部署,

像一些大的网站,由于访问人数很多,就需要多台服务器来解决人数多的问题,这时这些服务器就由一个反向代理服务器来代理,

客户端发来请求,先由反向代理服务器,然后按一定的规则分发到明确的服务器,而客户端不知道是哪台服务器。常常用nginx来作反向代理。


Nginx的负载均衡:

负载:就是Nginx接受请求

均衡:Nginx将收到的请求按照一定的规则分发到不同的服务器进行处理

 

Nginx支持的负载均衡调度算法方式如下:

weight轮询(默认):接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,


Nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。 这种方式下,可以给不同的后端服务器设置一个权重值(weight),

用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;

该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。


ip_hash:每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,

这也在一定程度上解决了集群部署环境下session共享的问题。


fair:智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,

响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是Nginx默认不支持fair算法,

如果要使用这种调度算法,请安装upstream_fair模块。


url_hash:按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在nginx作为静态服务器的情况下提高缓存效率。

同样要注意Nginx默认不支持这种调度算法,要使用的话需要安装nginx的hash软件包。


为什么要使用反向代理?

1.创建对文件传输服务器的单点访问

2.简化访问控制任务

3.将用户凭据移到更安全的地方

4.降低敏感数据的风险

5.帮助达到合规性

6.降低资本和运营支出

7.允许透明维护后端服务器

8.启用负载平衡和故障转移


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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


什么是Nginx?

Nginx (engine x) 是一个高性能的 HTTP 和反向代理服务。Nginx 是由伊戈尔·赛索耶夫为俄罗斯访问量第二的 Rambler.ru 站点(俄文:Рамблер)开发的,第一个公开版本 0.1.0发布于 2004 年 10 月 4 日。

Nginx的作用是什么?

Nginx 是一个很强大的高性能 Web 和反向代理服务,它具有很多非常优越的特性:在连接高并发的情况下,Nginx 是 Apache 服务不错的替代品:Nginx 在美国是做虚拟主机生意的老板们经常选择的软件平台之一。


Nginx的作用:

1、作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,

这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,

感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型


2、作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。

Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。


3、作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),

Last.fm 描述了成功并且美妙的使用经验。


4、Nginx 安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少的服务器: Nginx 启动特别容易,

并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。


在WEB服务前端配置Nginx的好处是什么?

配置Nginx服务器,最大的好处得益于反向代理以及负载均衡的功能。


反向代理:

从上面的正向代理,你会大概知道代理服务器是为客户端作代理人,它是站在客户端这边的。

其实反向代理就是代理服务器为服务器作代理人,站在服务器这边,它就是对外屏蔽了服务器的信息,常用的场景就是多台服务器分布式部署,

像一些大的网站,由于访问人数很多,就需要多台服务器来解决人数多的问题,这时这些服务器就由一个反向代理服务器来代理,

客户端发来请求,先由反向代理服务器,然后按一定的规则分发到明确的服务器,而客户端不知道是哪台服务器。常常用nginx来作反向代理。


Nginx的负载均衡:

负载:就是Nginx接受请求

均衡:Nginx将收到的请求按照一定的规则分发到不同的服务器进行处理



其他反向代理服务器:



------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


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


脚本(script)是使用一种特定的描述性语言,依据一定的格式编写的可执行文件,又称作宏或批处理文件。


脚本通常可以由应用程序临时调用并执行。各类脚本目前被广泛地应用于网页设计中,因为脚本不仅可以减小网页的规模和提高网页浏览速度,

而且可以丰富网页的表现,如动画、声音等。举个最常见的例子,

当我们点击网页上的E-mail地址时能自动调用Outlook Express或Foxmail这类邮件软件,

就是通过脚本功能来实现的。也正因为脚本的这些特点,往往被一些别有用心的人所利用。例如在脚本中加入一些破坏计算机系统的命令,

这样当用户浏览网页时,一旦调用这类脚本,便会使用户的系统受到攻击。所以用户应根据对所访问网页的信任程度选择安全等级,

特别是对于那些本身内容就非法的网页,更不要轻易允许使用脚本。

通过“安全设置”对话框,选择“脚本”选项下的各种设置就可以轻松实现对脚本的禁用和启用。


脚本(Script)的意思最早是从演艺界来的。如果没有脚本,该怎么表演? 表演者只能即兴发挥,或者靠导演的口述来进行。

有了脚本,带来的最大变化是什么?

  • 可重复。也就是说,有了脚本,可以把我们既定的一个规程不断重复。
  • 脚本需要人来执行。因此脚本的执行效率与具体的执行人有关系。
  • 如果在表演过程中,商定了某种大家认可的修改,会考虑对脚本进行修改,用以将我们修改的意图记录下来,将来的再现就可以反映这个修改。

对于 IT 行业,脚本这个词,是个绝妙的翻译。他贴切的表达了这几个含义(web前端开发中scripts文件下有.js文件就是脚本)。

  • 脚本的用意是为了可再现的重复一个设定好的规程。
  • 脚本需要有一个解释器来执行。
  • 脚本能够方便的,快速的,经常的被修改。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


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


Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:

例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。


例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。使用Filter的完整流程:

Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。


Java拦截器(Interceptor)

拦截器是动态拦截Action调用的对象,它提供了一种机制,可以使开发者自定义在一个action的前后执行指定代码,

也可以在一个action执行之前阻止其执行。

同时,拦截器还可以将通用的代码模块化并作为可重用的类(Struts2中的很多特性都是由拦截器来完成的)。
在面向切面编程中(AOP),拦截器用于在某个方法或字段被访问之前进行拦截,然后在之前或之后加入某些指定操作。

谈到拦截器,还有一个词大家应该知道——拦截器链(Interceptor Chain,在Struts2中称为拦截器栈Interceptor Stack)。

拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。



Spring AOP拦截器

  • 只能拦截Spring管理Bean的访问(业务层Service)。 具体AOP详情参照 Spring AOP:原理、 通知、连接点、切点、切面、表达式
  • 实际开发中,AOP常和事务结合:Spring的事务管理:声明式事务管理(切面)
  • AOP操作可以对操作进行横向的拦截,最大的优势在于他以获取执行方法的参数( ProceedingJoinPoint.getArgs() ),对方法进行统一的处理。
  • Aspect : 可以自定义切入的点,有方法的参数,但是拿不到http请求,可以通过其他方式如RequestContextHolder获得(
    ServletRequestAttributes servletRequestAttributes= (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    )。
  • 常见使用日志,事务,请求参数安全验证


拦截器与过滤器的区别:


1.拦截器是基于java反射机制的,而过滤器是基于函数回调的;
2.拦截器不依赖于servlet容器,而过滤器依赖于servlet容器;
3.拦截器只对action起作用,而过滤器几乎可以对所有请求起作用;
4.拦截器可以访问action上下文、值栈里的对象,而过滤器不能;
5.在action的生命周期里,拦截器可以多起调用,而过滤器只能在容器初始化时调用一次。


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


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


Annotation(注解),其实就是对类,方法,属性进行的一种标示,一种注释(注意一下,注释其实不是为了让我们开发或维护人员阅读更方便,

而是为JVM看),通过这些标示,Java虚拟机可以完成这些标示对应的功能。例如使用框架开发时,

我们都是通过配置文件进行对象关系组合映射等功能,而通过注解我们可以完全代替配置文件的编写。


注解如同标签

回到博文开始的地方,之前某新闻客户端的评论有盖楼的习惯,

于是 “乔布斯重新定义了手机、罗永浩重新定义了傻X” 就经常极为工整地出现在了评论楼层中,

并且广大网友在相当长的一段时间内对于这种行为乐此不疲。这其实就是等同于贴标签的行为。


Annotation的作用:

编写文档:通过代码里标识的元数据生成文档。

代码分析:通过代码里标识的元数据对代码进行分析。

编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查。



JDK内置的几个常用注解:

(1)@Override:此注解能够实现编译时检查,当某方法前边添加此注解时,表示此方法为重写父类中的方法。

如果此方法不是父类的方法,例如我们本来想重写toString呢,却写成了tostring,则编译无法通过,会提示错误。


(2)@Deprecated:此注解是对不应该,或者将要淘汰的方法进行标识,当编程人员使用时就会给予提示。


(3)@SuppressWanings:此注解表示去除一些警告,但是里边需要我们制定参数。


(4)@interface进行自定义注解的定义。使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,

由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。@interface用来声明一个注解,

其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,

返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。


Spring注解开发

Spring框架的核心功能IoC(Inversion of Control),也就是通过Spring容器进行对象的管理,以及对象之间组合关系的映射。

通常情况下我们会在xml配置文件中进行action,service,dao等层的声明,然后并告知框架我们想要的注入方式,

然后在类中声明要组合类的get,set方法。而通过Spring框架中注解的运用也就主要是解决这类问题的。

而框架中另一个核心知识AOP,一种面向横切面的方法编程,在程序中一般都是进行一次设置就可以的,

所以都还放在配置文件中。例如声明式事物的设置,一次设置,后边就不用管了,所以这个没有必要使用注解进行简化。


1.首先需要在配置文件中增加命名空间的和约束文件

2.开启Spring的注解功能,这样Spring环境才会进行指定位置的扫描,进行类之间的关联组合

3.声明注解类,让Spring框架可以识别


(1)类的分层注解,由于我们后台开发都是分为三层进行开发的,所以Spring框架提供了三种对于不同层的注解方式:

控制层:@Controller

服务层:@Service

持久层:@Repository

默认情况下使用注解声明的Bean对象id名称为:类名称的首字母小写,一般不需要我们进行设置,如果想要设置时,例如我们指定的是实现类,

而名字指向了接口,直接添加value属性即可:@Service(value="name"),当然value是可以省略的。


Spring框架还为我们提供了代替上边三个分层注解的通用注解:@Component.当然提倡大家使用分层注解更好一些,区分层次比较明确。

(2)自动装配功能的实现对象之间的组合关系,在属性前边指定下边的注解:

@Autowired : 采用类型的方式完成自动装配 : byType

@Resource : 采用名称+类型的方式完成自动装配 : byName +byType

另外Spring提供的两种注解的自动装配功能,属性不需要声明set,get方法也可以完成组合功能,这是非常方便的。


在开发中我们应该选择使用配置文件开发,还是使用注解开发?


(1)注解开发的优缺点

优点:

1)开发速度快;

2)编译期间容易发现错误的出处 。

缺点:

1)管理分散,基本每个类上都有;

2)扩展功能时,没有遵循OCP开发原则(一个软件应该对扩展开放,对修改关闭,可以在不必修改源代码的情况改变模块的行为)。


(2)配置文件开发的优缺点

优点:

1)遵循OCP开发原则,修改配置文件即可进行功能扩展;

2)集中管理对象和对象之间的组合关系,易于阅读。

缺点:

1)开发速度相对较慢;

2)编译时很难检查出错误,运行中的错误很难定位,调试难度较大。

如果客户需求不会频繁发生变化。那么使用注解非常好,开发效率快。

如果客户需求经常发生变化,那么采用配置文件的方式会好一些。有利于扩展。


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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


关于xml

xml优点:

1.使用xml配置可以让软件更具有扩展性;
比如,我们在spring中,我们不想使用接口而是想用接口的实现类,这个时候只需要修改xml配置中bean的class值就可以了。

2.对象之间的关系一目了然;

3.xml定义:可扩展标记语言,标准通用标记语言的子集,简称XML。从这个定义中我们可以发现,xml最大的优势就在于,开发者(程序员)能够为软件量身定做使用的标记,使得xml更通俗易懂;

4.成熟的校验机制,来保证正确。可以使用Schema或者是DTD来对xml的正确性进行校验。

5.基于xml配置的时候,只需要修改xml即可,不需要对现有的程序进行修改。

6.容易与其他系统进行数据交互。数据共享方便
xml的缺点

1.应用程序中如果使用了xml配置,需要解析xml的工具或者是是第三方类库的支持。

2.解析xml的时候必然会占用资源,势必会影响到应用程序的性能;以java为例,无论是将xml一次性装置到内存中,还是一行一行读取解析的,都会占用资源的。

3.在程序编译期间无法对其配置项的正确性进行验证,只能在运行期发现。

4.出错后,排错变得困难。往往在配置的时候,一个手误就会出现莫名其妙的错误。

5.开发的时候,既要维护代码又要维护配置文件,使得开发的效率降低。

6.代码与配置项之间有时候会存在很多“潜规则”.改变了任意一方,都有可能影响到另一方的使用。这是个大坑。比如:自定义的标记,如果其他开发不清楚这些的话,修改了无论是代码还是xml的配置,都会导致程序不能正常运行。

7.开发工具对xml的验证支持的不是很好。比如idea,对xml正确性,如果是自定义的,验证就不是很好。


Spring MVC五大组件

DispatcherServlet:Spring的WebMVC模块是围绕DispatcherServlet而设计的。DispatcherServlet 给处理程序分派请求,

执行视图解析,并且处理语言环境和主题解析,此外还为上传文件提供支持。


hadlerMapping:包含了请求路径与模型的对应关系。


Controller(控制器):调用相应的业务层处理业务逻辑


ModelAndView:Controller处理数据封装在里面,当然还可能有视图名。


ViewResolver(视图解析器):调用真正的视图对象来生成相应的页面。


运行原理

Dispatcherservle主要负责接受请求,然后依据HandlerMapping调用相应的控制器,

Controller(控制器)处理业务返回ModelAndView,Disparcherservlet又依据相应的视图解析器(ViewResolver)调用相应的视图响应


Annotation

1、可以利用Java的反射,减少一些不必要的配置工作。例如:JAP配置进行ORM(优点)

2、可以比较方便的进行细粒度的控制,例如:@Transactional、@Cacheable可直接指定到接口维度(即是优点、也是缺点)

3、配置和代码混合在一起,单一依赖比较直观,不用频繁切换至xml中查看关系,但也导致了配置项比较零散(即是优点、也是缺点)

4、第三方库无法进行注解(缺点)

5、配置关系调整时,涉及的类必须重新编译才能生效(缺点)


XML

1、配置项集中,便于管理(优点)

2、配置关系调整比较灵活,直接修改配置项重新加载即可,代码无需修改(优点)

3、支持通配符方式进行批量配置,列如:AOP直接切一整类方法(优点)

4、配置文件编写比较繁琐,缺乏有效的校验机制,部分错误到运行时才能察觉(缺点)


应用建议

综上所述,建议采用Annotation和xml混合的方式进行spring配置:

1、对于配置关系固定的类,或是需要细粒度控制的配置项,优先使用Annotation进行配置

2、对于配置变化较为频繁的部分(如数据源),或是需要粗粒度统配的,优先采用XML进行配置



------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


31.web.xml里的主要配置都包括什么,都代表什么含义,比如怎么加载Spring 配置的?


一、web.xml文件的特点(规则):

必须有且只有一个根节点,大小写敏感,标签不嵌套,必须配对。


二、web.xml文件的作用:

web.xml文件是用来初始化配置信息:比如Welcome页面、servlet、servlet-mapping、filter、listener、启动加载级别等。

当你的web工程没用到这些时,你可以不用web.xml文件来配置你的Application。


三、web.xml能做的事情:

在web.xml的模式(Schema)文件中定义了多少种标签元素,web.xml中就可以出现它的模式文件所定义的标签元素,

它就能拥有定义出来的那些功能。

而且web.xml的模式文件中定义的标签并不是定死的,模式文件也是可以改变的,一般来说,随着web.xml模式文件的版本升级,

里面定义的功能会越来越复杂,也即标签元素的种类会越来越多,但有些是不常用的,我们只需记住一些常用的就可以了。


下面列出web.xml文件中的主要标签及其含义:


一、欢迎页面

访问一个网站时,默认看到的第一个页面就叫欢迎页,一般情况下是由首页来充当欢迎页的。一般情况下,我们会在web.xml中指定欢迎页。

但web.xml并不是一个Web的必要文件,没有web.xml,网站仍然是可以正常工作的。只不过网站的功能复杂起来后,web.xml的确有非常大用处,

所以,默认创建的动态web工程在WEB-INF文件夹下面都有一个web.xml文件。


二、命名和定制URL

为Servlet和JSP文件命名并定制URL,其中定制URL是依赖命名的,命名必须在定制URL前。


三、定制初始化参数

定制servlet、JSP、Context的初始化参数,然后可以在servlet、JSP、Context中获取这些参数值。


四、设置过滤器

Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码、做一些业务逻辑判断等。

其工作原理是,只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,

此时你就可以对请求或响应(Request、Response)统一设置编码,简化操作;同时还可进行逻辑判断,如用户是否已经登陆、

有没有权限访问该页面等等工作。它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,

只有当你的web应用停止或重新部署的时候才销毁。


五、设置监听器

Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是随web应用的启动而启动,

只初始化一次,随web应用的停止而销毁。主要作用是:

 做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。


web.xml加载spring配置文件的方式主要依据该配置文件的名称和存放的位置不同来区别,目前主要有两种方式。

1.如果spring配置文件的名称为applicationContext.xml,并且存放在WEB-INF/目录下,那么只需要在web.xml中加入以下代码即可

<listener>  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>

该监听器会自动扫描WEB-INF/ 下的applicationContext.xrnl 文件,这种方式多数用在只有一个配置文件的情况下。
还可以使用Spring的ContextLoaderServlet的这个特殊Servlet,实现代码如下

<servlet>  <servlet-name>context</servlet-name>  <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-name>
  <load-on-startup>1(比较小的数字就可以)</load-on-startup>
</
servlet>

上面的两种方式都可以,不过二者有一些区别。

2.如果spring配置文件的名称是自定义的其他名称,比如为applicationContext-test.xml,也还是存放在WEB-INF/目录下,那么还需要配置contextConfigLocation这个参数,

该参数是一个字符串,监听器或者Servlet会自定将该字符串按照特定的字符(比如空格、逗号、分号)解析成多个文件。需要添加如下代码:

<context-param>  <param-name>contextConfigLocation</param-name>  <param-value>/WEB-INF/application-testA.xml,/WEB-INF/application-testB.xml,/WEB-INF/application-testB.xml</param-value></context-param>

如果上面嫌得麻烦,可以使用通配符对上面进行简写如下

<context-param>  <param-name>contextConfigLocation</param-name>  <param-value>/WEB-INF/application*.xml</param-value></context-param>

然后再加入以上的监听器或者servlet代码就可以。

3.如果既没有applicationContext.xml 文件,也没有使用contextConfigLocation参数确定配置文件,或者contextConfigLocation确定的配置文件不存在。

都将导致Spring 无法加载配置文件或无法正常创建ApplicationContext 实例.


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

32.Spring MVC和Struts的区别是什么,为什么更倾向于使用Spring MVC?


一、Spring

首先,结合到自己对于Spring的使用,我明确的一点是,Spring严格上来说,并不是一种框架。它相当于一个粘合剂,

黏合了别的框架或者组件。所以,spring是一个容器!为什么用Spring,个人感觉,spring就是一个容器的本质,

程序开发的模块组件,都可以通过spring这个容器进行组装拼合,spring为我们提供了很多 管理的功能。

而且,它是一个轻量级的容器。我们常说EJB是重量级,Spring是轻量级的,那么,究竟什么叫轻量级或重量级呢?

附:轻量级和重量级(往简单了说)

首先;轻量级和重量级,它只是一个相对的概念。如果没有对比,就没有所谓的轻重之分

轻量级:当轻量级的框架启动时,创建和销毁的资源都非常少。简而言之,一个轻量级的框架,它的入侵性非常小,

也可以说是耦合性很低。可以很轻易的替换掉它,而不需要做太大的改动,它对别的组件的依赖非常小!


重量级:和轻量级相对,引入一个重量级的框架,意味着需要引入相当多的依赖和其他组件,

当需要修改这个框架时,基本上面临着重组的危机!


二、SpringMVC

从Spring的结构图可以看出,springMVC位于spring web端的一个框架,是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦。

附:基于请求驱动指的就是使用请求-响应模型。从原理上看,它基本上和.NET的MVC的原理相同!


三、Spring和SpringMVC的联系

从名字上就可以窥探出,Spring>SpringMVC,那么事实上,spring和SpringMVC是一种父子关系。

SpringMVC是spring扩展出的一个应用于web端的框架。在这里需要注意的一点,就是到底什么是父子容器关系:

spring主要的作用是黏合其他模块组件,进行统一管理,springmvc则主要是负责web端。

那么,我们都知道,我们在应用spring的时候,可以使用注入。这个时候,如果我们的web端是用的SpringMVC,

这个时候,controller理论上是通过SpringMVC去注入,但是,使用spring注入,同样是可行的。

同理,service等层,使用SpringMVC配置的统一扫描装配也是可以的。

所以,如果说只是为了使用spring的依赖注入,是大可不必将springMVC和spring同时使用的。他们完全可以分开!

但是,尽管SpringMVC和spring都可以进行自动装配扫描,值得注意的是:

spring(父容器)并不能直接访问SpringMVC(子容器)所注入的对象,但是SpringMVC却可以访问到spring装载的对象。

所以,在配置自动装配的时候,应该注意到这一点。


四、Struts

Struts是对于MVC的一种非常完美的实现,从根本上来说,它其实和SpringMVC一样,都是基于MVC思想的扩展实现。

但是,在SpringMVC3之后 ,SpringMVC完超Struts。(注:但是,框架并没有优劣之分,框架本身就是一种权衡,相对而言而已)


Struts和SpringMVC的区别:

首先,如果说项目中使用了spring,那么还是使用SpringMVC吧,

因为相对于融合Struts来说,spring和SpringMVC是非常完美的无缝链接。

其次,SpringMVC的拦截粒度是方法,而Struts的粒度是类

然后,入口不同,SpringMVC的入口是servlet,而Struts是filter

最后,如果使用注解的话,SpringMVC基本上是零配置,而Struts需要配置很多。

备注:想说一点的是:在Struts中可以配置开发者模式,就是说当修改了一个URL访问,可以不用重启工程。但是SpringMVC需要重启。


为什么更倾向于使用Spring MVC?

spring mvc 是单例的 ,线程安全。strtus2 是单例的,一个请求对应一个实例,线程是安全的。

springmvc 的核心是dispactcherServlet ,strtus 的核心控制器是filterdispather。

spring mvc 是基于方法操作数据,strtus 是基于类操作数据。

spring mvc 接收数据是根据方法的参数来接收,strtus 接收数据是根据类里的属性接收,

spring mvc 使用起来更简单,struts使用起来复杂。

spring mvc的请求路径根据注解和视图解析器就可以确定。status 的请求路径是根据strus 的配置文件里的 action 标签来确定的。




收获:以上


明天计划:完成剩下的深度思考






返回列表 返回列表
评论

    分享到