试验背景:
自己编写一个后台程序,尝试推送到Cloud Foundry上,并开放从MindSphere以外访问的权限。
程序实现以下功能:
1、使用MindSphere提供的API获得指定时序的Token
2、启动定时任务,从时序数据中拉取数据,并打印在日志中。
3、提供一个REST接口,用来获取数据。
4、程序开启log日志,打印到Cloud Foundry的容器中。
前提条件:
1、电脑已经安装Power Shell。
2、提前编写好要测试的程序。
3、拥有MindSphere的Developer账号。
操作随记:
(一)编写程序
程序地址:https://github.com/quchunhui/demo-macket/tree/master/mindsphere
(二)登陆Cloud Foundry
Cloud Foundry的登陆,可以参考上一篇博客。
博客地址:https://www.cnblogs.com/quchunhui/p/12015167.html
(三)创建CF空间并赋予权限
1、切换到已有组织(org),相关命令如下:
切换组织:cf target -o rexelcn0
2、创建测试程序的运行空间(space),相关命令如下:
创建空间:cf create-space rexel-mf-api-test
查看所有空间:cf spaces
3、更新空间的Role(角色)及Permission(权限),相关命令如下:
查看Space中的使用者及其权限:cf space-users rexelcn0 rexel-mf-api-test
附加:
如果希望使用其他账户完成后续的操作,可以使用一下命令来添加权限。
为指定用户添加SpaceManager权限:cf set-space-role [email protected] rexelcn0 rexel-mf-api-test SpaceManager
为指定用户添加SpaceDeveloper权限:cf set-space-role [email protected] rexelcn0 rexel-mf-api-test SpaceDeveloper
(四)将应用程序部署到Cloud Foundry
1、在程序根目录中创建manifest.yml文件
文件内容如下:
--- applications: - name: rexel-mindsphere-api-test instances: 1 random-route: true path: target/rexel-mindspere-api-0.0.1.jar memory: 512M
2、将程序推送到CF的空间,相关命令如下:
跳转入Spaces:cf target -s rexel-mf-api-test
跳转到程序根目录:cd D:\MyWork\22_Github\rexel-cn\rexel-jarvis\rexel-mindsphere-api
推送程序:cf push
列出所有应用及运行状态:cf apps
查看应用的详细状态:cf app rexel-mf-api-test
【小插曲1】
执行cf push的时候报错一个错误
在程序根目录中使用mvn package重新编译打包,然后再次执行cf push之后问题解决。
【小插曲2】
程序上传之后,cf提示启动失败
按照提示的命令查看了日志。命令:cf.exe logs rexel-mindsphere-api-test --recent
可以看到提示内存不够。
尝试将manifest.yml中配置的内存大小调高,重新推送之后解决。修改之后的manifest.yml文件内容
--- applications: - name: rexel-mindsphere-api-test instances: 1 random-route: true path: target/rexel-mindspere-api-0.0.1.jar memory: 1G
(五)SSH进入到空间查看运行
官网操作手册:https://developer.mindsphere.io/zh/paas/paas-cloudfoundry-ssh.html
1、检查空间SSH是否开启
命令:cf space-ssh-allowed rexel-mf-api-test
2、开始指定空间SSH权限:
默认是开启的,如果没有开启,可以使用以下命令打开权限。
命令:cf allow-space-ssh rexel-mf-api-test
3、为应用开启SSh权限:
命令:cf enable-ssh rexel-mindsphere-api-test
注意不要弄错了空间名(rexel-mf-api-test)和应用名(rexel-mindsphere-api-test)
4、重新启动应用:
命令:cf restart rexel-mindsphere-api-test
5、SSH进入应用空间:
命令:cf ssh rexel-mindsphere-api-test
6、进入日志所在路径:
在spring程序的logback中,配置的日志路径为:/home/vcap/logs
进入路径:cd /home/vcap/logs/
7、查看日志是否正常:
命令:less rexel-md-test2019-12-11.log
(六)将程序注册到MindSphere
1、使用MindSphere账号登录
2、选择Developer Cockpit(开发驾驶舱)
3、选择仪表盘选项卡。
4、单击创建新的应用。
类型:Standard
基础设施:MindSphere Cloud Foundry。
显示名称:Rexel MindSphere Api Test(字面上容易理解的就可以)
内部名称:rexelmfapitest(这将会为成为应用URL的一部分。初始化创建后,内部名称不能被更改!)
版本:1.0.0(MindSphere 支持 Major.Minor.Patch 方案。版本必须以 >=1 的主号码开头。保存之后版本不能被更改。)
应用图标:随便上传一个就可以。我用了一个钢铁侠第一任人工智能助理Jarvis的图片。
输入组件名称。 示例应用的组件名称为hello-spring-cloud。
组件名称
组件名称必须与 manifest.yml 中的 Cloud Foundry 应用名称匹配。否则,生产系统中的自动注册将会失败。
组件名称:rexel-mindsphere-api-test(必须与 manifest.yml 中的 Cloud Foundry 应用名称匹配。否则,生产系统中的自动注册将会失败。)
Cloud Foundry URL:rexel-mindsphere-api-test-comedic-hippopotamus-vl.apps.cn1.mindsphere-in.cn(使用 cf app {app_name} 来获取您部署的应用的 URL。)
端点:为您的组件添加至少一个端点。使用 /** 来匹配您应用的所有路径。
关于端点: 您可以为端点使用任意路径。 不允许使用 /api,因为这是为从相对路径(例如 /api/iot/v3/timeseries)调用 MindSphere api 预留的。 避免使用keywords,因为这是为 SQL 操作预留的。 您可以使用通配符。 * 匹配路径中任何字符,** 匹配任何字符和子路径。
点击保存。将被重定向到应用详细信息。 应用程序处于In-Development状态,并且准备好注册了。
可以看到应用创建成功。(有没有开心的感觉?)
【小插曲】
保存失败,因为说明中不能使用中文。
使用有道词典,将中文翻译成应为,重新搞一次解决。
(七)配置应用角色和范围
参考官网资料:https://developer.mindsphere.io/zh/howto/howto-cf-running-app.html
1、切换到授权管理选项卡。
2、选择应用。
3、创建一个应用范围并选择分配给哪个角色。
关于角色和范围:https://developer.mindsphere.io/zh/concepts/concept-roles-scopes.html
这里暂时只赋予一个权限mdsp:core:iot.timUser(读取时间序列的权限)
附:角色范围整理
(八)注册应用
1、切换到仪表盘选项卡,打开应用详细信息,单击注册。
(九)分配应用角色
1、从Launchpad 中打开 Settings 应用,并切换到角色选项卡。
2、选择一个应用角色并单击编辑分配。
分配一个或多个用户到应用角色。
结束编辑。登出 MindSphere 并重新登陆。
(十)授权管理
使用密钥管理器API授权您的应用访问其他租户数据。该操作主要针对某个应用需要访问其他不同租户的数据的情形,例如,在没有用户交互的情况下频繁进行数据处理时。
1、在 MindSphere Launchpad Developer/Operator Cockpit 授权管理应用凭证中,点击对应的 APP 名称,选择右侧签发访问权限
2、选择所需权限类别,并提交
3、将显示的对应信息保存,
注意:此信息只显示一次
注意:此信息只显示一次
注意:此信息只显示一次
4、将对应信息添加至应用 Manifest .yml 文件中,并重新上传应用
--- applications: - name: rexel-mindsphere-api-test instances: 1 random-route: true path: target/rexel-mindspere-api-0.0.1.jar memory: 1G env: HOST_ENVIRONMENT: cn1 MDSP_OS_VM_APP_NAME: rexelmfapitest MDSP_OS_VM_APP_VERSION: 1.0.0 MDSP_KEY_STORE_CLIENT_ID: <只显示一次的客户ID> MDSP_KEY_STORE_CLIENT_SECRET: <只显示一次的客户密钥>
5、使用Postman测试是否部署成功
先使用 base 64 工具加密客户ID与客户秘钥,格式为客户ID:客户秘钥(半角符号)
工具地址:https://www.base64encode.org/
工具截图:
以获取Token为例,使用Postman测试一下:
请求类型:POST
请求地址:https://gateway.cn1.mindsphere-in.cn/api/technicaltokenmanager/v3/oauth/token
Header:
Body 选项卡设置格式为Raw ,格式为JSON,内容为:
{ "appName": "rexelmfapitest", "appVersion": "1.0.0", "hostTenant": "rexelcn0", "userTenant": "rexelcn0" }
点击发送之后,可以看到已经可以正常获取Token信息
(十一)从外部方位应用程序提供的接口
()