发表于: 2021-05-01 16:19:55
4 1217
一,今天完成的事情
任务二深度思考41-51。任务二小结。
1,Shell既是一种命令语言,又是一种程序设计语言(就是你所说的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
#tomcat中webapps中文件
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 ---同时部署service和web
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 "同时部署service和web,successful!"
else
echo "请输入一个正确参数:service web both"
fi
43.如果有多个WEB服务,都把WEB服务都配置在一个容器里,还是一个WEB配置一个容器,他们的差别是什么,你觉得哪种方式更好?
1,如果有多个容器,配置多个容器比一个容器好。如果全部在一个容器,只要此容器有问题,会影响全部web服务。配置多个容器,稳定性提高,但是对服务器的资源的要求要高,成本增加。
2,我已经有多个容器,所以配备到多个容器中。
44.Resin/tomcat/jetty等WEB容器的内存大小,一般应该设置多大合适,怎么估算WEB程度占用内存的大小?
1,需要评估服务器运行什么应用?需要支持多少用户访问?需要多大空间来存储数据?Web服务器内存的选择标准主要根据网站的流量而定,对于一般的企业站或者小型网站,服务器的内存通常选择2G就可以了,但是随着网站流量的增加,建议将网站升级到4G或者8G,8G内存基本能够满足访问量上万的需求了。
2,通常一个请求分配的空间都在eden区域,eden区域满的时候会发生Young GC.所以有了GC的时间间隔,比如2s,进一步通过QPS数量*2就知道了多少此请求把内存沾满。
RamUsageEstimator根据java对象在堆内存中的存储格式,通过计算Java对象头、实例数据、引用等的大小,相加而得,如果有引用,还能递归计算引用对象的大小。
通过请求,对象能估算WEB服务器占用内存大小情况。
45.jetty,resin,tomcat的常见配置有哪些,内存,端口,日志文件都怎么配置?
1,1)jetty的配置文件的root元素。<Configure id="Server" class="org.mortbay.jetty.Server">
2)tomcat,server.xml:主要的配置文件。
web.xml:缺省的web app配置,WEB-INF/web.xml会覆盖该配置。
context.xml:不清楚跟server.xml里面的context是否有关系。
3)resin和其它2个服务器也常常会配置日志,内存,端口
2,1)Jetty默认使用8080端口,要让它使用其他端口(如7070),那么编辑start.d(Wondows系统是start.ini文件),找到jetty.http.port行,修改为:
## Connector port to listen on
jetty.http.port=7070
保存并退出,再重启Jetty。
配置日志后,可以再次启动Jetty,并可以查看到日志模块是激活了的。
2)Tomcat.
(1)配置内存大小
修改bin/catalina.bat中的set CATALINA_OPTS=-Xms64m -Xmx128m。
Xms指最小内存,Xmx指最大内存
(2)server.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,tomcat和jetty:1)架构比较
Jetty的架构比Tomcat的更为简单
Jetty的架构是基于Handler来实现的,主要的扩展功能都可以用Handler来实现,扩展简单。
Tomcat的架构是基于容器设计的,进行扩展是需要了解Tomcat的整体设计结构,不易扩展。
2)性能比较
Jetty和Tomcat性能方面差异不大
Jetty可以同时处理大量连接而且可以长时间保持连接,适合于web聊天应用等等。
Jetty的架构简单,因此作为服务器,Jetty可以按需加载组件,减少不需要的组件,减少了服务器内存开销,从而提高服务器性能。
Jetty默认采用NIO结束在处理I/O请求上更占优势,在处理静态资源时,性能较高
少数非常繁忙;Tomcat适合处理少数非常繁忙的链接,也就是说链接生命周期短的话,Tomcat的总体性能更高。
Tomcat默认采用BIO处理I/O请求,在处理静态资源时,性能较差。
3)其它比较
Jetty的应用更加快速,修改简单,对新的Servlet规范的支持较好。
Tomcat目前应用比较广泛,对JavaEE和Servlet的支持更加全面,很多特性会直接集成进来。
2,tomcat和resin的区别
特征 | Tomcat | Resin |
用户数 | 多 | 少 |
可参考文档 | 多 | 少 |
部署环境启动 | 臃肿 | 人性化 |
开发环境热部署支持 | 较好,可根据需要配置。修改Jsp或java文件时,可配置是否重启服务 | 较差,更新class及jsp文件,系统都会自动重新部署,并重启,配置了Session会话时开发比较麻烦 |
生产环境下热部署支持 | 一般。更新配置文件时,必须手动重启。更新其他文件时,大部分不用重启。但一次性更新太多文件时,经常会造成Tomcat重启失败。 | 较好。更新配置文件时,Resin会自动重启。 |
集群部署 | 支持 | 支持 |
3,不同的服务器各有优劣,选择服务器时应该先参考项目,预估规模大小等。比如大规模的企业级应用,Tomcat自身扩展了大量JEE特性可满足企业级应用的需求, 所以这种情况下应选用Tomcat。
47.maven常用的打包插件有哪些?有什么区别?如何使用 ?
1,maven-assembly-plugin:maven-assembly-plugin的用途是制作项目分发包,该分发包可能包含了项目的可执行文件、源代码、readme、平台脚本等等。 maven-assembly-plugin支持各种主流的格式如zip、tar.gz、jar和war等,具体打包哪些文件是高度可控的,例如用户可以 按文件级别的粒度、文件集级别的粒度、模块级别的粒度、以及依赖级别的粒度控制打包,此外,包含和排除配置也是支持的。maven-assembly- plugin要求用户使用一个名为assembly.xml的元数据文件来表述打包,它的single目标可以直接在命令行调用,也可以被绑定至生命周期。
2,jetty-maven-plugin:jetty-maven-plugin完全兼容 Maven项目的目录结构,能够周期性地检查源文件,一旦发现变更后自动更新到内置的Jetty Web容器中。做一些基本配置后(例如Web应用的contextPath和自动扫描变更的时间间隔),你只要执行 mvn jetty:run ,然后在IDE中修改代码,代码经IDE自动编译后产生变更,再由jetty-maven-plugin侦测到后更新至Jetty容器,这时你就可以直接 测试Web页面了。
3,maven-jar-plugin: jar 与依赖分开打包,生成的 jar 包比较小,需要放在 lib 文件夹中运行。maven-jar-plugin用于生成META-INF/MANIFEST.MF文件的部分内容。只是生成MANIFEST.MF文件还不够,maven-dependency-plugin插件用于将依赖包拷贝到<outputDirectory>${project.build.directory}/lib</outputDirectory>指定的位置,即lib目录下。
4,maven-shade-plugin:所有的依赖放进同一个 jar 文件,可以直接运行
48.War包是什么,为什么WEB服务通常打出来的都是War包?除了War包,还有几种打包格式,他们之间的区别呢?
1,war 包是一种打包格式。
2,Java web工程,都是打成war包,进行发布,打成war包的好处是不会缺少目录,并且只管理好一个发布文件就好,并且tomcat服务器能够自动识别,将war包放在tomcat容器的webapps下,启动服务,即可运行该项目,该war包会自动解压出一个同名的文件夹。
3,
49.Put请求在Linux下的Tomcat或者是Resin中会收不到数据,怎么解决这个问题,原因是什么?为什么本地使用Jetty的时候往往是正常的?
1,Tomcat处理参数的问题原因:
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请求方法带参访问。
3,jetty,tomcat和resin容器在使用RequestParam注解处理PUT方法时的差异。POST方法在调用我们的handler之前都会从具体request中解析参数。但是,Tomcat中,PUT方法都无法解析为 MultipartRequest,这里为null;话句话说,PUT方法,不会解析body,直接返回。而jetty中能得到的ContentType是multipart/formdata。
50.Content-type中的数据类型,在Spring MVC中都怎么接收数据?
1,GET请求时是否定义Content-Type并无很大的影响,因为GET没有请求体,所有的数据都是通过url带过去,所以必须是"key=value"的格式,所以在springmvc端使用。@RequestParam String id这种格式即可,或者不写@RequestParam也可以,不写的话默认是@RequestParam
2,除GET外的这几种(POST、DELETE、PUT、PATCH)都是有请求体(body)的,且他们之间的差异不大:
3,当请求时定义Content-Type为application/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.什么是restful?rest的请求方法有哪些,有什么区别?
1,符合REST原则的架构方式即可称为RESTful。 REST全称是resource representational state,表现层状态转化,这不好理解,因此用另一句话概括:URL定位资源,用HTTP动词(GET,POST,DELETE,DETC)描述操作。
2,GET
get方法在Rest中主要用于获取资源,能够发送参数,不过有限制,且参数都会以?开头的形 式附加在URL尾部。
POST
post方法在Rest请求中主要用于添加资源,参数信息存放在请求报文的消息体中相对安全,且可发送较大信息。
但是,规范化的post方法处理器是不幂等的,因此如果用户重复对一个资源进行post应该在处理器中做出限制和处理保证对数据不造成破坏和更改 从而提高安全性.
PUT
put方法在Rest中主要用于更新资源,因为大多数浏览器不支持put和delete,会自动将put和delete请求转化为get和post. 因此为了使用put和delete方法,需要以post发送请求,在表单中使用隐藏域发送真正的请求。
put方法是幂等的,对同一URL资源做出的同一数据的任意次put请求其对数据的改变都是一致的。
DELETE
Delete在Rest请求中主要用于删除资源。Delete方法的参数同post一样存放在消息体中,具有安全性,可发送较大信息。Delete方法是幂等的,不论对同一个资源进行多少次delete请求都不会破坏数据。
任务二小结
任务二让程序与浏览器交互变成了可能。
首先设计CRUD的接口文档。这个工程需是Maven WEB工程。Spring Rest 编写对应的Controller,使用Json Tag-lib。
配置web服务器,包括Jetty,Resin,Tomcat。在Linux上这3个服务器有不同的部署方式,web服务器各自部署jar war包有不同方式。本地测试需要使用web服务器测试,也需要部署在云服务器上使用,能够正常运行。配置Resin,Tomcat,Jetty的Access.log,log命名有区别。列出请求的响应时间。使用top命令,kill命令。部署本地包到云服务器。
修改Resin的内存配置,测试最小启动的大小。启动后,用Resin自带的停止脚本停止服务。编写部署脚本到云服务器。测试云服务器上直接拿到GitHub代码后生成的war包在Resin上运行是否正常。配置Nginx和Resin一起后测试是否正常。
Postman测试各种接口。测试本地Controller。测试云服务器上部署脚本部署后是否能访问接口。测试有Service代码的接口,本地。使用Junit。服务器得到GitHub上的代码,测试部署是否成功。
使用Spring 返回JSON对象,@ResponseBody。使用多种方式从request接收参数,包括param和Http Body。
使用Spring messageSource。设计错误信息。
配置Nginx,配合Resin。
问题,困惑,疑难:
配置服务器,可能会报错。根据错误信息寻找解决方案。
java的9个任务部分是把大项目包含的部分拆解成小项目。小项目再拆解,提出工程要求。
另外我在任务二收到留言:
你可以记录一下项目中代码的耗时,然后思考一下,如果一个请求很慢,它的时间可能会被耗费在哪里?我觉得你的的基础很好,你可以多多思考,任务为什么要这样设置,它的目的是什么?还有为什么要知道响应时间的分布情况
我的回复是:
知道响应时间的分布情况,有利定位问题,定位问题才能解决问题。
耗费的时间有前端,一般很快。网络传输,虽然这个问题一般没有,但是一旦有,很可能就是很明显的慢。服务器上代码的各种原因的时间延时是值得考虑的,各种原因慢。
项目代码耗时有部分从web服务器看,有部分从负载均衡负责的服务器看。我的任务1,2用的student的代码本来有AOP的内容,before after round,用AOP看也可以。我看后面有任务强制使用AOP,然后我把AOP删了。
抽像和具像互相变换不容易。
计算机科学专业本科的必修课有高等数学等等理工科都必修的课程,不提。C语言被谭浩强统治的恐惧。其它突出的必修课计算机组成原理,数据库,算法与数据结构,操作系统,数据通信与计算机网络,Linux这些课程有考试,拿到的分数有高有低。学完之后,不知道以后做什么工作。
关于“任务为什么要这样设置,它的目的是什么?”。对于计算机科学类专业的本科生,以我身边为例,任务2-3是课程设计可能需要的要求。任务3-5的要求是毕业设计需要的要求,任务6-9是毕业设计选做要求。
搜狐工作流程好。我的缺点是葡萄藤老大突出的优点,葡萄藤公司有很多能让我提升的地方。期待面对面的交流。
二,今天问题
劳动最光荣
三,今天的收获
总结。展望。
四,明天的计划
任务3
评论