jm-server

micro server using jm-ms

Usage no npm install needed!

<script type="module">
  import jmServer from 'https://cdn.skypack.dev/jm-server';
</script>

README

微服务器 jm-server

micro server using jm-ms

why

  • 微服务架构把传统单体应用拆分为多个小应用

  • 应用一般会包含配置、通讯、日志和一些公共服务,每个小应用都重复去实现这些部分没有必要,也不利于以后的维护和扩展。

目标

  • 作为一个微服务器框架,帮助开发者把精力集中在服务及路由的开发,而不必关注底层的实现。
  • 采用模块化设计,开发者可以把多个微服务集中在一个单体应用中部署,从而兼容传统的软件开发模式。可合可分,非常灵活。

features

  • 模块化设计

  • 路由式编程模式 基于 jm-ms

  • 支持多协议 http、ws

  • 支持代理转发 proxy

install

npm i -g jm-server

use:

// 控制台启动
jm-server -h
// or
jms -h

// 代码中启动
require('jm-server/bin/app')

工作原理

  • 读取配置文件中的模块配置 modules

  • 逐一加载模块

模块化

  • 开发者的任务是开发和配置模块
  • 模块分为两种:标准模块和代理模块

标准模块

  • 标准模块包含两个基本部分,服务和路由,路由是可选的
  • 服务器加载模块时,如果模块中包含 router 函数,自动启用路由,即约定式路由

模块例子,无路由

module.exports = function(opts) {
    const service = {
        version: '1.0.0',

        hello: function() {
            return 'hello'
        }
    }
    return service
}

模块例子,有路由

const MS = require('jm-ms-core');
const ms = new MS();

// 定义router
const router = function () {
    var service = this; // 这里通过this可以获得service示例
    var router = ms.router()

    // 定义一条路由
    router.add('/help', 'get', opts => {
        return {
            version: service.version,
            hello: service.hello()
        }
    })

    return router
}

module.exports = function(opts) {
    const service = {
        version: '1.0.0',

        hello: function() {
            return 'hello'
        }
    }

    //router 可选
    service.router = router

    return service
}

标准模块配置

{
    key: {
        prefix: '前缀', // 可选,如果不配置,默认用 '/key'
        module: 'jm-ms-message', // 模块名或者模块路径
        jsonpath: '$.a.b', // 可选,以jm-ms-message.a.b作为实际模块,用于模块库里有多个模块时指定其中一个模块
        config: {}
    }
}

代理模块

  • 把来自客户端的请求转发给其他服务器处理,再把结果返回客户端
  • proxy 路由转发,只支持 application/json
  • httpProxy 直接转发,没有限制

proxy 配置

  • 优点:基于 jm-ms, 支持路由过滤
  • 缺点:只支持 application/json
{
    key: {
      prefix: '前缀',
      proxy: 'http://localhost/config' // 路由转发
    }
}

httpProxy 配置

作为 proxy 的补充,无法用 proxy 实现时才使用

{
    key: {
      prefix: '前缀',
      changeOrigin: false, // 是否跨域
      httpProxy: 'http://localhost/config', // 直接转发
    }

}

配置

配置参数支持2种方式。

  • 通过配置文件 config/index.js。
  • 通过环境变量,主要是为了方便Docker化部署。

主要配置项

配置项 默认值 描述
debug false 是否打开调试模式
port 3000 监听端口
host '0.0.0.0' 监听的IP地址
prefix Uri前缀
trust_proxy false 是否传递IP地址
lng 语言
max_body_size '100kb' 设置允许请求的body的大小, 例如 '5mb'

其他配置项

maxcpus 只支持环境变量设置, 默认全部

配置项 默认值 描述
maxcpus cluster模式cpu数量
no_auto_init false 是否禁止自动初始化,
no_auto_open false 是否禁止自动监听

配置例子

config/index.js

module.exports = {
  port: 80, // 端口
  // ....
  modules: { // 模块配置
    '': { // key, 模块唯一标识
      module: 'jm-ms-message', // 模块名或者模块路径
      prefix: uri_prefix // 默认为key
      config: {}  // 可选, 模块配置, 默认采用全局配置
    },
    config: {
      module: process.cwd() + '/lib' // 模块路径
    },
    oms: {
      proxy: 'http://localhost/oms' // 路由转发
    },
    pay: {
      httpProxy: 'http://localhost', // 直接转发, 注意实际请求地址为 http://localhos/pay
      prefix: '/pay'
    }
  }
}