Java
文章平均质量分 92
横云断岭
在国内大型互联网公司负责6K+应用,80K+机器的Spring Boot微服务技术落地,关注开发体验,微服务,APM,应用诊断,dubbo开源。
Github: https://github.com/hengyunabc
展开
-
Android 的WebView使用CookieManager崩溃的问题
应用里,如果用户退出登陆了,而WebView里还没有退出登陆,这就有点蛋疼了。所以在用户退出时,要清除WebView的Cookie。但是据说调用CookieManager应用可能会崩溃。先来看下微信是怎么做的,反编绎了下微信的apk,发现是这样的:private void a(Activity paramActivity, String[] paramArrayOfString){原创 2014-07-03 20:18:39 · 8150 阅读 · 1 评论 -
HBase数据同步到ElasticSearch的方案
ElasticSearch的River机制ElasticSearch自身提供了一个River机制,用于同步数据。这里可以找到官方目前推荐的River:http://www.elasticsearch.org/guide/en/elasticsearch/rivers/current/但是官方没有提供HBase的River。其实ES的River非常简单,就是一个用户打包好的j原创 2014-11-15 16:22:11 · 32799 阅读 · 5 评论 -
zookeeper运维
尽管zookeeper在编程上有很多的阱陷,API也非常的难用,但zookeeper服务本身可以说是很牢靠的了,所以在网上貌似关于运维的文章比较少。但省心并不代表不会出麻烦,下面总结下zookeeper运维相关的东东。重要的参考资料这里有一个很好的Pdf,介绍了很多zookeeper的东东,作者是zookeeper的committer之一:http://www.infoq.com/p...原创 2014-02-09 15:06:37 · 89590 阅读 · 3 评论 -
Memcached 二进制协议(BinaryProtocol) incr指令泄露内存数据的bug
缘起最近有个分布式限速的需求。支付宝的接口双11只允许每秒调用10次。单机的限速,自然是用google guava的RateLimiter。http://docs.guava-libraries.googlecode.com/git-history/master/javadoc/com/google/common/util/concurrent/RateLimiter.html原创 2014-11-07 20:19:14 · 5742 阅读 · 2 评论 -
解决ActiveMQ的“Invalid broker URI”异常的历程
最近碰到一个问题,把解决的过程记录下来。故障原因同事的应用上线,Tomcat无法正常启动。抛出这样的异常:org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:|PropertyAccessException 1: org.springframewo原创 2014-11-07 18:46:34 · 13236 阅读 · 0 评论 -
zookeeper 大量连接断开重连原因排查
问题现象最后发现线上的zookeeper的日志zookeeper.out 文件居然有6G,后来设置下日志为滚动输出,参考:http://blog.csdn.net/hengyunabc/article/details/19006911但是改了之后,发现一天的日志量就是100多M,滚动日志一天就被冲掉了,这个不科学。再仔细查看下日志里的内容,发现有很多连接建立好,马上又断开:...原创 2014-11-24 19:56:41 · 160114 阅读 · 19 评论 -
kafka web console安装
貌似很多小伙伴都不能成功打包,共享下之前打包的文件:http://pan.baidu.com/s/1sjkE37J ========kafka自己居然没有还一个Web管理界面。。这里有个第三方的: https://github.com/claudemamo/kafka-web-console坑爹的是居然没有详细的安装步骤,只有一些简单的说明,对于不熟悉scala pla...原创 2014-10-24 19:15:37 · 23155 阅读 · 7 评论 -
netstat统计的tcp连接数与⁄proc⁄pid⁄fd下socket类型fd数量不一致的分析
新blog地址:http://hengyunabc.github.io/netstat-difference-proc-fd-socket-stat/最近,线上一个应用,发现socket数缓慢增长,并且不回收,超过警告线之后,被运维监控自动重启了。首先到zabbix上观察JVM历史记录,发现JVM-Perm space最近两周没有数据,猜测是程序从JDK7切换到JDK8了。问过开发人员之后,程序已经原创 2015-02-17 11:15:26 · 15337 阅读 · 1 评论 -
基于dropwizard/metrics ,kafka,zabbix构建应用统计数据收集展示系统
新blog地址:http://hengyunabc.github.io/about-metrics/想要实现的功能应用可以用少量的代码,实现统计某类数据的功能统计的数据可以很方便地展示metricsmetrics,按字面意思是度量,指标。举具体的例子来说,一个web服务器: - 一分钟内请求多少次? - 平均请求耗时多长? - 最长请求时间? - 某个方法的被调用次数,时长?以缓存为例原创 2015-03-05 23:13:47 · 11169 阅读 · 0 评论 -
Java中的几个HashMap/ConcurrentHashMap实现分析
一、HashMap,即java.util.HashMap标准链地址法实现。这个不用多解析,下图十分明了。(图片来自网络)二、Collections.synchronizedMap() 函数返回的线程安全的HashMap这个的实现比较简单。代码中有: private final Map m; // Backing Map final Object原创 2012-04-10 01:31:33 · 8999 阅读 · 5 评论 -
Kryo简介及代码阅读笔记
更新:2012-08-01版本 2.16长时间运行可能会导致OOM,版本2.18有bug,不能正确序列化map和collection。真是悲剧,所用的每一个版本都有bug。不过从代码来看,作者有时的确比较随便。。测试用例也少。。(比起msgpack少多了)========================================Kryo官方网站:https://code.go...原创 2012-07-19 19:07:49 · 36390 阅读 · 1 评论 -
tomcat ssi配置及升级导致ssi include错误问题解决
最近tomcat升级版本时,遇到了ssi解析的问题,记录下解决的过程,还有tomcat ssi配置的要点。tomcat 配置SSI的两种方式Tomcat有两种方式支持SSI:Servlet和Filter。SSIServlet通过Servlet,org.apache.catalina.ssi.SSIServlet,默认处理”*.shtml”的URL。配置方式:修改tomcat的 conf/web.xm原创 2015-04-15 19:19:05 · 7198 阅读 · 0 评论 -
扯谈spring mvc之WebApplicationContext的继承关系
spring mvc里的root/child WebApplicationContext的继承关系在传统的spring mvc程序里会有两个WebApplicationContext,一个是parent,从applicationContext.xml里加载的,一个是child,从servlet-context.xml里加载的。 两者是继承关系,child WebApplicationContext原创 2015-07-26 22:01:39 · 11595 阅读 · 0 评论 -
开源全局配置中心XDiamond
项目地址: https://github.com/hengyunabc/xdiamond简介全局配置中心,存储应用的配置项,解决配置混乱分散的问题。名字来源于淘宝的开源项目diamond,前面加上一个字母X以示区别。wiki设计思路在线演示地址:xdiamond.coding.io,登陆选择standard,用户名密码:admin/admin特性所见即所得,在管理界面上看到的所有配置即项目运行时的原创 2015-08-19 11:16:00 · 26643 阅读 · 4 评论 -
扯谈下XA事务
普通事务普通事务的实现是比较好理解的。以jdbm3为例,大概是这样的过程:每个事务都新建一个事务文件,当commit时,先把修改过的数据块,写到事务文件里,然后再一次性地写到数据库文件里。如果commit时挂掉了,那么重启之后,会再次从事务文件里把修改过的块写到数据库文件里。最后再删除事务文件。https://github.com/jankotek/JDBM3 但是XA事务...原创 2014-02-20 21:34:19 · 21747 阅读 · 2 评论 -
禁止JVM执行外部命令Runtime.exec -- 由Apache Commons Collections漏洞引发的思考
Apache Commons Collections远程代码执行漏洞最近出来一个比较严重的漏洞,在使用了Apache Commons Collections的Java应用,可以远程代码执行。包括最新版的WebLogic、WebSphere、JBoss、Jenkins、OpenNMS这些大名鼎鼎的Java应用。这个漏洞的严重的地方在于,即使你的代码里没有使用到Apache Commons Collec原创 2015-11-13 20:40:42 · 9099 阅读 · 2 评论 -
利用github搭建个人maven仓库
缘起之前看到有开源项目用了github来做maven仓库,寻思自己也做一个。研究了下,记录下。简单来说,共有三步:deploy到本地目录把本地目录提交到gtihub上配置github地址为仓库地址配置local file maven仓库deploy到本地maven可以通过http, ftp, ssh等deploy到远程服务器,也可以deploy到本地文件系统里。例如: <distribut原创 2015-08-06 02:53:54 · 23386 阅读 · 4 评论 -
spring boot executable jar/war 原理
spring boot executable jar/warspring boot里其实不仅可以直接以 java -jar demo.jar的方式启动,还可以把jar/war变为一个可以执行的脚本来启动,比如./demo.jar。把这个executable jar/war 链接到/etc/init.d下面,还可以变为linux下的一个service。只要在spring boot maven plug原创 2016-04-03 14:24:11 · 12301 阅读 · 1 评论 -
spring boot应用启动原理分析
spring boot quick start在spring boot里,很吸引人的一个特性是可以直接把应用打包成为一个jar/war,然后这个jar/war是可以直接启动的,不需要另外配置一个Web Server。如果之前没有使用过spring boot可以通过下面的demo来感受下。 下面以这个工程为例,演示如何启动Spring boot项目:git clone git@github.com:原创 2015-11-30 22:36:38 · 188442 阅读 · 11 评论 -
从java进程里dump出类的class文件的小工具--dumpclass
Serviceability Agent想要查看一些被增强过的类的字节码,或者一些AOP框架的生成类,就需要dump出运行时的java进程里的字节码。从运行的java进程里dump出运行中的类的class文件的方法,所知道的有两种用agent attatch 到进程,然后利用Instrumentation和ClassFileTransformer就可以获取 到类的字节码了。使用sd-jdi.ja原创 2016-04-09 19:50:04 · 10570 阅读 · 0 评论 -
详细分析罕见的ClassCircularityError异常导致的StackOverflowError
先打一个广告。greys是一个很不错的java诊断工具:https://github.com/oldmanpushcart/greys-anatomy最近尝试用greys来实时统计jvm里的异常生成数量,在增强Throwable时,发现应用会抛出StackOverflowError。下面记录详细的分析过程。在真正分析之前,先介绍JVM对反射方法调用的优化和greys的工作原理。JVM对反射方法调用的原创 2016-04-10 13:11:46 · 9031 阅读 · 1 评论 -
Java的LockSupport.park()实现分析
LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语。LockSupport实际上是调用了Unsafe类里的函数,归结到Unsafe里,只有两个函数: public native void unpark(Thread jthread); public native void park(boolean isAbsolute, long ti原创 2014-06-03 02:52:12 · 49919 阅读 · 17 评论 -
正确实现用spring扫描自定义的annotation
在使用spring时,有时候有会有一些自定义annotation的需求,比如一些Listener的回调函数。比如:@Servicepublic class MyService { @MyListener public void onMessage(Message msg){ }}一开始的时候,我是在Spring的ContextRefreshedEvent事件里,通过c原创 2016-05-01 14:07:04 · 19192 阅读 · 3 评论 -
在Java里处理文件的技巧
update: 2016-8-4从URL转换为File的方法:1. 先判断URL是否是 file: 开头的2. 用new File(url.toURI()); 来转换为File注意,因为url当有空格时,会被转义为%20,所以要转换为URL,再转为File。另外要注意处理这个转义时不能使用URLDecoder。参考:http://stackoverflow.com/a/17870390写这篇B...原创 2014-04-19 21:05:52 · 21572 阅读 · 0 评论 -
查找本地进程的jmx url的代码
好久没写blog了,先来篇充充数。。当想用JMX连接本地进程,而这个进程又没有配置JMX相关的参数,怎样才能连到这个进程?下面的代码是从ActiveMQ的代码里抠出来的,可以得到本地进程的jmx url。不过当目标进程配置了-Djava.io.tmpdir 参数时,不能正常工作,原因是JDK的bug。参考:http://dikar.iteye.com/blog/1415原创 2013-06-08 02:53:59 · 3825 阅读 · 0 评论 -
深入Spring Boot:那些注入不了的Spring占位符(${}表达式)
Spring里的占位符spring里的占位符通常表现的形式是:<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource"> <property name="url" value="${jdbc.url}"/></bean>或者@Configuration@Impo原创 2017-07-20 00:54:07 · 15517 阅读 · 0 评论 -
深入Spring Boot:ClassLoader的继承关系和影响
前言对spring boot本身启动原理的分析,请参考:http://hengyunabc.github.io/spring-boot-application-start-analysis/Spring boot里的ClassLoader继承关系可以运行下面提供的demo,分别在不同的场景下运行,可以知道不同场景下的Spring boot应用的ClassLoader继承关系。https://gith原创 2017-08-19 16:31:31 · 9767 阅读 · 5 评论 -
深入Spring Boot:Spring Context的继承关系和影响
前言对于一个简单的Spring boot应用,它的spring context是只会有一个。非web spring boot应用,context是AnnotationConfigApplicationContextweb spring boot应用,context是AnnotationConfigEmbeddedWebApplicationContextAnnotationConfigEmbe原创 2017-08-21 20:36:05 · 8063 阅读 · 0 评论 -
深入Spring Boot:怎样排查expected single matching bean but found 2的异常
写在前面这个demo来说明怎么排查一个常见的spring expected single matching bean but found 2的异常。https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-expected-single调试排查 expected single matching bean but found 2原创 2017-12-09 22:12:59 · 81558 阅读 · 4 评论 -
深入Spring Boot:怎样排查 Cannot determine embedded database driver class for database type NONE
写在前面这个demo来说明怎么一步步排查一个常见的spring boot AutoConfiguration的错误。调试排查 Cannot determine embedded database driver class for database type NONE 的错误把工程导入IDE里,直接启动应用,抛出来的异常信息是:Error starting ApplicationContext. T原创 2017-12-09 22:10:19 · 89481 阅读 · 19 评论 -
深入Spring Boot:排查@Transactional引起的NullPointerException
写在前面这个demo来说明怎么排查一个@Transactional引起的NullPointerException。https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-Transactional-NullPointerException定位 NullPointerException 的代码Demo是一个简单的spring事原创 2017-12-14 19:37:02 · 4434 阅读 · 3 评论 -
深入Spring Boot: 怎样排查 java.lang.ArrayStoreException
java.lang.ArrayStoreException 分析这个demo来说明怎样排查一个spring boot 1应用升级到spring boot 2时可能出现的java.lang.ArrayStoreException。demo地址:https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-ArrayStor...原创 2018-03-07 19:12:25 · 24449 阅读 · 4 评论 -
深入Spring Boot:实现对Fat Jar jsp的支持
spring boot 对于jsp支持的限制对于jsp的支持,Spring Boot官方只支持了war的打包方式,不支持fat jar。参考官方文档: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-web-applications.html#boot-feature...原创 2018-05-16 19:48:13 · 1193 阅读 · 1 评论 -
优化技巧:提前if判断帮助CPU分支预测
分支预测在stackoverflow上有一个非常有名的问题:[为什么处理有序数组要比非有序数组快?]( https://stackoverflow.com/questions/11227809/why-is-it-faster-to-process-a-sorted-array-than-an-unsorted-array),可见分支预测对代码运行效率有非常大的影响。现代CPU都支持分支...原创 2018-05-16 20:05:18 · 2601 阅读 · 1 评论 -
深入Spring Boot:快速集成Dubbo + Hystrix
背景Hystrix 旨在通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix具备拥有回退机制和断路器功能的线程和信号隔离,请求缓存和请求打包,以及监控和配置等功能。Dubbo是Alibaba开源的,目前国内最流行的java rpc框架。本文介绍在spring应用里,怎么把Dubbo和Hystrix结合起来使用。https://git...原创 2018-06-14 15:07:31 · 5583 阅读 · 2 评论 -
从JVM heap dump里查找没有关闭文件的引用
背景最近排查一个文件没有关闭的问题,记录一下。哪些文件没有关闭是比较容易找到的,查看进程的fd(File Descriptor)就可以。但是确定fd是在哪里被打开,在哪里被引用的就复杂点,特别是在没有重启应用的情况下。 在JVM里可以通过heap dump比较方便地反查对象的引用,从而找到泄露的代码。以下面简单的demo为例,Demo会创建一个临时文件,并且没有close掉:...原创 2018-07-02 02:03:00 · 1370 阅读 · 0 评论 -
Kotlin里的Extension Functions实现原理分析
Kotlin里的Extension FunctionsKotlin里有所谓的扩展函数(Extension Functions),支持给现有的java类增加函数。https://kotlinlang.org/docs/reference/extensions.html比如给String增加一个hello函数,可以这样子写:fun String.hello(world : St...原创 2018-07-24 01:40:20 · 1480 阅读 · 0 评论 -
思考gRPC :为什么是HTTP/2
背景gRPC是google开源的高性能跨语言的RPC方案。gRPC的设计目标是在任何环境下运行,支持可插拔的负载均衡,跟踪,运行状况检查和身份验证。它不仅支持数据中心内部和跨数据中心的服务调用,它也适用于分布式计算的最后一公里,将设备,移动应用程序和浏览器连接到后端服务。https://grpc.io/https://github.com/grpc/grpcGRPC设计的动机...原创 2018-07-19 18:55:50 · 19103 阅读 · 5 评论 -
思考gRPC :为什么是protobuf
背景谈到RPC,就避免不了序列化的话题。gRPC默认的序列化方式是protobuf,原因很简单,因为两者都是google发明的,哈哈。在当初Google开源protobuf时,很多人就期待是否能把RPC的实现也一起开源出来。没想到最终出来的是gRPC,终于补全了这一块。跨语言的序列化方案事实上的跨语言序列化方案只有三个: protobuf, thrift, json。...原创 2018-07-19 18:59:22 · 4706 阅读 · 0 评论 -
OpenJDK里的AsmTools简介
前言https://wiki.openjdk.java.net/display/CodeTools/asmtools 在OpenJDK里有一个AsmTools项目,用来生成正确的或者不正确的java .class文件,主要用来测试和验证。我们知道直接修改.class文件是很麻烦的,虽然有一些图形界面的工具,但还是很麻烦。以前我的办法是用ASMifier从.class文件生成as...原创 2018-07-19 21:04:08 · 5636 阅读 · 0 评论