Arganzheng's Blog

stay hungry, stay foolish

Spring Java-based配置

Spring目前为止支持如下三种配置方式: XML-based configuration: Spring 1.0 Annotation-based configuration (with component scanning): Spring 2.0 Java-based configuration Spring 3.0 这里探讨一下第三种方式:Java-based c...

如何实现一个配置中心

问题 服务一般有很多依赖配置,例如访问数据库有连接字符串配置,连接池大小和连接超时配置,这些配置在不同环境(开发/测试/生产)一般不同,比如生产环境需要配连接池,而开发测试环境可能不配,另外有些参数配置在运行期可能还要动态调整,例如,运行时根据流量状况动态调整限流和熔断阀值。 传统配置文件方式虽然把配置项分离到单独的配置文件,但是修改一个配置项,需要提交版本管理,发布,重启。整个过程比较...

如何单元测试二方库

问题 为了模块化,我们需要将通用的模块拆分出来,作为一个单独的二方库,在多个工程中引用。比如product-biz, product-dataaccess等。这些模块一般会使用到其他框架,比如Spring,mybatis,并且可能还有一些配置项根据不同的工程有不同的配置,所有这些依赖(配置文件和配置项)一般都是在引用方提供,然后整个工程才能够跑起来。这样会带来一个严重的问题,就是这些二方库...

JS跨域问题及解决方案

问题 Same-origin policy Same-origin policy(SOP): 只有当两个资源同源的时候,浏览器才允许他们之间的脚本互相访问,包括请求各自的服务端,修改DOM结构和读取cookies,localStorage等。 源(origin): 一个页面的源(origin)是由三部分(triple)组成的 {protocol, host, port}。 当且只当这个...

Java8时间处理

用Java处理过时间的基本都会有一个感觉,就是麻烦,甚至恶心。 老的Java 时间API的核心类和方法比较少,如下: System.currentTimeMillis(): static method that returns the current date and time as milliseconds since January 1st 1970. java.util....

input too large for RSA cipher

自从我们的某些接口用上加密解密后,总是会收到如下错误报警: 2015-10-22 16:41:23,453 [WARN] [catalina-exec-178] me.arganzheng.study.nantianmen.utils.ParamsHelper (ParamsHelper.java:132): Can not get decrypted params. encryptedP...

MIME和编码学习笔记

Base64 所谓Base64,就是说从ASCII码中选出64个字符—-大写字母A-Z、小写字母a-z、数字0-9、符号”+”、”/”(再加上作为填充字符的”=”,实际上是65个字符),作为一个基本字符集。然后,其他所有符号都转换成这个字符集中的字符。 具体来说,转换方式可以分为四步: 将每3个字节作为一组,一共是24个二进制位: 3x8=24 将这24个二进制位分为4组,每...

分布式文件系统选型和预研

背景 候选DFS MooseFS FastDFS TFS Hi all, 背景 我们目前有接近3.5kw的文件数,总体容量是800GB的样子,平均文件大小是二三十KB的样子。主要是图片、HTML文件等小文件。走CDN之后,QPS大概是二三十的样子。目前我们的静态资源是部署在BPC的私有云平台NFS上。该平台主要是支持大文件,对单机文件数量有比较大的限制(单机100w...

MySQL主从同步学习

原理 如下图所示: Master将binlog推送给每个连接上来的slave Slave的IO线程将Master发送过来的binlog写入到本地的Relay log日志文件 Slave的SQL线程读取relay log日志,apply里面的变更 具体可以参见:How does MySQL Replication really work?,非常深入浅出的一篇文章。 ...

Quartz的misfire机制

Quartz在如下情况下可能没有办法按时执行job: 所有的worker线程都处于忙碌状态(可能在执行更高优先级的任务) Quartz scheduler挂掉了 这个任务的开始执行时间就是在过去(可能是创建时候配置错了) org.quartz.jobStore.misfireThreshold (in milliseconds), 默认是60000ms(也就是1min)....