Bistoury
是去哪儿网开源的一个对应用透明,无侵入的java应用诊断工具,用于提升开发人员的诊断效率和能力,可以让开发人员无需登录机器或修改系统,就可以从日志、内存、线程、类信息、调试、机器和系统属性等各个方面对应用进行诊断,提升开发人员诊断问题的效率和能力。
Bistoury
集成了Alibaba开源的arthas和唯品会开源的vjtools,因此arthas和vjtools相关功能都可以在Bistoury
中使用。
Arthas和vjtools通过命令行或类似的方式使用,Bistoury在保留命令行界面的基础上,还对很多命令提供了图形化界面,方面用户使用。
Bistoury
英文解释是外科手术刀,含义也就不言而喻了。
通过命令行界面查看日志,使用arthas和vjtools的各项功能
Bistoury核心组件包含agent,proxy,ui:
一次命令执行的数据流向为 ui -> proxy -> agent -> proxy -> ui
具体分析一下:
具体参见 https://github.com/qunarcorp/bistoury/blob/master/docs/cn/design/design.md
bistoury原理分析: https://www.jianshu.com/p/f7202e490156
总结下就是使用类似skywalking那样的agent技术,来监测和协助运行在JVM上的程序。
官方有一个快速开始文档: https://github.com/qunarcorp/bistoury/blob/master/docs/cn/quick_start.md
可以下载release包快速启动,就可以体验了。
首先我们将快速启动包 bistoury-quick-start.tar.gz 拷贝到想要安装的位置。
然后解压启动包:
tar -zxvf bistoury-quick-start.tar.gz
cd bistoury
最后是启动 Bistoury,因为 Bistoury 会用到 jstack 等操作,为了保证所有功能可用,需要使用和待诊断 JAVA 应用相同的用户启动。
假设应用进程 id 为 1024
Copy./quick_start.sh -p 1024 start
sudo -u tomcat ./quick_start.sh -p 1024 start
./quick_start.sh stop
官方的git仓库里,有一个docker分支,翻阅后找到相关文档。
官方的快速启动命令:
#!/bin/bash
#创建网络
echo "start create network"
docker network create --subnet=172.19.0.0/16 bistoury
#mysql 镜像
echo "start run mysql image"
docker run --name mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -d -i --net bistoury --ip 172.19.0.7 registry.cn-hangzhou.aliyuncs.com/bistoury/bistoury-db
#zk 镜像
echo "start run zk image"
docker run -d -p 2181:2181 -it --net bistoury --ip 172.19.0.2 registry.cn-hangzhou.aliyuncs.com/bistoury/zk:latest
sleep 30
#proxy 镜像
echo "start run proxy module"
docker run -d -p 9880:9880 -p 9881:9881 -p 9090:9090 -i --net bistoury --ip 172.19.0.3 registry.cn-hangzhou.aliyuncs.com/bistoury/bistoury-proxy --real-ip $1 --zk-address 172.19.0.2:2181 --proxy-jdbc-url jdbc:mysql://172.19.0.7:3306/bistoury
#ui 镜像
echo "start run ui module"
docker run -p 9091:9091 -it -d --net bistoury --ip 172.19.0.4 registry.cn-hangzhou.aliyuncs.com/bistoury/bistoury-ui --zk-address 172.19.0.2:2181 --ui-jdbc-url jdbc:mysql://172.19.0.7:3306/bistoury
#boot 镜像
echo "start run demo application"
docker run -it -d -p 8686:8686 -i --net bistoury --ip 172.19.0.5 registry.cn-hangzhou.aliyuncs.com/bistoury/bistoury-demo --proxy-host $1:9090
docker run -it -d -p 8687:8686 -i --net bistoury --ip 172.19.0.6 registry.cn-hangzhou.aliyuncs.com/bistoury/bistoury-demo --proxy-host $1:9090
上面的命令不能直接运行,$1
是需要替换成当前服务器IP,然后再运行就OK了。
官方推荐部署方式:
这里有个关键的点,应用中心,Bistoury内置了一个简单的应用中心,Bistoury里代码对应bistoury-application,ui和proxy都通过这个工程获取应用信息,官方默认实现了一个mysql版本的:
使用mysql的缺点是,你需要ui界面里手动维护应用以及应用的服务器,做个demo还OK,生产环境肯定不行。更优雅的方式是,用户系统应该在启动时自动注册到注册中心上,汇报自己的应用、机器信息(ip、域名等)、端口等信息。当然这个对大部分微服务架构来说,注册中心是标配的,因此实现一套bistoury-application-api接口即可。
我们项目组所有的应用都部署在K8S环境,因此要实现一个bistoury-application-k8s
。
拷贝bistoury-application-mysql
项目,建立bistoury-application-k8s
简单对应下:
所以,我们只需要调用调用K8S API 获取deployment和pod即可。
首先引入相关jar包:
<dependency>
<groupId>io.kubernetesgroupId>
<artifactId>client-javaartifactId>
<version>8.0.0version>
<scope>compilescope>
dependency>
初始化ApiClient
ApiClient defaultClient = Configuration.getDefaultApiClient();
defaultClient.setBasePath(k8sApiServer);
ApiKeyAuth BearerToken = (ApiKeyAuth) defaultClient.getAuthentication("BearerToken");
BearerToken.setApiKey(k8sToken);
BearerToken.setApiKeyPrefix("Bearer");
defaultClient.setVerifyingSsl(false);
<