前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Arthas查看Spring配置

Arthas查看Spring配置

作者头像
GreizLiao
发布2019-11-01 15:01:42
3.8K0
发布2019-11-01 15:01:42
举报
文章被收录于专栏:足球是圆的

在开发过程经常有同学问:“我这个配置更新提交了,怎么样知道项目中是否已经更新使用新值?” 常用的方法是添加日志打印该值判断是否更新。今天我们用Arthas来实现项目中配置值实时读取。

Arthas 简介

Arthas 是Alibaba开源的Java诊断工具。使用 Arthas 可以很方便帮助我们排查线上问题。下面简单介绍几个常用的命令以及使用的场景。

  • jad 命令反编译指定已加载类的源码。在代码修改了不生效,怀疑代码没有部署时可以通过该命令查看源码。
  • thread 命令查看当前线程信息,线程的堆栈。线程池线程爆满时用该命令查看阻塞线程;CPU使用率过高用该命令查看占用CPU最高的线程。
  • jvm 命令查看当前JVM信息。查看使用什么垃圾回收算法、线程数和阻塞线程数等。
  • watch 命令方法执行数据观测。观察方法入参和返回值,或者报错信息等。
  • trace 命令方法内部调用路径,并输出方法路径上的每个节点上耗时。查看方法内部调用所有的接口和每个接口对应的耗时,这个可以很好的掌控接口性能质量。
  • tt 命令记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测。需要重现某个问题时,需要前端同学配合点击,用这个命令可以代替前端同学,回放之前的请求。
  • getstatic 命令可以查看类的静态属性。
  • ognl 命令可以查看类的静态属性,并且可以做很多不可以描述的事情!

上面的命令是作为开发经常使用到的,具体怎么样使用Arthas请看官网。

OGNL窃取SpringContext属性

假设大家都知道 SpringBoot 读取配置之后存在 ConfigurableApplicationContext 的 environment 中。如果有不知道的,可以在 PropertySourceBootstrapConfiguration#initialize 方法里打个断点debug调试一波?。下面用一个例子操作一波。

步骤一

application.properties文件中添加 author=Greiz 键值对。

步骤二

想办法拿到项目中 ApplicationContext 对象。ognl只获取静态属性,所以我们一般需要查找项目中是否存在静态的ApplicationContext对象。这里面我就自己创建了一个类来提供静态的ApplicationContext。

代码语言:javascript
复制
package com.greiz.demo.config;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class ConfigHandler implements InitializingBean, ApplicationContextAware {
    private static ApplicationContext applicationContext;
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println(applicationContext.getEnvironment().getProperty("author"));
    }
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        ConfigHandler.applicationContext = applicationContext;
    }
}

这种方式是不是到处可见。如果用Dubbo的,Dubbo框架里com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory 持有静态的 ApplicationContext 对象。

步骤三

使用ognl获取静态 ApplicationContext 属性。

代码语言:javascript
复制
ognl '#context=@com.greiz.demo.config.ConfigHandler@applicationContext,#context.getEnvironment().getProperty("author")'

逗号之前是获取 ApplicationContext 对象并赋值给 context。逗号后面的获取 Environment 对象中的属性。这个 "author" 属性就是application.properties 配置的,也可以是远程的配置文件。

对应的结果

其实只要获取到ApplicationContext 对象,我们就可以对Spring容器为所欲为了,比如下面不知耻辱的行为:

代码语言:javascript
复制
@Component
public class Greiz {

    @Value("${userName}")
    private String name;
    @Value("${userAge}")
    private Integer age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
}

可以获取Spring容器的所有bean,然后调用对应的方法。

总结

熟悉Arthas 工具常用命令;了解配置最终所保存的对象;提供静态属性的 ApplicationContext 对象;ognl获取Spring容器钥匙ApplicationContext,然后做你们想做的事。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-10-31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Arthas 简介
  • OGNL窃取SpringContext属性
    • 步骤一
      • 步骤二
        • 步骤三
        • 总结
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档