发表于: 2021-05-01 16:19:55

4 1217


一,今天完成的事情

任务二深度思考41-51。任务二小结。

41.如何写shell脚本?尝试自己编写一个简单脚本。   

1Shell既是一种命令语言,又是一种程序设计语言(就是你所说的shell脚本)Shell 脚本(shell script),是一种为 shell 编写的脚本程序。

2#!/bin/bash

echo "Hello World !"

 

42.Linux服务器上部署的时候,一般都要有哪些脚本,这些脚本该怎么编写?   

启动,停止,重启,状态,自动部署包等。在我任务二的日报中有一套。按照具体要求改写

1,部署jar程序

#!/bin/sh

sourceMsgPath=/home/xxx/server/yyy

 

source /etc/profile

for i in $HOME/server/tws-test/lib/*;

    do CLASSPATH=$i:"$CLASSPATH";

done

export CLASSPATH=.:${CLASSPATH}

java  demo.rest.DemRest2 $sourceMsgPath$1

 

echo "Success!"

2,半自动化工程部署

#!/bin/bash

#war包上传临时目录

warPath=/usr/local/tmp-tms

#tomcatwebapps中文件

service_webapps=/usr/local/service-tomcat/webapps

web_webapps=/usr/local/web-tomcat/webapps

#待替换的配置文件

from_service_config=$warPath/224-service

to_service_config=$service_webapps/tms_service/WEB-INF/classes

from_web_config=$warPath/224-web

to_web_config=$web_webapps/tms/WEB-INF/classes

 

deployService(){

    #清空tomcat  webapps下的文件

    rm -rf $service_webapps/*

    echo "完成临时目录的清理:$service_webapps"

    #移动war文件到webappps目录

    mv $warPath/tms_service.war $service_webapps

    echo "完成war文件的移动:$service_webapps/tms_service.war"

    #解压war

    cd $service_webapps

    unzip tms_service.war -d tms_service

    echo "完成war文件解压:$service_webapps/tms_service.war"

    #替换war中的配置文件

    cp $from_service_config/log4j.properties $to_service_config/log4j.properties

    cp $from_service_config/resources.properties $to_service_config/resources.properties

    cp $from_service_config/service.xml $to_service_config/service.xml

    echo "完成Service工程配置文件的替换!"

}

 

deployWeb(){

    #清空tomcat  webapps下的文件

    rm -rf $web_webapps/*

    echo "完成临时目录的清理:$web_webapps"

    #移动war文件到webappps目录

    mv $warPath/tms.war $web_webapps

    echo "完成war文件的移动:$web_webapps/tms.war"

    #解压war

    cd $web_webapps

    unzip tms.war -d tms

    echo "完成war文件解压:$web_webapps/tms.war"

    #替换war中的配置文件

    cp $from_web_config/log4j.properties $to_web_config/log4j.properties

    cp $from_web_config/service.xml $to_web_config/service.xml

    cp $from_web_config/tms.properties $to_web_config/tms.properties

    echo "完成web工程配置文件的替换!"

}

 

##############脚本入口

#./deploy.sh service      ---只部署service

#./deploy.sh web          ---只部署web

#./deploy.sh both           ---同时部署serviceweb

 

if [ $1 == "service" ]

then

    deployService

   echo "只部署service,successful"

elif [ $1 == "web" ]

then

    deployWeb

   echo "只部署web,successful"

elif [ $1 == "both" ]

then

   deployService

   sleep 10

   deployWeb

   echo "同时部署serviceweb,successful!"

else

   echo "请输入一个正确参数:service web both"

fi

 

43.如果有多个WEB服务,都把WEB服务都配置在一个容器里,还是一个WEB配置一个容器,他们的差别是什么,你觉得哪种方式更好?   

1,如果有多个容器,配置多个容器比一个容器好。如果全部在一个容器,只要此容器有问题,会影响全部web服务配置多个容器,稳定性提高,但是对服务器的资源的要求要高,成本增加。

2,我已经有多个容器,所以配备到多个容器中。

 

44.Resin/tomcat/jettyWEB容器的内存大小,一般应该设置多大合适,怎么估算WEB程度占用内存的大小?   

1,需要评估服务器运行什么应用?需要支持多少用户访问?需要多大空间来存储数据?Web服务器内存的选择标准主要根据网站的流量而定,对于一般的企业站或者小型网站,服务器的内存通常选择2G就可以了,但是随着网站流量的增加,建议将网站升级到4G或者8G,8G内存基本能够满足访问量上万的需求了。

2,通常一个请求分配的空间都在eden区域,eden区域满的时候会发生Young GC.所以有了GC的时间间隔,比如2s,进一步通过QPS数量*2就知道了多少此请求把内存沾满。

RamUsageEstimator根据java对象在堆内存中的存储格式,通过计算Java对象头、实例数据、引用等的大小,相加而得,如果有引用,还能递归计算引用对象的大小。

通过请求,对象能估算WEB服务器占用内存大小情况。

 

45.jetty,resin,tomcat的常见配置有哪些,内存,端口,日志文件都怎么配置?   

11jetty的配置文件的root元素。<Configure id="Server" class="org.mortbay.jetty.Server">

2tomcatserver.xml:主要的配置文件。

 web.xml:缺省的web app配置,WEB-INF/web.xml会覆盖该配置。

 context.xml:不清楚跟server.xml里面的context是否有关系。

3resin和其它2个服务器也常常会配置日志,内存,端口

21Jetty默认使用8080端口,要让它使用其他端口(如7070),那么编辑start.dWondows系统是start.ini文件),找到jetty.http.port行,修改为:

## Connector port to listen on

jetty.http.port=7070

保存并退出,再重启Jetty

配置日志后,可以再次启动Jetty,并可以查看到日志模块是激活了的。

2Tomcat.

(1)配置内存大小

 修改bin/catalina.bat中的set CATALINA_OPTS=-Xms64m -Xmx128m

 Xms指最小内存,Xmx指最大内存

2server.xml配置

 server标签

 port:指访问日志设置

3)在server.xml中加入

 <Valve className="org.apache.catalina.valves.AccessLogValve"

                  directory="logs"  prefix="localhost_access_log." suffix=".txt"

                  pattern="common" resolveHosts="false"/>

 这样访问日志会记录到Logs中。定一个端口,这个端口负责监听关闭tomcat的请求

3)resin

<!-- 强制resin强制重起时的最小空闲内存 -->

memory-free-min>1M</memory-free-min>

<!-- HTTP服务的端口-->

<http address="*" port="8080"/>

 日志

<!--access-log id='logs/access.log'

format='%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"'

rollover-period='1W'/-->

<error-log id='logs/error.log'/>

 

46.jetty,resin,tomcat的差别在哪里,在线上服务应该选择哪一种WEB服务器?   

1,tomcatjetty1)架构比较

Jetty的架构比Tomcat的更为简单

Jetty的架构是基于Handler来实现的,主要的扩展功能都可以用Handler来实现,扩展简单。

Tomcat的架构是基于容器设计的,进行扩展是需要了解Tomcat的整体设计结构,不易扩展。

2)性能比较

JettyTomcat性能方面差异不大

Jetty可以同时处理大量连接而且可以长时间保持连接,适合于web聊天应用等等。

Jetty的架构简单,因此作为服务器,Jetty可以按需加载组件,减少不需要的组件,减少了服务器内存开销,从而提高服务器性能。

Jetty默认采用NIO结束在处理I/O请求上更占优势,在处理静态资源时,性能较高

少数非常繁忙;Tomcat适合处理少数非常繁忙的链接,也就是说链接生命周期短的话,Tomcat的总体性能更高。

Tomcat默认采用BIO处理I/O请求,在处理静态资源时,性能较差。

3)其它比较

Jetty的应用更加快速,修改简单,对新的Servlet规范的支持较好。

Tomcat目前应用比较广泛,对JavaEEServlet的支持更加全面,很多特性会直接集成进来。

2tomcatresin的区别

特征

Tomcat

Resin

用户数

可参考文档

部署环境启动

臃肿

人性化

开发环境热部署支持

较好,可根据需要配置。修改Jspjava文件时,可配置是否重启服务

较差,更新classjsp文件,系统都会自动重新部署,并重启,配置了Session会话时开发比较麻烦

生产环境下热部署支持

一般。更新配置文件时,必须手动重启。更新其他文件时,大部分不用重启。但一次性更新太多文件时,经常会造成Tomcat重启失败。

较好。更新配置文件时,Resin会自动重启。

集群部署

支持

支持

 

3,不同的服务器各有优劣,选择服务器时应该先参考项目,预估规模大小等。比如大规模的企业级应用,Tomcat自身扩展了大量JEE特性可满足企业级应用的需求, 所以这种情况下应选用Tomcat

 

47.maven常用的打包插件有哪些?有什么区别?如何使用 ?   

1maven-assembly-pluginmaven-assembly-plugin的用途是制作项目分发包,该分发包可能包含了项目的可执行文件、源代码、readme、平台脚本等等。 maven-assembly-plugin支持各种主流的格式如ziptar.gzjarwar等,具体打包哪些文件是高度可控的,例如用户可以 按文件级别的粒度、文件集级别的粒度、模块级别的粒度、以及依赖级别的粒度控制打包,此外,包含和排除配置也是支持的。maven-assembly- plugin要求用户使用一个名为assembly.xml的元数据文件来表述打包,它的single目标可以直接在命令行调用,也可以被绑定至生命周期。

2jetty-maven-pluginjetty-maven-plugin完全兼容 Maven项目的目录结构,能够周期性地检查源文件,一旦发现变更后自动更新到内置的Jetty Web容器中。做一些基本配置后(例如Web应用的contextPath和自动扫描变更的时间间隔),你只要执行 mvn jetty:run ,然后在IDE中修改代码,代码经IDE自动编译后产生变更,再由jetty-maven-plugin侦测到后更新至Jetty容器,这时你就可以直接 测试Web页面了。

3maven-jar-pluginjar 与依赖分开打包,生成的 jar 包比较小,需要放在 lib 文件夹中运行。maven-jar-plugin用于生成META-INF/MANIFEST.MF文件的部分内容。只是生成MANIFEST.MF文件还不够,maven-dependency-plugin插件用于将依赖包拷贝到<outputDirectory>${project.build.directory}/lib</outputDirectory>指定的位置,即lib目录下。

4maven-shade-plugin:所有的依赖放进同一个 jar 文件,可以直接运行

 

48.War包是什么,为什么WEB服务通常打出来的都是War包?除了War包,还有几种打包格式,他们之间的区别呢?   

1war 包是一种打包格式。

2Java web工程,都是打成war包,进行发布,打成war包的好处是不会缺少目录,并且只管理好一个发布文件就好,并且tomcat服务器能够自动识别,将war包放在tomcat容器的webapps下,启动服务,即可运行该项目,该war包会自动解压出一个同名的文件夹。

3

 

49.Put请求在Linux下的Tomcat或者是Resin中会收不到数据,怎么解决这个问题,原因是什么?为什么本地使用Jetty的时候往往是正常的?   

1Tomcat处理参数的问题原因:

Tomcat/resin 会将请求体中的数据封装成一个 Map,调用 request.getParameter() 会从这个 Map 中取值,Spring MVC 封装 POJO 对象时,对于对象中的每个属性值也会调用 request.getParameter() 方法去获取,然后赋值给对象相应的属性,完成属性封装

但是,对于 PUT 请求,Tomcat 不会封装请求体中的数据为一个 Map,只会将 POST 请求的请求体中数据封装成 Map;这样的话,无论是直接调用 request.getParameter() 方法,还是 Spring MVC 封装对象,肯定都拿不到属性值了。

2,解决方法:在web.xml添加filter来允许所有的put方法,来允许所有的put请求方法带参访问。

3jettytomcatresin容器在使用RequestParam注解处理PUT方法时的差异。POST方法在调用我们的handler之前都会从具体request中解析参数。但是,Tomcat中,PUT方法都无法解析为 MultipartRequest,这里为null;话句话说,PUT方法,不会解析body,直接返回。而jetty中能得到的ContentTypemultipart/formdata

 

50.Content-type中的数据类型,在Spring MVC中都怎么接收数据?   

1GET请求时是否定义Content-Type并无很大的影响,因为GET没有请求体,所有的数据都是通过url带过去,所以必须是"key=value"的格式,所以在springmvc端使用。@RequestParam String id这种格式即可,或者不写@RequestParam也可以,不写的话默认是@RequestParam

2,除GET外的这几种(POSTDELETEPUTPATCH)都是有请求体(body)的,且他们之间的差异不大:

3,当请求时定义Content-Typeapplication/json;charset=utf-8时,请求体中的数据(不管是不是json格式)都只能用@RequestBody获取,且一个方法参数列表最多写一个@RequestBody;

4,当然你也可以在请求url上带其他的queryString参数,然后在springmvc使用String id@RequestParam String id获取。

@RequestParam是无法获取请求体(body)中的参数的,springmvc会报错:Required String parameter 'name' is not present

所以这种情况只能使用@RequestBody获取请求体中的参数。

至于你使用Bean接收还是String接收取决你的需求,Bean接收更方便,不需要再次反序列化,而String接收可以更灵活,可以对接收到的字段进行检查。

5,当请求时未定义Content-Type(默认为application/x-www-form-urlencoded; charset=UTF-8),请求体中的数据都必须是key=values的类型,可以是使用@RequestBody获取整个请求体中的多个参数,也可以使用@RequestParam获取单个参数

 

51.什么是restfulrest的请求方法有哪些,有什么区别?   

1,符合REST原则的架构方式即可称为RESTfulREST全称是resource representational state,表现层状态转化,这不好理解,因此用另一句话概括:URL定位资源,用HTTP动词(GET,POST,DELETE,DETC)描述操作。

2,GET

get方法在Rest中主要用于获取资源,能够发送参数,不过有限制,且参数都会以?开头的形 式附加在URL尾部

POST

post方法在Rest请求中主要用于添加资源,参数信息存放在请求报文的消息体中相对安全,且可发送较大信息。

但是,规范化的post方法处理器是不幂等的,因此如果用户重复对一个资源进行post应该在处理器中做出限制和处理保证对数据不造成破坏和更改 从而提高安全性.

PUT

put方法在Rest中主要用于更新资源,因为大多数浏览器不支持putdelete,会自动将putdelete请求转化为getpost. 因此为了使用putdelete方法,需要以post发送请求,在表单中使用隐藏域发送真正的请求。

put方法是幂等的,对同一URL资源做出的同一数据的任意次put请求其对数据的改变都是一致的。

DELETE

DeleteRest请求中主要用于删除资源。Delete方法的参数同post一样存放在消息体中,具有安全性,可发送较大信息。Delete方法是幂等的,不论对同一个资源进行多少次delete请求都不会破坏数据。




任务二小结

任务二让程序与浏览器交互变成了可能。

 

首先设计CRUD的接口文档。这个工程需是Maven WEB工程。Spring Rest 编写对应的Controller,使用Json Tag-lib

 

配置web服务器,包括JettyResinTomcat。在Linux上这3个服务器有不同的部署方式,web服务器各自部署jar war包有不同方式。本地测试需要使用web服务器测试,也需要部署在云服务器上使用,能够正常运行。配置ResinTomcatJettyAccess.loglog命名有区别。列出请求的响应时间。使用top命令,kill命令。部署本地包到云服务器。

 

修改Resin的内存配置,测试最小启动的大小。启动后,用Resin自带的停止脚本停止服务。编写部署脚本到云服务器。测试云服务器上直接拿到GitHub代码后生成的war包在Resin上运行是否正常。配置NginxResin一起后测试是否正常。

 

Postman测试各种接口。测试本地Controller。测试云服务器上部署脚本部署后是否能访问接口。测试有Service代码的接口,本地。使用Junit。服务器得到GitHub上的代码,测试部署是否成功。

 

使用Spring 返回JSON对象,@ResponseBody。使用多种方式从request接收参数,包括paramHttp Body

 

使用Spring messageSource。设计错误信息。

 

配置Nginx,配合Resin

 

 

问题,困惑,疑难:

配置服务器,可能会报错。根据错误信息寻找解决方案。

 

java9个任务部分是把大项目包含的部分拆解成小项目。小项目再拆解,提出工程要求。

 

 

另外我在任务二收到留言:

你可以记录一下项目中代码的耗时,然后思考一下,如果一个请求很慢,它的时间可能会被耗费在哪里?我觉得你的的基础很好,你可以多多思考,任务为什么要这样设置,它的目的是什么?还有为什么要知道响应时间的分布情况

 

我的回复是:

知道响应时间的分布情况,有利定位问题,定位问题才能解决问题。

 

耗费的时间有前端,一般很快。网络传输,虽然这个问题一般没有,但是一旦有,很可能就是很明显的慢。服务器上代码的各种原因的时间延时是值得考虑的,各种原因慢。

 

项目代码耗时有部分从web服务器看,有部分从负载均衡负责的服务器看。我的任务1,2用的student的代码本来有AOP的内容,before after round,用AOP看也可以。我看后面有任务强制使用AOP,然后我把AOP删了。

 

 

抽像和具像互相变换不容易。

计算机科学专业本科的必修课有高等数学等等理工科都必修的课程,不提。C语言被谭浩强统治的恐惧。其它突出的必修课计算机组成原理,数据库,算法与数据结构,操作系统,数据通信与计算机网络,Linux这些课程有考试,拿到的分数有高有低。学完之后,不知道以后做什么工作。

 

关于任务为什么要这样设置,它的目的是什么?”。对于计算机科学类专业的本科生,以我身边为例,任务2-3是课程设计可能需要的要求。任务3-5的要求是毕业设计需要的要求,任务6-9是毕业设计选做要求。

 

搜狐工作流程好。我的缺点是葡萄藤老大突出的优点,葡萄藤公司有很多能让我提升的地方。期待面对面的交流。



二,今天问题

劳动最光荣


三,今天的收获

总结。展望。


四,明天的计划

任务3



返回列表 返回列表
评论

    分享到