写一个Spring程序推送到Cloud Foundry,并尝试从外部访问

试验背景:

自己编写一个后台程序,尝试推送到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

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第1张图片

 

2、创建测试程序的运行空间(space),相关命令如下:

创建空间:cf create-space rexel-mf-api-test 

查看所有空间:cf spaces

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第2张图片

 

3、更新空间的Role(角色)及Permission(权限),相关命令如下:

查看Space中的使用者及其权限:cf space-users rexelcn0 rexel-mf-api-test

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第3张图片

 

附加:

如果希望使用其他账户完成后续的操作,可以使用一下命令来添加权限。

为指定用户添加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

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第4张图片

 

(四)将应用程序部署到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

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第5张图片

 

【小插曲1】

执行cf push的时候报错一个错误

在程序根目录中使用mvn package重新编译打包,然后再次执行cf push之后问题解决。

 

【小插曲2】

程序上传之后,cf提示启动失败

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第6张图片

 

按照提示的命令查看了日志。命令:cf.exe logs rexel-mindsphere-api-test --recent

可以看到提示内存不够。

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第7张图片

 

尝试将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 

  写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第8张图片

 

(五)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

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第9张图片

5、SSH进入应用空间:

命令:cf ssh rexel-mindsphere-api-test

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第10张图片

 

6、进入日志所在路径:

在spring程序的logback中,配置的日志路径为:/home/vcap/logs

进入路径:cd /home/vcap/logs/

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第11张图片

 

 7、查看日志是否正常:

命令:less rexel-md-test2019-12-11.log

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第12张图片

 

(六)将程序注册到MindSphere

1、使用MindSphere账号登录

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第13张图片

 

2、选择Developer Cockpit(开发驾驶舱)

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第14张图片

  

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 应用名称匹配。否则,生产系统中的自动注册将会失败。

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第15张图片

 

组件名称: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。)

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第16张图片

端点:为您的组件添加至少一个端点。使用 /** 来匹配您应用的所有路径。

关于端点:
您可以为端点使用任意路径。
不允许使用 /api,因为这是为从相对路径(例如 /api/iot/v3/timeseries)调用 MindSphere api 预留的。
避免使用keywords,因为这是为 SQL 操作预留的。
您可以使用通配符。 * 匹配路径中任何字符,** 匹配任何字符和子路径。

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第17张图片

 

点击保存。将被重定向到应用详细信息。 应用程序处于In-Development状态,并且准备好注册了。

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第18张图片

 

可以看到应用创建成功。(有没有开心的感觉?)

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第19张图片

 

 【小插曲】

保存失败,因为说明中不能使用中文。

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第20张图片

 

使用有道词典,将中文翻译成应为,重新搞一次解决。 

 

(七)配置应用角色和范围

参考官网资料:https://developer.mindsphere.io/zh/howto/howto-cf-running-app.html

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第21张图片

 

1、切换到授权管理选项卡。

2、选择应用。

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第22张图片

 

3、创建一个应用范围并选择分配给哪个角色。

关于角色和范围:https://developer.mindsphere.io/zh/concepts/concept-roles-scopes.html

这里暂时只赋予一个权限mdsp:core:iot.timUser(读取时间序列的权限)

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第23张图片

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第24张图片

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第25张图片

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第26张图片

 

附:角色范围整理

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第27张图片

 

(八)注册应用

1、切换到仪表盘选项卡,打开应用详细信息,单击注册。

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第28张图片

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第29张图片

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第30张图片

 

(九)分配应用角色

1、从Launchpad 中打开 Settings 应用,并切换到角色选项卡。

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第31张图片

 

2、选择一个应用角色并单击编辑分配。

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第32张图片

 

分配一个或多个用户到应用角色。

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第33张图片

 

结束编辑。登出 MindSphere 并重新登陆。

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第34张图片

 

(十)授权管理

使用密钥管理器API授权您的应用访问其他租户数据。该操作主要针对某个应用需要访问其他不同租户的数据的情形,例如,在没有用户交互的情况下频繁进行数据处理时。

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第35张图片

 

1、在 MindSphere Launchpad Developer/Operator Cockpit 授权管理应用凭证中,点击对应的 APP 名称,选择右侧签发访问权限

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第36张图片

 

2、选择所需权限类别,并提交

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第37张图片

 

3、将显示的对应信息保存,

注意:此信息只显示一次

注意:此信息只显示一次

注意:此信息只显示一次

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第38张图片

 

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/

工具截图:

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第39张图片

 

以获取Token为例,使用Postman测试一下:

请求类型:POST

请求地址:https://gateway.cn1.mindsphere-in.cn/api/technicaltokenmanager/v3/oauth/token

Header:

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第40张图片

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第41张图片

 

Body 选项卡设置格式为Raw ,格式为JSON,内容为:

{
  "appName": "rexelmfapitest",
  "appVersion": "1.0.0",
  "hostTenant": "rexelcn0",
  "userTenant": "rexelcn0"
}

 

点击发送之后,可以看到已经可以正常获取Token信息

写一个Spring程序推送到Cloud Foundry,并尝试从外部访问_第42张图片

 

(十一)从外部方位应用程序提供的接口

()

你可能感兴趣的:(写一个Spring程序推送到Cloud Foundry,并尝试从外部访问)