Skip to content
当前页大纲

SaaS引擎

介绍

  • SaaS引擎作为平台的亮点之一,承载了所有租户的核心独立开发配置
  • 平台默认就是SaaS模式,因此部署平台必须自定义指定一个OsClient值:如microi、iTdos、anderson
  • 每个租户一个独立数据库,并且在主库中为每个租户配置独立的Redis、MQ、搜索引擎、阿里云、MinIO等
  • 一套程序驱动N个租户数据库,而不必每个租房再部署一套docker程序

OsClient

  • OsClient值即为SaaS引擎Key,值自定义,建议全小写字母,如microi、iTdos、anderson
  • 在sys_osclients表中,OsClient + OsClientType + OsClientNetwork三个字段同时唯一,如同时存在以下3条数据是支持的:
  • OsClient="microi",OsClientType="Product",OsClientNetwork="Internal,DbConn="Data Source=192.168.1.11;Database=microi",使用了内网IP+正式环境数据库
  • OsClient="microi",OsClientType="Dev",OsClientNetwork="Internal",DbConn="Data Source=192.168.1.11;Database=microi_dev",使用了内网IP+测试环境数据库
  • OsClient="microi",OsClientType="Dev",OsClientNetwork="Internet",DbConn="Data Source=59.110.139.95;Database=microi_dev",使用了公网IP+测试环境数据库

OsClientType

  • OsClientType值为SaaS引擎环境类型,值自定义,如正式环境、测试环境、外帐环境等

OsClientNetwork

  • OsClientNetwork值为SaaS引擎网络类型,值自定义,如内网、外网等

程序必须指定以上3个参数

  • 以确定读取该OsClient租户对应的环境+网络类型各项其它配置

基础配置

  • 支持数据库读写分离,支持指定存储介质

在这里插入图片描述

阿里云配置

  • 如果未使用MinIO,即可使用阿里云的OSS+CDN

在这里插入图片描述

MinIO配置

  • 如果未使用阿里云OSS,则可以使用MinIO
  • 值得注意的是,MinIO在做反向代理的时候,必须要设置【proxy_set_header Host $http_host】
  • 比如说我的反向代理配置文件和我的MinIO编排文件:
shell
proxy_cache_path /www/wwwroot/static.chongstech.com/proxy_cache_dir levels=1:2 keys_zone=static_chongstech_com_cache:20m inactive=1d max_size=5g;
server {
    listen 80;
    listen 443 quic;
    listen 443 ssl;
    http2 on;
    server_name static.chongstech.com;
    index index.php index.html index.htm default.php default.htm default.html;
    root /www/wwwroot/static.chongstech.com;
    #CERT-APPLY-CHECK--START
    # 用于SSL证书申请时的文件验证相关配置 -- 请勿删除
    include /www/server/panel/vhost/nginx/well-known/static.chongstech.com.conf;
    #CERT-APPLY-CHECK--END
    #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
    #error_page 404/404.html;
    ssl_certificate    /www/server/panel/vhost/cert/static.chongstech.com/fullchain.pem;
    ssl_certificate_key    /www/server/panel/vhost/cert/static.chongstech.com/privkey.pem;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    add_header Strict-Transport-Security "max-age=31536000";
    error_page 497  https://$host$request_uri;
    #SSL-END
    #REDIRECT START
    #REDIRECT END
    #ERROR-PAGE-START  错误页配置,可以注释、删除或修改
    #error_page 404 /404.html;
    #error_page 502 /502.html;
    #ERROR-PAGE-END
    #PHP-INFO-START  PHP引用配置,可以注释或修改
    include enable-php-00.conf;
    #PHP-INFO-END
    #IP-RESTRICT-START 限制访问ip的配置,IP黑白名单
    #IP-RESTRICT-END
    #BASICAUTH START
    #BASICAUTH END
    #SUB_FILTER START
    #SUB_FILTER END
    #GZIP START
    #GZIP END
    #GLOBAL-CACHE START
    #GLOBAL-CACHE END
    #WEBSOCKET-SUPPORT START
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection $connection_upgrade;
    #WEBSOCKET-SUPPORT END
    #PROXY-CONF-START
    location ^~ / {
      proxy_pass http://localhost:1010;
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Real-Port $remote_port;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header X-Forwarded-Host $host;
      proxy_set_header X-Forwarded-Port $server_port;
      proxy_set_header REMOTE-HOST $remote_addr;
      proxy_connect_timeout 60s;
      proxy_send_timeout 600s;
      proxy_read_timeout 600s;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection $connection_upgrade;
    }
    #PROXY-CONF-END
    #SERVER-BLOCK START
    #SERVER-BLOCK END
    #禁止访问的文件或目录
    location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md)
    {
        return 404;
    }
    #一键申请SSL证书验证目录相关设置
    location /.well-known{
        allow all;
    }
    #禁止在证书验证目录放入敏感文件
    if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {
        return 403;
    }
    #LOG START
    access_log  /www/wwwlogs/static.chongstech.com.log;
    error_log  /www/wwwlogs/static.chongstech.com.error.log;
    #LOG END
}
json
services:
  minio:
    image:  registry.cn-hangzhou.aliyuncs.com/microios/minio:2023-06-09
    container_name: minio
    volumes:
      - /etc/localtime:/etc/localtime
      - /data/minio/data:/data
      - /data/minio/config:/root/.minio
    environment:  
      - MINIO_ROOT_USER=root
      - MINIO_ROOT_PASSWORD=password
    command: server /data --console-address ":9001"
    ports:
      - "1010:9000"
      - "1011:9001"
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "10"
    restart: always
    tty: true
    stdin_open: true

在这里插入图片描述

Redis配置

  • 支持哨兵模式

在这里插入图片描述

MQ消息队列配置

  • 支持集群模式

在这里插入图片描述

搜索引擎配置

  • 目前仅支持ES搜索引擎,支持分词搜索,将来可能扩展其它搜索引擎

在这里插入图片描述

接口引擎区分saas租户

  • 用户访问一个接口引擎的自定义接口地址,如:(https://api.itdos.com/apiengine/test1)[https://api.itdos.com/apiengine/test1],默认是走主库的接口引擎
  • 假设租户A和租户B均有一个【/apiengine/test1】接口,则有多种方式来区分访问:
  • 1、在访问【/apiengine/test1】接口时,传入对应用户的token,平台会根据token识别到OsClient值以访问对应的saas租户数据库
  • 2、在访问【/apiengine/test1】接口时,没有token就是匿名访问,则通过增加Url参数来区别,如:/apiengine/test1?OsClient=veken
  • 3、某些特殊情况可能无法使用Url参数,如微信支付回调,则可以通过特殊格式来实现传入OsClient值以区分saas租户数据库,如:/apiengine/test1--OsClient--veken--
js
//示例代码
var appid = V8.OsClientModel.MiniProgramAppId;//小程序 appid
var privateKey = V8.OsClientModel.WxPayPrivateKey;//私书私有key
var notify_url = V8.SysConfig.ApiBase + `/apiengine/wxpay-notify--OsClient--${V8.OsClient}--`;//用户支付成功后回调地址,由接口引擎实现
var jsapiUrl = 'https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi';//腾讯官方下单地址,固定url
var jsapiUrlSimple = '/v3/pay/transactions/jsapi';//腾讯官方下单地址,固定url
var currentUser = V8.CurrentUser;

如何添加SaaS租户?

  • 开启saas模式前,必须要确认主库PC前端程序的环境变量OsClient值为空,也就是对应的主库访问地址如【https://os.itdos.com】的源码打开后【var OsClient = '';】是一个空值。若不满足,需要手动重新docker run安装PC前端程序,并保证环境变量OsClient的值为空字符串。

1、准备SaaS数据库

  • 建议使用gitee上面的demo或empty数据库,假设新的数据库连接字符串为:Data Source=59.110.139.96;Database=microi_demo;User Id=microi_demo;Password=34Lm5faTw6aLNYM8;Port=3307;Convert Zero Datetime=True;Allow Zero Datetime=True;Charset=utf8mb4;Max Pool Size=500;sslmode=None;
  • 提前想好该SaaS数据库的Key值,也就是OsClient值,如:saas1

2、在主库SaaS引擎中添加数据

  • 为了能快速添加并引用主库的一些配置,建议直接使用SaaS引擎中的【复制】功能,比如说我们复制【iTdos、Product、Internal】这条数据,然后填写新的【saas1、Product、Internal】并添加
  • 修改上面添加的那条数据中【数据库连接字符串】的值为上面准备的SaaS数据库的连接字符串,并且修改域名为您想访问的域名或IP:端口,比如说【https://demo.microi.net】就是一个saas库,或者您也可以填写如【192.168.1.11:1002】
  • 此时必须要重启一下后端api镜像的docker容器(预计下个版本修复此问题而不用再重启)

3、做反向代理

  • 假设主库的访问地址是【192.168.1.11:1001】,此时需要nginx新增一个反向代理【192.168.1.11:1002】到1001端口,此时则可以直接访问【192.168.1.11:1002】saas库
  • 类似的例子【https://os.itdos.com】就是主库,而【https://demo.microi.net】就是其中saas库之一

MIT License.