软件架构里的矛盾法则

“话说天下大势,分久必合,合久必分”。分与合是事物发展的一般规律。分带来的问题要用合的方法去解决,合带来的问题要用分的方法去解决。事物分与合的矛盾决定了它的发展。这是矛盾法则的基本原理。

阅读全文〉

基于Canal使用HTTP协议跨机房公网同步数据

前提

MySQL数据库自带基于binlog的主从复制功能,在内网中实现数据备份、读写分离是比较容易的。但是,在跨机房环境下通过公网如此同步数据就会存在一些困难:

  • 安全性:直接在公网上暴露3306端口显然存在安全性问题
  • 网络稳定性:公网的网络抖动是常态,长连接难以维持
  • 配置复杂:在TCP协议上一个端口只能暴露一个服务实例,在互联网出口上需要配置一堆不同的端口映射至不同的数据库服务器
  • 扩展性:基于binlong的数据复制,无法实现数据过滤、转换
阅读全文〉

RabbitMQ拉模式批量消费消息

实现RabbitMQ的消费者有两种模式,推模式(Push)和拉模式(Pull)。

实现推模式推荐的方式是继承DefaultConsumer基类,也可以使用Spring AMQP的SimpleMessageListenerContainer

推模式是最常用的,但是有些情况下推模式并不适用的,比如说:

  • 由于某些限制,消费者在某个条件成立时才能消费消息
  • 需要批量拉取消息进行处理
阅读全文〉

Maven偶现本地仓库jar存在仍然从远程仓库拉取且失败的现象

问题现象

使用Maven过程中,曾经出现过本地仓库中已经存在某jar包,但是Maven仍然从远程仓库下载jar包的现象,并且可能会报出类似以下的错误:

1
2
[exec] [ERROR]   The project com.acme:test:0.0.1-SNAPSHOT (/home/acme/pom.xml) has 1 error
[exec] [ERROR] Non-resolvable parent POM: Failure to find com.acme.maven:parent-pom:pom:2 in http://repo.maven.apache.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced and 'parent.relativePath' points at no local POM @ line 5, column 13 -> [Help 2]
阅读全文〉

Spring Boot自定义配置属性源(PropertySource)

配置覆盖优于profile

在生产实践中,配置覆盖是解决不同环境不同配置的常用方法。比如用生产服务器上的配置文件覆盖包内的文件,或者使用中心化的配置服务来覆盖默认的业务配置。

相比于profile机制(比如maven的profile、spring boot的profile-specific properties),即不同环境使用不同的配置文件,覆盖的方式更有优势。程序员在开发时不需要关心生产环境数据库的地址、账号等信息,一次构建即可在不同环境中运行,而profile机制需要将生产环境的配置写到项目资源文件中,而且要为不同环境使用不同的构建参数或者运行参数。

Spring提供了灵活的配置扩展能力,有多种方式将自定义的属性源,将集成进来,可以轻松地实现配置覆盖。

阅读全文〉

使用Hessian传输BigDecimal值为0的问题

问题现象

使用Hessian作为RPC框架传输数据,发现消费者收到的BigDecimal字段为0,而实际提供者返回的值非0。

解决方案

在消费者和提供者模块的src/main/resource/META-INF/hessian下:

增加serializers文件支持序列化

1
java.math.BigDecimal=com.caucho.hessian.io.StringValueSerializer

增加deserializers文件支持反序列化

1
java.math.BigDecimal=com.caucho.hessian.io.BigDecimalDeserializer
阅读全文〉