我们的项目是一个纯后台服务的项目,也就是没有前端页面,只对外提供服务;项目是是基于 Spring Boot 来做的,引入 spring-boot-starter-web,直接对外暴露接口,报文使用的 JSON,有极个别的接口是从老系统迁移过来的,为了让调用方尽可能地稍作修改,所以保持了 XML 的报文;在正式的生产环境中,也是使用的内置的 Tomcat;集成了 Swagger,来做接口的文档在线自动生成。

Java开发框架

ORM 框架选择的是 MyBatis,由于项目中大部分的查询都做到了单表查询,而且查询条件比较固定,所以直接使用注解做的 SQL 语句绑定。

因为项目不仅使用了关系型数据库,而更多的数据是加工关联后保存到了 MongoDB 中,所以项目也用到了 Spring Data MongoDB,我们的 MongoDB 是做了副本集的部署,使用 Spring Data MongoDB,只需要做简单的配置,就可以完成对多台 MongoDB 的访问,如果其中一台 MongoDB 挂了,对服务也是没有影响的,所以我们做 MongoDB 扩容的时候是可以在线做的(MongoDB 扩内存和 CPU 的时候需要停机)。

Java开发框架

和部分系统的交互使用到了 RabbitMQ,而 Spring Boot 只要引入 spring-boot-starter-amqp,其实就可以很方便地完成和 RabbitMQ 的集成;生产者和消费者都非常方便。

因为是纯接口的服务,为了减轻数据库的压力,所以我们根据业务场景,将一些接口的结果直接缓存到 Redis 中(数据变化不频繁,并且业务场景的实时性要求不是很高)。在集成 Redis 的时候,我们前后试了两种方式:

  • Spring Boot 项目,直接使用 @Cacheable 注解就可以完成和 Redis 最简单的集成,但是后来因为设置缓存的超时时间不够灵活,我们后来改成了第二种方案;

  • 使用 RedisTemplate,可以完成对 Redis 的绝大部分操作。