作为一名Java程序猿,“沟通需求”、“设计数据库”、“建表”以及“编码开发”是家常便饭的事,每天几乎都得重复性干这样的活,有的甚至还乐此不彼!(当然啦,前提是钱给到位了~~);但若要问起他们对什么东西相当敏感、甚至偶尔还会出现反感的话,那当属Bug和一些疑难杂症 无疑了!而如何在线上生产环境快速定位、排查以及诊断相应的Bug、解决相应的疑难杂症便成为了一个值得探讨的话题,话不多说,咱们直接进入正文!!!
先不绕弯子,咱们直接先说答案吧:借助Alibaba开源的Java诊断工具Arthas可以快速直观地定位、排查、诊断生产环境中的Bug;
这时候就有小伙伴可能会问了,这家伙是啥玩意?怎么就可以快速定位、排查、诊断生产环境的Bug?它在实际生产环境中又是怎么用的呢?能不能来点实际的啊?……
别急啊,容debug娓娓道来………先说说Arthas是啥玩意吧:
这家伙是“Alibaba开源的Java应用线上诊断工具,深受开发者喜爱”,这是Arthas的官方定义,enenen……这丫的也太短了吧………,算了,大道至简,这丝毫不影响debug对它的爱慕,感兴趣的小伙伴可以点击其开源地址:
附注:有些小伙伴可能访问不了github,没关系,点击第(2)个链接,那是debug专门为大伙儿找的对应的码云的地址;
接下来,我们来看一下Arthas可以解决什么样的问题?直接看官网的介绍吧:
毋庸置疑,这是一款强大而且好用的线上诊断工具,若用得好,相信可以干掉许多线上生产环境的疑难杂症,特别是在前后端分离开发、部署的模式下,诸如 快速定位前端传递的参数、查看接口返回的结果、查看接口执行的方法路径及其对应的耗时、监控整个Java应用的内存/CPU等指标的占用等情况,在Arthas面前可以说是小菜一碟
那么在实际生产环境中该如何使用呢?还是来点实际的吧:
(1)这里我们以Linux环境中部署的“程序员实战基地 fightjava.com” 的课程中心 板块的接口为案例,一同学习并实战Arthas在实际生产环境中的使用;其中这个接口的方法所在的全限定类名为:
com.debug.coding.fight.server.controller.web.IndexCourseController.center()
对应的完整的代码如下所示:
@RestController
public class IndexCourseController extends IndexWebAbstractController{
private static final Logger log= LoggerFactory.getLogger(IndexCourseController.class);
//首页课程中心
@RequestMapping(value = prefix + "/center", method = RequestMethod.GET)
public BaseResponse center(@Validated IndexCourseQuery query, BindingResult result){
if (result.hasErrors() || query.getPageNo() <= 0 || query.getPageSize() <= 0) {
return new BaseResponse(StatusCode.InvalidParams);
}
BaseResponse response = new BaseResponse(StatusCode.Success);
try {
//其中indexCourseService.indexCourseCenter(query)为具体执行的代码逻辑
response.setData(indexCourseService.indexCourseCenter(query));
} catch (Exception e) {
return new BaseResponse(StatusCode.Fail.getCode(), e.getMessage());
}
return response;
}
}
其中,该方法的请求参数为IndexCourseQuery,其定义如下所示:
@Data
@ToString
public class IndexCourseQuery implements Serializable {
@NotNull
private Integer pageNo=1;
@NotNull
private Integer pageSize=Constant.COURSE_CENTER_PAGE_SIZE;
private String search;
private Integer typeId;
}
而响应结果是塞到BaseResponse类中的,其结果是indexCourseService服务类调用indexCourseCenter()方法返回的,类型为:Map<String, Object>,里面有许多核心数据,在这里就不贴出来了,大伙儿可以访问程序员实战基地 然后,点击课程中心,F12即可看到请求接口链接后返回的响应结果:
(2)OK,介绍了那么多,可能有些小伙伴有疑惑“这跟Arthas有啥关系?” 实不相瞒,还真有关系,因为debug将以这个板块、接口为案例,基于Linux环境查看整个Java应用的资源分配情况、接口调用的入参、接口返回的结果、接口方法调用的路径及其对应的耗时………那就直接来吧!