Learn about our RFC process, Open RFC meetings & more.Join in the discussion! »

txk-mvc

1.0.92 • Public • Published

txk-mvc 一个基于NodeJs的MVC微服务框架

定义

txk-mvc是一个基于NodeJs的微服务MVC框架。 我的名字全拼是tangxuke,因此使用txk-mvc作为框架名字。

设计思想

txk-mvc框架用于快速开发一个具有基本MVC三层架构的微服务,利用此框架开发出来的微服务,可独立运行服务,也可以无缝注册到以此框架开发的微服务注册中心。

如何使用(以下例子将示范如何利用txk-mvc开发一个微服务)

首先,创建一个目录,以myapp为例

mkdir myapp
cd myapp

初始化npm

npm init

保持默认选项或者根据需要修改即可。

引入txk-mvc框架

npm i txk-mvc -s

如果之前使用了txk-mvc低版本,必须升级到最新的版本

npm update txk-mvc

txk-mvc包含了以下基础的类库,用户必须继承这些基类并实现其中一些配置,利用这些类可以方便的创建自己的微服务:

BaseController: 控制器原型
BaseRequest:    请求验证原型
BaseService:    服务原型
BaseValidator:  验证器原型
AllValidators:  内置几个验证器(必填、不能为空、文本长度、正则表达式等几个验证器)
BaseRepository: 数据仓库原型
MySQL:          封装Mysql原型(只有query一个方法)
Redis:          封装Redis原型(高频使用的redis命令封装,如get、set等命令)
BaseApplication:微服务应用原型,由这个对象服务入口,从Koa继承
BaseRegister:   注册中心注册器(将微服务注册到注册中心,或者调用任何注册中心的微服务功能)
MicroRepository:基于微服务的数据仓库原型,调用的是微服务的方法,而不是实体mysql或redis的物理命令

示范(一个提供mysql功能的微服务)

app.js

const { MyApplication } = require('txk-service')
const config = require('./config')
const router = require('./router')

class MySqlApplocation extends MyApplication {
    getName() {
        return config.app_name
    }
    getPort() {
        return config.app_port
    }
    getDesc() {
        return config.app_desc
    }
    getServiceUrl() {
        return config.service_url
    }
}

const app = new MySqlApplocation(router)
app.listen()

说明:txk-service是对txk-mvc的一个默认封装,包括一个注册器和一个应用对象

运行的效果:

node app.js

生产环境使用:

pm2 start app.js -i max
PS D:\GitHub\stall\micro-services\mysql-service-read> node app.js
mysql-stall-read stall mysql 微服务(主读) 正在监听端口 20101
本地测试地址: http://localhost:20101
公开访问地址: https://xxx.cn/service/mysql/stall/read
已经登记到注册中心
已经更新微服务列表
最新微服务列表如下:
-----------------------------------------
[ { app: 'mysql-stall-master',
    url: 'https://xxx.cn/service/mysql/stall/write' },
  { app: 'mysql-stall-write',
    url: 'https://xxx.cn/service/mysql/stall/write' },
  { app: 'redis-master',
    url: 'https://xxx.cn/service/redis/write' },
  { app: 'redis-slave',
    url: 'https://xxx.cn/service/redis/read' },
  { app: 'mysql-stall-read',
    url: 'https://xxx.cn/service/mysql/stall/read' } ]
-----------------------------------------
注册成功!

config.js 配置文件

module.exports = {
    mysql_host: '127.0.0.1',
    mysql_port: 3306,
    mysql_user: 'root',
    mysql_password: '123456',
    mysql_database: 'stall',
    app_port: 20101,
    app_name: 'mysql-stall-read',
    app_desc: 'stall mysql 微服务(主读)',
    service_url: 'https://xxx.cn/service/mysql/stall/read'
}

router.js 路由文件

const Router = require('koa-router')
const Controller = require('./controller')

module.exports = new Router()
    .post('/query', ctx => new Controller(ctx).query())

request.js 请求验证器

const { BaseRequest, AllValidators } = require('txk-mvc')

class Request extends BaseRequest {
    query() {
        return this.use('body', 'sql', new AllValidators.NotEmptyValidator()).check()
    }
}

module.exports = Request

请求验证器主要由use方法和check方法。 use方法用于加载验证器,可通过链式调用加载多个验证器。 check方法用于返回验证结果给到控制器,返回格式:

{
    result:boolean,
    code:number,
    msg:string,
    data:{
        query:any,
        body:any,      
        params:any,
        headers:any
    }
}

service.js 服务对象

const { BaseService } = require('txk-mvc')
const MySql = require('./mysql')     //对mysql原型的默认封装

class MySqlService extends BaseService {
    query() {
        return new MySql().query(this.request.body.sql, this.request.body.params)
    }
}

module.exports = MySqlService

mysql.js 对mysql基类的进行具体的配置

const { MySQL } = require('txk-mvc')
const config = require('./config')

class DefaultMySql extends MySQL {
    getHost() {
        return config.mysql_host
    }
    getPort() {
        return config.mysql_port
    }
    getUser() {
        return config.mysql_user
    }
    getPassword() {
        return config.mysql_password
    }
    getDatabase() {
        return config.mysql_database
    }
}

module.exports = DefaultMySql

controller.js 控制器

const { BaseController } = require('txk-mvc')
const Request = require('./request')
const Service = require('./service')

class Controller extends BaseController {
    async query() {
        let request = await new Request(this.ctx).query()
        if (!request.result) {
            return this.error(request.code, request.msg)
        }

        let result = await new Service(request.data).query()

        return this.success(result)
    }
}

module.exports = Controller

调用微服务测试:

a.js

const { MyRegister } = require('txk-service')
new MyRegister().getService('mysql-stall-read', 'query', {
    sql: 'select * from user'
}).then(value => {
    console.log(value)
}).catch(reason => {
    console.log(reason.message)
})

输出:

PS D:\GitHub\stall\api> node a.js
[ { id: 7,
    openid: 'oGNfy5Bit3kugmizUR2rjvvloL_Y',
    nickName: '唐旭克',
    avatarUrl:
     'https://wx.qlogo.cn/mmopen/vi_32/4FYsd8bWiaR9FfnQ950s9ViaSjsCXKpvkpEgESjfMebUL7ibvqhDguttQsKd255fNLYiaV4gKTXHOs4AbN8eKcNIuA/132',
    userid: '',
    city: 'Dongguan',
    province: 'Guangdong',
    country: 'China',
    gender: 1,
    language: 'zh_CN' } ]
PS D:\GitHub\stall\api>

参数验证不通过的示范: a.js

const { MyRegister } = require('txk-service')
new MyRegister().getService('mysql-stall-read', 'query', {
    sql1: 'select * from user'     //参数错误
}).then(value => {
    console.log(value)
}).catch(reason => {
    console.log(reason)
})

输出:

PS D:\GitHub\stall\api> node a.js
{ code: 1001, msg: 'sql 字段内容为空!' }
PS D:\GitHub\stall\api> 

txk-service源码,目的是设置项目公共的注册中心地址,并设置应用类的默认注册中心

const { BaseRegister, BaseApplication } = require('txk-mvc')

class MyRegister extends BaseRegister {
    getMasterRedis() {
        return 'https://xxx.cn/service/redis/write'
    }
    getSlaveRedis() {
        return 'https://xxx.cn/service/redis/write'
    }
}

class MyApplication extends BaseApplication {
    getRegister() {
        return new MyRegister()
    }
}

module.exports = {
    MyRegister, MyApplication
}

Install

npm i txk-mvc

DownloadsWeekly Downloads

379

Version

1.0.92

License

ISC

Unpacked Size

101 kB

Total Files

34

Last publish

Collaborators

  • avatar