Java后端一般架构

Java后端一般架构

  • MVC框架:从十年前流行的Struts1、2到现在最为推崇的SpringMVC、Jersey以及国人开发的JFinal、阿里的WebX等等,这些框架尤其是后面流行的这些都是各有千秋的。选型的主要因素是看你的团队是否有一个对某框架能够做二次开发、定制的人在。很多时候,针对这些通用的框架,你是需要做一些特定的开发才能满足特定的需求的。比如,很多团队传递参数使用的都是UnderScore的命名法(下划线连接单词),但是Java中确是使用LowCamel命名的。对于SpringMVC,可以通过注解的alias来指定,但这样需要对每一个参数都要指定alias有点效率太低,此外ModelAttribute也不支持别名,更好的方式是在框架层面统一对参数做Camel命名的转换达到目的。
  • IOC框架:ioc带来的好处无须多言。目前Java中最为流行的Spring自诞生就天然支持IOC。
  • ORM框架:MyBatis是目前最为流行的orm框架。此外,Spring ORM中提供的JdbcTemplate也很不错。当然,对于分库分表、主从分离这些需求,一般就需要实现自己的ORM框架来支持了,像阿里的tddl。此外,为了在服务层面统一解决分库分表、主从分离、主备切换、缓存、故障恢复等问题,很多公司都是有自己的数据库中间件的,比如阿里的Cobar、360的Atlas、网易的DDB,还有官方提供的MySQL Proxy以及开源的MyCat、kingshard和收费的oneproxy。目前,线上有一定规模使用的应该是kingshard,当然如果不缺钱也可以上oneproxy。
  • 缓存框架:缓存框架主要指的是对redis、memcached这些缓存服务器的操作统一封装,一般使用Spring的RedisTemplate即可,也可以使用jedis做自己的封装,支持客户端分布式方案、主从等。
  • 性能检测框架:对于线上的JavaEE应用,需要有一个统一的框架集成到每一个业务中检测每一个请求、方法调用、jdbc连接、redis连接等的耗时、状态等。
  • 搜索引擎: 搜索引擎也是后端应用中一个很关键的组件,尤其是对内容类、电商类的应用,通过关键词、关键字搜索内容、商品是一个很常见的用户场景。比较成熟的开源搜索引擎有Solr和Elasticsearch,很多中小型互联网公司搜索引擎都是基于这两个开源系统搭建的。它们都是基于Lucence来实现的,不同之处主要在于termIndex的存储、分布式架构的支持等等。
  • 消息队列:软件的组织结构,从开始的面向组件到SOA、SAAS是一个逐渐演变的过程。而到了今天微服务盛行的时代,你都不好意思说自己的系统只是单一的一个系统而没有解耦成一个个service。当然,小的系统的确没有拆分的必要性,但一个复杂的系统拆成一个个service做微服务架构确实是不得不做的事情。那么问题就来了,service之间的通信如何来做呢?使用什么协议?通过什么方式调用?都是需要考虑的问题。
  • 文件存储: 不管是业务应用、依赖的后端服务还是其他的各种服务,最终还是要依赖于底层文件存储的。通常来说,文件存储需要满足的特性有:可靠性、容灾性、稳定性,即要保证存储的数据不会轻易丢失,即使发生故障也能够有回滚方案,也要保证高可用率。在底层可以采用传统的RAID作为解决方案,再上一层,目前hadoop的hdfs则是最为普遍的分布式文件存储方案,当然还有NFS、Samba这种共享文件系统也提供了简单的分布式存储的特性。
  • 统一认证中心: 统一认证中心,主要是对app用户、内部用户、app等的认证服务,包括
    用户的注册、登录验证、token鉴权
    内部信息系统用户的管理和登录鉴权
    App的管理,包括app的secret生成,app信息的验证(如验证接口签名)等。
    之所以需要统一认证中心,就是为了能够集中对这些所有app都会用到的信息进行管理,也给所有应用提供统一的认证服务。尤其是在有很多业务需要共享用户数据的时候,构建一个统一认证中心是非常必要的。此外,通过统一认证中心构建移动app的单点登录也是水到渠成的事情(模仿web的机制,将认证后的信息加密存储到本地磁盘中供多个app使用)。

SSO单点登录系统: 目前很多大的在线web网站都是有单点登录系统的,通俗的来说就是只需要一次用户登录,就能够进入多个业务应用(权限可以不相同),非常方便用户的操作。而在移动互联网公司中,内部的各种管理、信息系统同样也需要单点登录系统。目前,比较成熟的、用的最多的单点登录系统应该是耶鲁大学开源的CAS.

  • 统一配置中心: 在Java后端应用中,一种读写配置比较通用的方式就是将配置文件写在propeties、yaml、HCON文件中,修改的时候只需要更新文件重新部署即可,可以做到不牵扯代码层面改动的目的。统一配置中心,则是基于这种方式之上的统一对所有业务或者基础后端服务的相关配置文件进行管理的统一服务
  • 服务治理框架: 对于外部API调用或者客户端对后端api的访问,可以使用http协议或者说restful(当然也可以直接通过最原始的socket来调用)。但对于内部服务间的调用,一般都是通过RPC机制来调用的。目前主流的RPC协议有:
1
2
3
4
RMI
Hessian
Thrift
Dubbo

这些RPC协议各有优劣点,需要针对业务需求做出相应的最好的选择。

  • 统一调度中心: 在很多业务中,定时调度是一个非常普遍的场景,比如定时去抓取数据、定时刷新订单的状态等。通常的做法就是针对各自的业务依赖Linux的cron机制或者java中的quartz。统一调度中心则是对所有的调度任务进行管理,这样能够统一对调度集群进行调优、扩展、任务管理等。azkaban和oozie是hadoop的流式工作管理引擎,也可以作为统一调度中心来使用。当然,你也可以使用cron或者quartz来实现自己的统一调度中心。
    根据cron表达式调度任务
    动态修改、停止、删除任务
    支持任务工作流:比如一个任务完成之后再执行下一个任务
    任务支持脚本、代码、url等多种形式
    任务执行的日志记录、故障报警
    对于Java的quartz这里需要说明一下:这个quartz需要和spring quartz区分,后者是spring对quartz框架的简单实现也是目前使用的最多的一种调度方式。但是,其并没有做高可用集群的支持。而quartz虽然有集群的支持,但是配置起来非常复杂。现在很多方案都是使用zookeeper来实现spring quartz集群的。
  • 统一日志服务: 日志是开发过程必不可少的东西。有时候,打印日志的时机、技巧是很能体现出工程师编码水平的。毕竟,日志是线上服务能够定位、排查异常最为直接的信息。通常的,将日志分散在各个业务中非常不方便对问题的管理和排查。统一日志服务则使用单独的日志服务器记录日志,各个业务通过统一的日志框架将日志输出到日志服务器上。可以通过实现log4j后者logback的appender来实现统一日志框架,然后通过RPC调用将日志打印到日志服务器上。