五天前,张大胖负责的开发团队向运维部门交付了一批新代码,这是一次用户期待已久的重要升级,部署进行得非常顺利,大家都很高兴。
可是今天生产环境的CPU持续接近100%,有好几台服务器都down机了, 运维老大勃然大怒:“已经是第三次了! 张大胖,你们开发团队怎么搞的? 新代码一上线CPU就100%!”
张大胖自然也不甘示弱:“我们在测试环境测试得非常充分,用户压力比生产环境大多了,代码坚如磐石,肯定是你们配置错了什么东西!”
“不可能,我们是严格按照你们要求的步骤来部署的,肯定是你们代码的问题!”
“那测试环境怎么就没有问题?”
......
--------节选自 http://mp.weixin.qq.com/s/l6mPQIkjLNERrBn41wA3xA
除了devOps的自动化部署,保证了部署和配置的正确性后,如果代码有缺陷,程序员该如何背锅?
以下就是介绍利用intellj远程调试已部署在服务器上的程序
准备材料:
一个springboot项目
一个intellij
首先在pom包中加入一个插件
org.springframework.boot
spring-boot-maven-plugin
1.1.12.RELEASE
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5003
该项放在了
若在你的项目中,事先有了 一个springbootmavenplugin,可能会提示这样的错误:
什么鬼?
那好吧,我去修改一下
将
其中需要注意的是这一段配置:
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5003
具体这句话什么意思我就不说了,重点是address=5003,这个5003就是你的自定义远程监听端口
好了,接下来,clean&install Maven Project
生成jar包,你的第一步就完成了。
第二步,配置intellij为远程调试状态。
编辑启动项
添加一个remote启动项
编辑host的localhost和port为你所需要远程调试的地址,和刚刚配置好的5003(默认端口是5005,由于我本人的原因,试端口到了5003)
这里改成你的项目(我不清楚不选会有什么问题发生)
点击ok
第二步完成。
接下来就是在linux上运行刚刚部署好的jar包,注意,代码是这样的:
java -jar -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=5003,suspend=n instruments20180203.jar
其中5003是我刚刚自定义监听的端口,instruments20180203.jar是我build好的jar包的名字,该jar包在当前目录下
运行该代码,你会发现可能会有一种“端口被占用”的错误,其一是你的jar包占用的端口,我的项目端口是8080,其二是你监听的端口被占用,我的是5003
此时两个选择,1,换一个端口,2,kill端口
推荐换端口,如果你不知道占用端口是什么程序的话
由于我知道我现在占用的就是我之前运行的java程序,所以我选择kill
lsof -i:端口号
kill -9 PID
解决端口占用问题后就再来一次
已在5003端口监听
项目启动成功
然后点击绿色小bug进行远程bug调试吧!
什么!connect reset!!这是什么错!!!
(注意:改成5005是为了演示错误信息)
在我第一次尝试远程调试的时候就因为这个原因而无法进行远程调试,当我百度,bing,博客园,,stackOverflow等等任何可以让我知道我该怎么办的地方发现都找不到 为什么会出现这个报错,我一怒之下放弃了远程调试
第二天,部署的同学告诉我,没有开放5003端口,我才知道,哦~原来不开放端口就不能用啊!(还是基础不够扎实,这点都不知道)
第二天晚上,我申请了5003的端口
重复我以上的步骤之后,在浏览器中输入我的测试服务器的地址,然后intellij在相应的地方打断点,浏览器操作一番,成功卡在了断点上!