快速构建
使用轻如框架可以通过 Artisan 工具一键生成微服务安装包
php artisan make:service identity#其中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/");
文件结构
每个微服务都需要作为一个单独的文件夹放在微服务目录下。原则上该文件夹必含的文件只有描述文件和模型文件,其它的文件结构、引用方式甚至是路由都由服务提供者自行定义和设计。

描述文件
微服务的描述文件存放在对应服务的根目录下,统一命名 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() 方法返回接口文档和实例。
内置方法(METHODS)
注意事项
- 微服务的描述文件必须严格按照上方的示例的结构,否则可能无法正常解析(请务必去掉注释);
- 微服务升级时,只需要将版本号及发布号调高,并编写好升级脚本后,到后台更新即可;
- 在填写依赖时,请注意避免服务相互依赖的问题;
- 内置方法的广播事件名请务必确保唯一性。
模型文件
<?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等框架内),服务目录建议不要包含静态文件,所有需要的静态文件请放在云存储等第三方云平台上,便于统一引用、管理。如果必须要放在微服务目录下时,建议使用软链接的方式关联到站点的开放目录下。
