Arganzheng's Blog

stay hungry, stay foolish

怎样获取form-data方式POST的数据

昨天君仔问我说遇到一个诡异的问题,他有一个controller方法,用x-www-form-urlencoded方式提交表单就可以正常绑定数据,但是用form-data方式提交就绑定不了: @Controller @RequestMapping("/tag") public class TagController { @Autowired private NanTianMenFacade nanTianMenFacade; @RequestMapping(value = "/uploadTags") @ResponseBody public TagUploadResult uploadTags(TagParams par...

高可用分布式缓存系统

需求 由于Redis的单线程模型,我们需要对Redis进行多实例部署,然后采用一致性哈希进行负载均衡。但是一致性哈希只是解决增加节点的影响范围,不能做到实时的主从自动切换。而我们知道Redis是支持主从同步,同时提供了sentinel支持主从自动切换的。能不能在一致性哈希的基础上对每个节点增加主从自动切换呢,并且这一切都对客户端透明呢? 设计 实现 Redis的Java客户端一般是Jedis,不过它不能同时支持Shareded和Sentinel,只能自己封装一个了。 package me.arganzheng.study.server.dataaccess.cache.jedis; import java.util.ArrayList; import...

记一次Redis错误排查经历

日志集中式监控平台上线已经有一段时间,但是大部分情况下只是作为发布或者出问题时查看日志的便利工具使用。平时大家都不怎么主动上去看看。于是前几天把应用的错误日志也加上邮件、Hi和短信报警,马上就收到很多错误报警,引起了大家的重视。其中有一个Redis报错: Push notify error: => redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool at redis.clients.util.Pool.getResource(Pool.java:53) at redis.clients.jedis.JedisPool....

Spring的Bean生命周期和扩展点

Bean扩展点 1、JSR-250注解(推荐方式) @PostConstruct @PreDestroy 2、实现Spring接口 InitializingBean: afterPropertiesSet() DisposableBean: destroy() 3、XML配置 init-method, default-init-method destroy-method, default-destroy-method 容器扩展点 1、Customizing beans using a BeanPostProcessor BeanPostProcessor提供了一个机制让你可以修改创建的Bean实例,比如AOP,比...

Tomcat调优

Tomcat有线程池的概念,比如下面这个配置: <?xml version='1.0' encoding='utf-8'?> <Server port="8005" shutdown="SHUTDOWN"> <!--APR library loader. Documentation at /docs/apr.html --> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <!-- Prevent memory leaks due to use of particular j...

记一次MySQL主从同步错误处理

其实MySQL主从同步错误已经出现过好几次了,每次处理完都没有整理,今天恰好又出现了一次,花点时间记录一下,方便下次操作。 问题 今天早上收到报警短信,说印尼的一台机器home目录快爆满了,登上去看了一下,发现是一个应用的日志文件超级大,有好几百G。查看了一下日志内容,发现都是”Too many open file”错误。用ulimit -a查看,发现open files只有默认的65536,太小了。于是参考这篇文章——Increase “Open Files Limit”,提高文件句柄数: 1、修改 /etc/security/limits.conf: * hard nofile 5000000 * soft...

Metric监控系统

背景 对系统运行中的一些情况进行统一上报,监控,统计和展示。允许业务自定义监控项。有助于了解系统的运行情况,如性能,访问频率,Cache命中率等。 实现 具体参见笔者写的另一篇文章:java服务端监控平台设计 使用 首先需要配置pom.xml,引入monitor-client包: <dependency> <groupId>com.baidu.global.mobile.server.monitor.client</groupId> <artifactId>monitor-client</artifactId> <version>1.0.0</version> &l...

java服务端监控平台设计

需求 功能性监控(availability):我们希望能够及时的发现线上的bug,异常。 性能监控与调优(performance):我们希望能够识别可能的性能瓶颈,并且有数据支撑方便对性能进行调优。比如慢速SQL,缓存命中率,链接池等。 预警报警:我们希望能够第一时间收到线上异常,进行处理。 辅助线上故障定位、故障分析 运维支持:我们系统能够有数据支撑我们进行容量规划、报警和扩容,等。 自动化运维:比如自动扩容;或者根据监控的数据和配置的SLA进行服务降级。等等。 性能监控平台 提供一站式的性能数据收集、计算、存储和展示服务 支持自定义的数据指标名称和数据纬度 提供任意指标任意纬度的实时数据查询 监控对象 1、模...

Java Attach API

Dynamic Loading Agent 前面在介绍JMX的时候说过应用通过MBean来统计监控数据,然后注册到MBeanServer。但是一个MBeanServer要被外部系统访问得到,还需要通过一个Connector将自己暴露出去,大部分实现都是基于RMI。 从Java 5开始JVM的细节是通过PlatformMBeanServer暴露出去的。而PlatformMBeanServer是通过JDK_HOME/lib/management-agent.jar这个Agent完成RMI的Connector暴露的。将其作为Agent的方式是为了能够让外部监控程序(如JConsole和VisualVM)可以根据需要使用Attach API让目标JVM动态创建这个Con...

JMX学习

关于JMX JMX 全称是 Java Management Extensions, Java5.0开始引入,提供连接、监控和管理远程JVM的方式。 MBean 一个MBean是一个被管理的Java对象,有点类似于JavaBean,一个设备、一个应用或者任何资源都可以被表示为MBean,MBean会暴露一个接口对外,这个接口可以读取或者写入一些对象中的属性,通常一个MBean需要定义一个接口,以MBean结尾,例如:DataSourceMBean, 格式为XXXMBean,这个是规范,必须得遵守。 MBeanServer MBean的容器,提供远程访问、命名空间管理和安全服务。 JMX 指定了在 MBeanServer 和 JMX 客户之间通信所使用的协议...

×