Skip to content

top constraint

雷霹雳的爸爸 edited this page Aug 29, 2018 · 27 revisions

顶层约束

  • 对http response body的约定
    • 不包含任何自定义状态码
    • http 状态码200时,返回json内容格式有两种
      • 单个记录{"content":{"name":"Taylor Swift"}}
      • 集合内容
        {
          "content":{
            "resultList":[{"name":"Taylor Swift"},{"name":"Maroon 5"}],
            "total":100,
            "pageNum":1,
            "pageSize":10
          }
        }
        
    • http 状态码4xx或5xx时,返回json内容格式
      • 形如:{"error":"this is a error message detail"}
  • 分页请求参数为pageSize和pageNum,分别表示每页记录数和请求第几页,不传缺省为10和1
  • 需要传token的接口,token 值放置在Authorization 头部,形如以下dump 的HTTP请求头 Authorization 段
       GET /v1/resource HTTP/1.1
       Host: server.example.com
       Authorization: Bearer 1bf6d543d6cc95c25eb88d88c60b406d
    
  • http 请求如果有 body ,则请求头部的 content-type 为 application/json
  • POST method 的 http 请求,目前除租户别名tenant外所有参数均放置在body里面,租户别名放query_string,例如:瑞尔租户别名arrail,形如
       POST /v1/users?tenant=arrail HTTP/1.1
       Host: server.example.com
       Authorization: Bearer 1bf6d543d6cc95c25eb88d88c60b406d
    
       {"name":"Taylor Swift"}
    
  • 必选参数
    • token
    • 其他的,平台、租户后台、租户前台(业务)三个产品根据实际需要而定,比如
      • 租户无论前台后台,都必须给出租户别名,即所有请求都需要确定请求的哪一个租户,参数名为tenant,这个参数gateway要识别,不能放入body当中,否则效率太低,需要通过query_string(或自定义头部,这里暂不采用)

多租户相关内容的特别强调

  • 【强制】每一个涉及特定租户功能的web接口都会验证参数tenant,指明是操作的哪一个租户,根据接口功能确定是否强制要求给出机构标识

SCM

  • VCS 使用 git
  • 构建管理使用 maven
  • 如有二方库管理需求,使用git submodule进行管理,即不以任何方式导入maven中心库没有的jar包
    • 严控二方库(跨服务使用的组件)的产生
      • 不重复造轮子,是否有三方库(maven中心库中有)可以满足需要
      • 当有这样的需求产生时,首先考虑是否设计内聚性出现了问题
      • 多个服务序列化通信时的value对象,可以考虑冗余声明,同时使用lombok等方式减少不必要的代码量
    • git submodule管理二方库的参考 to be continue
  • IDL式的组件,版本仓库中仅保留IDL源文件,代码生成依赖 maven

后端架构

  • 要求整体架构使用前后端分离的方式实现
  • 后端使用微服务架构风格进行设计
    • 各服务选用Spring Boot来做项目基础框架
    • 使用 Spring Cloud Eureka 做注册中心
    • 和认证系统对接使用OAuth2协议
    • 服务对外认证由网关层统一处理
  • 根据业务关联性纵向拆分服务,对于服务及服务间关系的有如下设计层面的指导性原则:
    • 每个服务按需来选用自己的持久化存储基础设施,基础设施选型可包含不限于以下选型:MySQL,MongoDB,Neo4j等,但同一类型的存储不要选择多个,比如关系型数据库,不要同一个工程中同时使用MySQL和PostgreSQL
    • 每个服务按项目初始的开发人员最大产能习惯或倾向性来选择持久层框架,但不要在一个项目中使用多个持久层框架
    • 必须做到仅通过api调用来访问其他服务管理的私有数据
    • 可以为提高效率在不同的服务中做数据冗余设计(持久的,或缓存的),但禁止直接访问其他服务的私有持久化存储地址(不共享存储)
    • 服务间调用可以使用Feign
    • 服务间如有异步调用使用消息中间件选用和kafka或RabbitMQ
      • kafka和RabbitMQ的选用原则,OLTP相关推荐是RabbitMQ,OLAP场景选择kafka

关系数据库

  • 每个服务的数据库都要支持多租户多机构数据共享存储:
    • 【强制】所有要按租户进行区分的数据表均增加tenant_id字段或有关系表记录与tenant_id关系且tenant_id不能为空
    • 【强制】和机构有关的,需增加 organization_id 字段或有关系表记录与organization_id关系且不能为空

Java 编码

  • Java版本固定为8,目前不要使用9和10的任何特性
  • Java服务开发时,需要的类库版本如果包含在Spring Boot 2.x.x.RELEASE中,则以boot的 BOM 为准,不要再另行声明版本号,这方面如有特殊需要,请文档注明
  • 其他方面参考Java编程风格指南文档

组件版本

  • Spring Boot 2.x.x.RELEASE
    • 即确认大版本号是2,确定是Release版,项目使用Spring Cloud组件则使用Spring Boot Initializer生成(后续增量添加时如果不确定,可以用Spring Boot的Initializer来辅助处理pom dependency变化),依赖Spring Boot的BOM声明
  • Redis 3.2.12
  • MySQL 5.7.x
  • Kafka 0.11.0.2
  • RabbitMQ 3.7.6

Clone this wiki locally