外部应用导入说明
功能
将平台之外开发的应用导入平台,之后可以和平台开发的应用一样,发布,运行,监控,集成到门户。
基本使用步骤
- 平台之外开发应用
- 使用“外部应用导入模板”创建应用。
- 创建一个或者多个应用模块,例如: SpringBoot 开发的后端服务模块, 使用 React 开发的前端模块。
- 导入应用代码到应用模块
- 根据需要对应用进行配置,包括: 数据库, 网关等
- 发布应用。
导入方式
- 源码导入,引用源码存储在 Git 仓库中,配置 Git 参数后执行导入,系统会从指定的 Git 仓库拉取源码到应用模块中,在发布阶段对源码进行编译生成可运行的二进制文件。
- 二进制文件上传, 应用源码在平台之外构建生成可执行的文件,例如 SpringBoot 项目 生成可执行 jar 文件, React 项目生成静态 html/js/css 文件并打包到 zip 文件。
运行环境
- Tomcat 应用构建生成 war 文件,发布到 Tomcat 中运行
- Nginx 应用代码已经构建为静态的 html/css/js 文件, 发布到 Nginx
- Cuda 机器学习应用,构建为可执行的二进制文件,需要 Gpu 支持
- Java 应用构建为可执行 Jar 文件(例如 SpringBoot 应用), 使用 java -jar xxx 命令运行
- 云原生 可发布到 Kubernetes 集群的 helm 安装包,应用发布时使用 helm 执行安装。
- Python Python 应用
- Nginx-前端构建 发布到 Nginx 的前端项目,使用 NodeJs 构建。
- 通用二进制 编译为 Ubuntu 可执行的二进制文件。
- .Net .Net 应用
- 自动 源码,系统通过架构定义,自动识别运行环境和构建方式
特别说明:
- 应用类型和导入方式是组合关系,不同的应用类型可能支持不同的导入方式, 例如 Nginx 应用类型仅支持导入已经构建好的 html/css/js 文件。
- 在 "添加服务模块" 对话框中,选择运行环境以后, "导入方式" 下拉列表会列出可用的导入方式。
配置
针对外部应用特有的配置包括:
- 源码导入配置
- 环境配置
- 初始化配置
- 代理网关配置
- 服务网关配置
源码导入配置
目前源码导入仅支持从 git 导入源码。 svn 的支持后续可扩展实现。
- 仓库地址:git 仓库地址, 使用 "git clone xxx" 命令可从此地址 clone 仓库
- 代码分支:git 分支,如果是 master 主干,可不填。导入源码是从远程 git 服务 clone 仓库到本地,签出分支然后再复制文件,所以这里的分支名称应该是远程分支的名称
- 仓库用户名/密码:输入可访问此 git 仓库的用户名和密码
- 仓库 Token::某些 git 仓库服务支持 token 访问(例如 gitlab),可不输入用户名/密码 ,输入 token。
- 源目录:从 git 仓库根目录开始的目录相对路径
- 目标目录:目标目录的根目录是当前模块目录,所以如图中示例,把另外一个应用中的 main 模块整个导入当前应用的 main 模块。
- 文件列表:需要复制的文件及目录白名单,只有在此列表中的内容才会被复制,如果为空,那么复制所有源目录下的内容到目标目录。
- 文件过滤:对待复制的文件进行过滤,符合文件过滤条件的文件将不会被复制
顶层服务目录
服务模块列表中有一个特殊的模块: "顶层服务目录"。应用的所有服务模块都存储在 model/service 下的模块目录中,某些情况下,需要在 model/service 下导入一些特殊的文件,例如 maven 的多项目一般是在具体模块的上一层目录存储 parent pom.xml 构成一个父子关系的多项目结构,这种情况下可将这些文件导入 "顶层服务目录"。"顶层服务目录" 的文件复制有特殊性,只复制源目录下的文件,并不处理源目录下的子目录。
文件列表
每一行是一个模式定义 只有包含在文件列表中的子目录或者文件列表才会进入文件复制列表 如果文件列表为空,源目录下的所有目录和文件都将进入文件复制列表 要求文件列表的每条定义都包含源目录下一级的子目录名称 目录要求以 / 结束 可使用通配符 *
例如: 源目录为 /source1
dir1/ /source1/dir1 整个目录进入复制列表
file1.txt /source1/file1.txt 文件进入复制列表
dir2/dir3/ /source1/dir2/dir3 整个目录进入复制列表
dir2/*/dir3/ /source1/dir2/a/dir3 整个目录进入复制列表
/source1/dir2/b/dir3 整个目录进入复制列表
文件过滤
每一行是一个文件通配符定义 在文件列表的基础上,满足文件通配符列表的文件都将被过滤
**/*.bak 任意目录下 .bak 扩展名的文件都不会被复制
**/readme 任意目录下 readme 文件都不会被复制
源码导入配置实例
环境配置
平台应用所有的配置数据都通过环境变量访问。 例如数据库访问,为应用配置数据库后,系统自动为应用生成一组环境变量,用于访问相关参数。默认的环境变量命名遵循一定规范: 以模块名为前缀,使用下划线连接,全大写。 如果应用代码需要以不同的环境变量名访问,可以在环境配置中自定义环境变量名,之后除了默认的环境变量,系统还会生成自定义的环境变量。 例如下图中,默认将生成 MAIN_DBUSER(数据库用户名) , MAIN_DBPASSWORD(数据库密码)等环境变量,如果需要点击"编辑"可以自定义环境变量名称。
启动命令行
Java 运行环境支持配置启动命令行,在启动命令行中可使用环境变量
$port 当前模块的端口
$jar jar文件路径
例如一个 SpringBoot 应用启动命令行:
java -Dserver.port=$port -jar $jar
初始化配置
对于使用数据库的应用,可以自己管理数据库的初始化,也可以使用平台的数据模型文件(.data.m)初始化数据库。 初始化配置界面列出了当前应用使用的数据库列表,每个数据库可以上传一个 zip 文件,其中包含用于初始化数据库的 .data.m 文件。
代理网关配置
平台每个应用都有一个 gateway 容器,运行 Kong API 网关服务, 通过 url 映射将请求映射到后台服务。
代理网关配置主要是三个参数
- 请求路径前缀:请求到 80 端口的 url 前缀,满足此前缀的 url 将应用此规则
- 应用路径:将要转发到应用运行端口的路径前缀。
- 删除返回地址前缀:是否将匹配的请求路径前缀从转发的 url 中删除
例如 SpringBoot 应用如果运行在 8081 端口,应用支持下面的 url 访问 "/app/abc" 那么按下图的配置,对 80 端口的请求 "/main/app/abc" 将被转发到应用的 "/app/abc"
使用根路径访问
通过网关访问应用,默认都带上了应用模块名作为请求路径的第一级,如果需要使用根路径访问,需要开启 "使用根路径访问" 开关。 由于根路径的特殊性, 开启后系统会做一些特殊的设置,确保当前模块以根路径访问。 一个应用中只有一个模块可以以根路径访问,如果在多个模块上设置,系统会报错。
服务网关配置
平台提供了企业门户应用,其它的应用可以集成到门户中访问。 服务网关配置用于配置门户如何访问当前应用。如果应用不集成到门户,此项配置可以忽略。
在门户中访问应用的第一级路径是应用名,对于下面的应用 importdoc,服务网关配置:http://{门户域名}/importdoc/main/abc , 将被转发到应用的内网域名: http://importdoc.nd-tenant-yyc3/main/abc
serviceMetaInfo 配置
serviceMetaInfo 用于将应用集成到门户的场景,如果应用独立访问,不集成到门户,可以不用处理此配置。 在门户中扫描注册应用时,会访问应用的 serviceMetaInfo 接口:http://{应用域名}/serviceMetaInfo , 获取 json 配置信息,其中包含了应用的菜单,权限等定义。 平台开发的应用会自动生成 serviceMetaInfo 内容,外部导入的应用根据需要可以定制 serviceMetaInfo 的内容。
外部应用导入的服务模块在 package.json 模块元数据文件中,声明整个应用的 serviceMetaInfo 访问路径。
外部应用模块导入后,系统合并模块网关配置和模块声明的 serviceMetaInfo 访问路径配置,生成最终的访问路径,并覆盖 service-meta-info 系统模块的 path 属性
例如应用模块的网关配置: /main
,模块指定的 serviceMetaInfo 访问路径为 /serviceMetaInfo
, 最终的访问路径是 /main/serviceMetaInfo
应用可以在服务接口 "/main/serviceMetaInfo" 提供定制后的 serviceMetaInfo json 文件。
注意: serviceMetaInfo 的访问路径和应用模块的代理网关配置有关, 源码中修改了 package.json 后,需要切换到代理网关配置页面执行保存操作。
serviceMetaInfo 示例
注意: 这里是一个最简单的 serviceMetaInfo 文件, serviceMetaInfo 的结构和语法请参考《服务元信息》
src/main/resources/data/meta.json 存储 serviceMetaInfo
{
"authorize":{
"permissions":[],
"roles":[]
},
"menu":{
"children":[
{
"children":[],
"ext":{},
"title":"主页",
"types":["func","mobile"],
"url":"/index.html"
}
],
"ext":{},
"title":"{serviceLabel}",
"types":[]
},
"serviceInfo":{
"label":"{serviceLabel}",
"name":"{serviceName}"
}
}
输出 serviceMetaInfo 代码示例
package main.controller;
import java.io.InputStream;
import org.apache.commons.io.IOUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class Test1Controller {
@GetMapping("/main/serviceMetaInfo")
public Object meta() throws Exception {
return loadResource("/data/meta.json");
}
static String loadResource(String path) throws Exception {
InputStream is = null;
try {
is = Test1Controller.class.getResourceAsStream(path);
return IOUtils.toString(is, "UTF-8");
} finally {
if (is != null) {
IOUtils.closeQuietly(is);
}
}
}
}
package.json 模块元数据文件示例
{
"name": "importdoc",
"description": "模块导入测试",
"author": "justep_co",
"license": "ISC",
"keywords": [],
"version": "1.1.1",
"moduleInfo":{
"serviceMetaInfo":{
"path":"/serviceMetaInfo"
}
}
}
应用特殊配置
某些类型的应用有其特殊配置机制。
Nginx 配置
系统为每个 Nginx 模块自动生成了 Nginx 配置文件,存储在模块的 deploy 目录下。 例如如果 Nginx 模块名为 uiapp 那么将在 mode/service/uiapp/deploy/uiapp.module.conf 中自动生成如下 nginx 配置,可根据需要编辑。
location /uiapp {
absolute_redirect off;
alias /dist/comp.nginx-runtime/dist/uiapp/;
index index.html index.htm;
try_files $uri $uri/ /uiapp/index.html;
}