统一微服务开发平台

统一微服务开发平台

概述

统一微服务开发平台, 下面简称 USP

本文主要描述了如何设计基于 Node.js/Express/MongoDB 技术栈的统一微服务开发平台,以及如何基于其开放微服务

后期将通过 golang 重写来优化部分核心服务的性能

REST API

USP 使用 express 做为 Web 框架,提供统一的 REST 风格接口,供应用和其他业务模块调用

API 路由定义:

src/routes/xxx.js

公共方法:

src/common/express/restify.js

数据持久化 (orm)

USP 使用 mongoose 作为 ORM 框架实现数据持久化即增删改查的功能

Schema 定义:

src/models/xxx.js

公共方法:

src/models/common.js src/common/express/curd.js

数据类型转换

对 API 接收到的参数进行解析以及相应的转换

记录修改结果

记录修改过的属性

exports.set = function (document, data)

返回有改变的属性

对象转换

对要返回的对象进行转换

批量导入

实现批量导入功能

exports.import = async function (model, documents, companyId, callback)

本地化 (locale)

USP 支持多语言,可根据客户端支持的语言选择并返回相应的语言的消息

多语言资源文件

多语言中间件

src/common/express/locale.js

locals 变量

错误码 (code)

USP 要求在服务调用出现错误时,返回统一的格式的错误消息

ErrorMessage

统一错误消息对象

{
    code: Number,
    error: String,
    message: String
}

USP 定义了一些常用的错误类型

引入模块:

const CODE = require('../common/express/code');

使用内置的错误类型:

res.send(CODE.ObjectNotExists);

认证和权限 (auth)

支持 Session 和 API-Key 两种认证方式

公共方法:

src/common/express/auth.js

公共 API 接口:

src/routes/auth.js

远程过程调用 (rpc)

支持微服务之间 API 接口相互调用:

公共方法:

src/common/express/rpc.js

控制台页面 (views)

控制台页面主要用来查询和管理平台资源,主要供管理员使用

公共路由:

src/routes/views.js

公共静态资源文件:

public/css/ public/data/ public/images/ public/libs/ public/script/

视图模板文件:

views/common/xxx.html views/xxx.html

页面结构

组件

顶部导航栏 (app-header)

header.app-header

image-20200824154755137

组件结构

<header class="app-header">
  <div class="nav-header-left">
    <a class="icon-button"></a>
    <a class="header-brand"></a>
    <nav class="nav-header-menu"></nav>
  </div>
  <div class="nav-header-right">
    <a class="icon-button"></a>
  </div>
</header>

左侧导航栏 (sidebar)

nav.sidebar

image-20200824154911777

组件结构

<nav class="sidebar">
  <section class="sidebar-header"></section>
  <section class="sidebar-body">
    <div class="sidebar-title"></div>
    <ul class="sidebar-menu">
      <li class="opened">
        <a></a>
        <ul class="sub">
          <li></li>
        </ul>
      </li>
    </ul>
  </section>
</nav>

左侧二级导航栏 (left-navbar)

nav.left-navbar

组件结构

<nav class="left-navbar">
  <header class="navbar-header">
    <div class="navbar-header-searchbar"></div>
  </header>
  <div class="navbar-list">
    <div class="navbar-list-header"></div>
    <ul class="navbar-list-body">
      <li class="navbar-item"></li>
    </ul>
  </div>
</nav>

二级导航栏 (navbar)

nav.navbar

image-20200824154947927

组件结构

<nav class="navbar navbar-light">
  <span class="navbar-brand"></span>
  <ul class="navbar-tab"></ul>
  <div class="navbar-right">
    <button class="btn"></button>
  </div>
</nav>
选项栏

ul.navbar-tab

image-20200824155307714

组件结构

<ul class="navbar-tab">
  <li class="nav-item active">
    <a class="nav-link"></a>
  </li>
  <li class="nav-item"></li>
</ul>

表格列表 (table)

div.table-responsive

image-20200824155055342

组件结构

<div class="table-responsive">
  <div class="bootstrap-table">
    <div class="fixed-table-toolbar">
      <div class="bs-bars">
        <form id="bootstrap-table-toolbar"></form>
      </div>
      <div class="columns columns-right"></div>
    </div>
    <div class="fixed-table-container">
      <div class="fixed-table-header"></div>
      <div class="fixed-table-body">
        <div class="fixed-table-loading"></div>
        <table class="table"></table>
      </div>
      <div class="fixed-table-footer"></div>
    </div>
    <div class="fixed-table-pagination">
      <div class="pagination-detail"></div>
      <div class="pagination"></div>
    </div>
  </div>
</div>

右侧侧边栏 (right-sidebar)

section.right-sidebar

image-20200824155152290

组件结构

<section class="right-sidebar">
  <div class="right-sidebar">
    <button class="close"></button>
    <h3></h3>
  </div>
  <div class="right-body"></div>
</section>

弹出对话框 (modal)

section.modal

image-20200824155229091

组件结构

<section class="modal">
  <div class="modal-dialog">
    <form class="modal-content">
      <div class="modal-header">
        <h4></h4>
        <button class="close"></button>
      </div>
      <div class="modal-body"></div>
      <div class="modal-footer"></div>
    </form>
  </div>
</section>

数据看板

main.dashboard-main

组件结构

<main class="main dashboard-main">
  <div class="dashboard-header"></div>
  <div class="row">
    <div class="col col-xxx">
      <div class="row m-0">
        <div class="col col-xxx">
          <section class="section-block"></section>
        </div>
      </div>
    </div>
  </div>
</main>

dashboard-header

div.dashboard-header

image-20200824155334513

组件结构

<div>
  <div class="dashboard-header-left"><h1></h1><p></p></div>
  <div class="dashboard-header-right"></div>
</div>

section-block

section.section-block

image-20200824155359122

组件结构

<section class="section-block">
  <h2></h2>
  <div class="section-body"></div>
</section>

API

服务

测试

API 功能性测试

兼容性测试

性能测试

安全测试