快速构建

使用轻如框架可以通过 Artisan 工具一键生成微服务安装包

  1. php artisan make:service identity
  2. #其中identity为微服务标识

安装路径

所有的微服务统一放在站点下的同一目录,该目录位置并非固定路径,可按实际情况存放,一般是站点根目录的 /servers/ 目录下,该路径定义在常量 MICRO_SERVER (绝对路径,如 /home/www/qingwork/servers/),以下简称微服务目录

<?php
/**
 * 常量定义
 *
 * @author 神蛙科技
 * @url
 */
defined('IN_IA') or exit('Access Denied');


//定义微擎框架下的微服务目录
define('MICRO_SERVER', IA_ROOT."/swa_microserver/");

文件结构

每个微服务都需要作为一个单独的文件夹放在微服务目录下。原则上该文件夹必含的文件只有描述文件和模型文件,其它的文件结构、引用方式甚至是路由都由服务提供者自行定义和设计。

image.png

描述文件

微服务的描述文件存放在对应服务的根目录下,统一命名 manifest.json 。描述文件必须严格按照下方示例的规范,否则将无法解析。

{
    "application": {
        "identity": "ucenter",            //服务标识,唯一且必须
        "name": "用户管理",
        "cover": "server/ucenter/icon.png",
        "summary": "提供统一用户管理功能,包括登录、注册、会员资料、会员等级等会员相关管理功能",
        "version": "1.0.7",
        "releases": "2021123101"
    },
    "drive": "php",                    //服务的主要运行语言,默认为PHP
    "entrance": "member",        //微服务后端入口路由,也可以在模型文件的 getEntry() 方法返回,支持第三方链接
    "require":[
        {"id":"weengine","summary":"WeEngine框架兼容"}     //依赖的微服务,安装微服务时将自动判断是否已安装对应服务
    ],
    "apis": {
        "wiki": "https://ucenter-shenwa.doc.coding.io",    //微服务API接口文档
        "schemas": []
    },
    "methods": {
        "wiki": "",                                //内置方法外部说明文档
        "register": {
            "name": "用户注册",
            "summary": "统一用户注册方法",
            "wiki": "",
            "listener": "uc.register",
            "params": {
                "username":["用户名,仅限手机号或邮箱","string"],
                "password": ["登录密码","string|null"],
                "profile": ["会员资料","array|null"]
            },
            "return": ["会员信息","array|error"]
        }
    },
    "components": {
        "wiki": ""
    },
    "resources": [],
    "install": {
        "content": "install.php",                //微服务安装脚本
        "drive": "php"                            //微服务安装脚本类型,可选php(PHP文件)、phpscript(PHP脚本,慎用)、sql(SQL脚本)、shell(shell文件)、shellscript(shell脚本,慎用)
    },
    "upgrade": {
        "content": "upgrade.php",                //升级脚本
        "drive": "php"                            //升级脚本类型,同安装脚本类型
    },
    "uninstall": {
        "content": "",                            //卸载脚本
        "drive": "sql"                            //卸载脚本类型,同安装脚本类型
    }
}

依赖

如果微服务需要依赖其它服务,请在require字段申明,该字段结构请参考以上示例。如果系统未安装其依赖的服务时,会自动进入微服务安装引导流程。

API接口(APIS)

微服务可以在安装包的描述文件内申明该服务所提供的API接口,只需要在 apis 字段申明即可,支持外部的API说明文档(wiki字段),也支持提供API接口的实例结构(schemas字段),系统将自动按照该描述文件的接口实例生成API接口文档。
当API接口较多时,可以通过服务模型文件的 getApis() 方法返回接口文档和实例。 image.png

内置方法(METHODS)

注意事项

  1. 微服务的描述文件必须严格按照上方的示例的结构,否则可能无法正常解析(请务必去掉注释);
  2. 微服务升级时,只需要将版本号及发布号调高,并编写好升级脚本后,到后台更新即可;
  3. 在填写依赖时,请注意避免服务相互依赖的问题;
  4. 内置方法的广播事件名请务必确保唯一性。

模型文件

<?php

class UcenterService extends MicroService {

  public $servername = 'ucenter';

  public function __construct($uniacid=0){
    parent::__construct($this->servername);
    // Todo something
  }

  //获取服务的内置方法
  public function getMethods($data=array()){
    return parent::getMethods($data);
  }

  //获取服务的API接口文档
  public function getApis($data = array()){
    return parent::getApis($data);
  }

  /**
  * 接管路由
  * @param string|null $platform 路由通道,可选web、app、api及自定义通道
  * @param string|null $route 路由名称
  * @return array|error 返回数据
  */
  public function HttpRequest($platform="web", $route=""){
    // Todo something
    return parent::HttpRequest($platform, $route);
  }

}

继承

微服务的模型必需要继承 MicroService 类,并在构造函数__construct 中初始化该类。MicroService 类提供了许多内置的公共方法,便于在管理服务、调用服务时达到统一规范的目的。相关的内置公共方法详解请参考:https://www.yuque.com/shenwa/evz0h9/kh3of6

路由

所有以HTTP的方式访问该服务都会运行该服务模型文件的 HttpRequest() 方法,并通过 $platform 参数区分通道,支持web(后台页面,默认)、app(前台页面)、api(前台接口)及自定义通道。
微服务提供者可以在该方法内定义自己的路由规则,来实现任何功能。
为了便于快速开发,我们在该模型文件所继承的 MicroService 类内也添加了该方法,并编写了一套贴近MVC框架的路由规则,这意味着在正常情况下,您不需要重新定义路由规则,只需要在该服务目录下创建对应通道的文件夹(如web/),并在对应的文件夹内创建控制器来实现需要的功能即可。
如果要访问默认路由指定的控制器,则对应的URL需要使用 MicroService 类的 url() 方法api() 方法 来生成,查看详细说明

其它规范

静态文件

考虑到微服务目录可能会放在外部无法访问的目录内(如laravel、phpcmf等框架内),服务目录建议不要包含静态文件,所有需要的静态文件请放在云存储等第三方云平台上,便于统一引用、管理。如果必须要放在微服务目录下时,建议使用软链接的方式关联到站点的开放目录下。