微服务架构下,解决数据库跨库查询的一些思路
一、 表字段冗余
冗余字段不能太多,建议控制在2-4个左右;否则会出现数据更新不一致问题,一旦冗余字段有改动,极容易产生脏数据;建立同步机制,必要时采取人工补偿措施。
二、聚合服务封装查询
简单来说,就是把不同服务的数据统一组装在一个新的服务里做聚合,对外提供统一入口API接口查询。 聚合服务的数据组装是以API接口调用来实现,一般不建议直连数据库连表查询。这样做的好处是减少服务间调用次数以及查询库表压力。 在实际的业务开发中,我们经常碰到类似的需求,而聚合服务不失为一种较彻底的服务解耦实现方式。
三、表视图查询
如果涉及到不同数据库表之间的join查询,可以在其中某一数据库的表上建立视图(view)关系,这种方式非常高效,只需要开发一个简单接口对外提供服务就可以了,而且省去聚合服务带来调用、查询、聚合的复杂性。
前提条件 数据库需要部署在同一台服务器上 数据库账户密码必须相同,也就是在同一个schema下
另外表视图查询这种方式,是一种紧耦合的设计方式,不利于程序扩展,除非你很确定将来业务变动不大,可以考虑使用。以笔者经验来看,不适合大规模使用。
四、多数据源查询
这种方式是一种比较技术化的思路,简单来说就是一个微服务配置多个数据库源(DataSource),进行数据源来回切换进行库表查询,以达到获取不同数据的目的。
实现思路 利用DynamicDataSource 利用Spring的AOP动态切换数据源
利用Spring的依赖注入方式管理Bean数据源对象
五、分库分表:使用数据库中间件