
# 在Linux服务器中部署数据建模引擎运行SDK
当您希望将iDME应用以微服务的形式部署到Linux服务器，可以更好地控制和管理自己的应用数据、减少数据传输的延迟时，可以选择此实施方式进行数据建模引擎运行SDK独立部署。后续，您还可以基于应用运行态灵活扩展，为上层应用提供使用HTTP协议进行通信的API调用能力。
#### 准备事项
请在部署数据建模引擎运行SDK之前，提前获取SDK包和License文件。
如何获取SDK请参见[获取数据建模引擎SDK](https://support.huaweicloud.com/sdkreference-idme/idme_sdkreference_0009.html)。
#### 检查SDK包（可选）
为防止数据建模引擎运行SDK包在存储、下载、传输过程中被篡改，建议在部署前检查SDK包是否完整。
您可以使用如下校验函数进行校验，当生成的文件签名与您获取的SDK包文件签名一致时，表示SDK包完整。
```
public static String getSHA256(File file) {
        FileInputStream fileInputStream = null;
        try {
            MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
            fileInputStream = new FileInputStream(file);
            byte[] buffer = new byte[8192];
            int length;
            while ((length = fileInputStream.read(buffer)) != -1) {
                messageDigest.update(buffer, 0, length);
            }
            return new String(HexUtil.encodeHex(messageDigest.digest()));
        } catch (Exception ex) {
            log.error("getSHA256 error.", ex);
            return null;
        } finally {
            try {
                if (fileInputStream != null) {
                    fileInputStream.close();
                }
            } catch (IOException ex) {
                log.error("getSHA256 error when close inputStream.", ex);
            }
        }
}
```
其中，"MessageDigest"为"java.security"组件，"HexUtil"为"hutool"组件。
#### 操作步骤
如下操作以CentOS 7.6 64位操作系统的ECS为例。
1. [登录Linux弹性云服务器](https://support.huaweicloud.com/usermanual-ecs/zh-cn_topic_0013771089.html)。
2. 将已获取的SDK包和License文件上传至弹性云服务器，具体操作请参见[上传文件到云服务器方式概览](https://support.huaweicloud.com/ecs_faq/ecs_faq_0049.html)。
3. 执行如下命令，将SDK包解压缩到部署服务器的工作目录。 
   ```
   tar -xvf {SDK包的名称} -C {部署服务器的工作目录}
   ```
   例如，将SDK包"TestApp-sdk-default"解压缩到"/opt/cloud"路径下。
   ```
   tar -xvf TestApp-sdk-default -C /opt/cloud
   ```
   
   
4. 执行如下命令，进入部署服务器的工作目录，例如"/opt/cloud"。 
   ```
   cd /opt/cloud
   ```
   
   
5. 执行如下命令，打开"application.properties"文件。 
   ```
   vim application.properties
   ```
   
   
6. 按**i** 切换至编辑模式，并根据实际的[数据建模引擎运行SDK资源规划](https://support.huaweicloud.com/sdkreference-idme/idme_sdkreference_0008.html#ZH-CN_TOPIC_0000002101358320__section15530131311115)，按需添加对应资源的配置信息。如果配置项的值包含中文，请先使用工具将其转换为**Unicode** 编码。
   
   如下内容以[数据建模引擎运行SDK通用配置](https://support.huaweicloud.com/sdkreference-idme/idme_sdkreference_0012.html)和部分[数据建模引擎运行SDK自定义配置](https://support.huaweicloud.com/sdkreference-idme/idme_sdkreference_0013.html)为例。
   以**Postgresql** 数据库为基础的**本地服务单点登录** 为例，以下为对应的环境变量配置示例：
   ```
   ## 数据库配置
   # 数据库IP地址
   RDS_IP=127.0.0.1
   # 数据库使用端口
   RDS_PORT=5432
   # 数据库账号
   RDS_NAME=root
   # 数据库密码
   RDS_PASSWORD=123456
   # 数据库名
   RDS_DATABASE=sdk17
   # 使用的数据库类型
   RDS_TYPE=postgresql
   # 数据库连接url
   spring.datasource.url=jdbc:postgresql://${RDS_IP}:${RDS_PORT}/${RDS_DATABASE}?stringtype=unspecified
   # 数据库使用的连接驱动
   spring.datasource.driverClassName=org.postgresql.Driver
   # 数据建模引擎初始化环境使用的数据库类型
   xdm.runtime.db-type=postgresql
   # 数据建模引擎初始化模型使用的数据库方言
   xdm.runtime.hibernate.dialect=com.huawei.it.rdm.configuration.XdmPostgresqlDialect
   ## SSF单点登录
   # 单点登录使用的数据库类型
   SSF_RDS_TYPE=postgresql
   # 单点登录使用的数据库连接驱动
   SSF_DRIVER=org.postgresql.Driver
   # 单点登录的数据库连接信息
   spring.datasource.ssf.url=jdbc:postgresql://${RDS_IP}:${RDS_PORT}/${RDS_DATABASE}_ssf
   ## Redis配置
   # Redis数据库单点模式下的IP地址
   REDIS_HOST=127.0.0.1
   # Redis数据库集群模式下的IP地址
   # REDIS_CLUSTER_NODES=127.0.0.1:6379,127.0.0.1:6380
   # Redis数据库使用的端口
   REDIS_PORT=6379
   # Redis数据库密码
   REDIS_PASSWORD=root
   # Redis数据库的服务类型；SINGLE：单点模型，CLUSTER：集群模式
   REDIS_TYPE=SINGLE
   ## 公共信息配置
   # 数据建模引擎模型初始化配置，开启后会根据jar包中的模型信息更新数据
   xdm.runtime.init=true
   # 部署版本，建议和应用发布版本保持一致；同一个版本重复部署不会更新模型信息
   DEPLOY_VERSION=2.25.070.01
   # 当前部署应用ID
   TENANT_ID=da1f9c962b264627840dd50ae9b2e1fe
   # 当前部署应用名称
   APP_NAME=XDMLocal
   # 当前部署应用的唯一标识，一般为应用ID
   APP_IDENTIFIER=da1f9c962b264627840dd50ae9b2e1fe
   # 当前部署应用英文名称小写
   PAAS_APP_NAME=xdmlocal
   # 是否注册delegator代理器相关的bean
   xdm.delegate.bean.inject=false
   # 服务访问的上下文路径，格式需按照：/rdm_xxx_app/services/ 进行设置，xxx建议使用应用ID
   server.servlet.context-path=/rdm_da1f9c962b264627840dd50ae9b2e1fe_app/services/
   # 服务设置的端口
   server.port=8003
   # 全量数据服务API地址（访问详情接口必选配置），格式：http://{部署服务器的IP地址}{服务端口}
   APIG_DEFAULT_GROUP_HOST=http://127.0.0.1:8003
   # IAM Token 校验开关（true：开启，false：关闭，默认为false）
   OPEN_IAM_TOKEN_VALIDATION=false
   # 应用信息，当前配置使用环境变量进行填充；按需可以在设计态获取进行手动填充
   xdm.runtime.tenant.info={"id":"${TENANT_ID}","creator":"test1 3c03e719256a427eb9277b64fc83fb40","createTime":"2022-07-19T12:02:45.000+0000","modifier":"test1 3c03e719256a427eb9277b64fc83fb40","lastModifiedTime":"2022-07-19T12:02:45.000+0000","markForDelete":false,"name":"${APP_NAME}","nameEn":"${APP_NAME}","description":"${APP_NAME}","descriptionEn":"","owner":"lundefined","shortName":"${APP_NAME}","codeRepository":"","dbConn":null,"dbReadOnlyConn":null,"hisDeployUnit":null,"databaseType":"postgresql","aliasName":"${APP_NAME}","hisAppId":"","tps":1000,"qps":1000,"operationTime":null,"appNameEn":"${APP_NAME}","certifiedDataSourceName":null,"certifiedDataSourceNumber":null,"integrationMode":"API","domain":null,"appEnvInfo":"dev","metadataSynchronization":false,"codeDownloadPath":"","jarDownloadPath":"","appStatus":1,"domainId":"ac15e3fa2b1d499788d2538044961bd0","domainName":null,"identifier":"${APP_NAME}","deployedStatus":true,"damintegrated":false,"xdmhosted":false,"classname":"com.huawei.it.rdm.tenantmgmt.bean.Application"}
   # 应用运行态标识，格式为：rdm_{应用英文名称小写}_app
   xdm.application.sub-app-id=rdm_xdmlocal_app
   # 事务协调器开关，此项配置依赖xdm-tx-distributor.jar包的独立部署
   xdm.tx-distributor.enable=true
   # scc组件路径，需要置空
   devspore.security.provider.scc.tools-dir=
   ## SDK许可证配置
   # 是否为SDK部署标识，用于开放SDK的特有接口
   XDM_SDK_DEPLOY_ENABLE=true
   # license管理开关，开启后可以在web页面中管理license
   xdm.runtime.license-control.enable=true
   # SDK包部署方式，目前只支持主机(MACHINE)和容器(CONTAINER)部署
   xdm.license.deploy-type=MACHINE
   # license的校验方式
   xdm.license.runtime.valid-type=LICENSE
   # 许可证的初始化方式
   xdm.license.init-type=SYSTEM_PATH
   # license文件所在的位置
   xdm.license.licenseFile=/opt/cloud/license.dat
   # license解析所需密钥，申请license时获取
   xdm.license.public-key=iDME SDK:1:5:A9D150C6F***
   ## 服务编排配置
   # 服务编排全局开关
   #CUSTOM_SERVICE_GLOBAL_SWITCH=true
   ## 服务编排管理开关
   #CUSTOM_SERVICE_MANAGEABLE=true
   ## 服务编排是否可编辑开关
   #CUSTOM_SERVICE_MODIFIABLE=true
   ## 服务编排是否可执行开关
   #CUSTOM_SERVICE_EXECUTABLE=true
   ## 是否开启java服务编排
   #OPEN_JAVA_CUSTOM_SERVICE=true
   ## java服务编排的编译路径
   #xdm.runtime.java-compile.lib-path=/opt/cloud/java-compile
   ## MongoDB配置
   # 是否开启MongoDB
   # xdm.mongodb.init=true
   ## MongoDB的链接地址
   #MONGODB_URI=mongodb://rwuser:root@127.0.0.1:8635/test?authSource=admin
   ## 使用的MongoDB数据库名
   #MONGODB_DATABASE=test
   ## Elasticsearch配置
   ## Elasticsearch的IP端口信息
   #ES_URL=192.168.0.54:9200
   ## Elasticsearch的用户名
   #ES_USERNAME=admin
   ## Elasticsearch的密码
   #ES_PASSWORD=admin
   ## Elasticsearch的类型
   #ES_SCHEMA=http
   ## Kafka配置
   ## 是否开启Kafka
   #xdm.kafka.init=true
   ## Kafka的连接地址
   #KAFKA_BOOTSTRAP_SERVERS=127.0.0.1:9094
   ## 文件服务配置，在OBS配置和S3配置中进行选择
   ## #
   ## OBS服务配置
   ## OBS服务所在的地址
   #OBS_END_POINT=https://obs.cn-north-4.myhuaweicloud.com
   ## OBS服务使用的桶名
   #BUCKET_NAME=test
   ## 访问OBS使用的AK密钥
   #RES_AK=res_ak1
   ## 访问OBS服务使用的SK密钥
   #RES_SK=res_ak1
   ## #
   ## S3配置
   ## 对象存储服务的类型
   #xdm.objectstorage.type=S3
   ## S3服务所在地址
   #xdm.objectstorage.s3.host=127.0.0.1:9000
   ## S3服务使用的桶名
   #BUCKET_NAME=test
   ## S3服务的账号
   #xdm.objectstorage.s3.ak=admin
   ## S3服务的密码
   #xdm.objectstorage.s3.sk=123456
   ###
   ## 部分特性配置
   ## 二级缓存功能开关
   #OPEN_SECOND_LEVEL_CACHE=false
   ## 三级缓存开关
   #THIRD_LEVEL_REDIS_CLOSED=false
   ## 设置是否开启多数据源功能
   #DYNAMIC_DATASOURCE_ENABLED=false
   ## WSF组件配置
   ## 数据建模引擎全局配置开关开关
   #dme.wsf.enable=true
   ## WSF组件开关
   #devspore.security.wsf.enable=true
   ## WSF参数校验器开关
   #dme.wsf.param.check.enable=true
   ## WSF自定义参数校验配置文件，指向目录，目录下需要有validate文件夹
   #dme.wsf.param.config.path=/opt/cloud
   ## WSF文件上传校验开关
   #dme.wsf.multipart.check.enable=true
   ## WSF自定义文件上传配置
   #dme.wsf.upload.config.path=/opt/cloud/CustomUploadFileConfig.properties
   ## WSF csrf校验开关
   #dme.wsf.csrf.check.enable=true
   ## 日志配置
   ## WSF框架日志等级
   #WSF_LOG_LEVEL=INFO
   ## SSF框架日志等级
   #SSF_LOG_LEVEL=INFO
   ```
   其中，"License配置"的License文件路径需与[2]的存放路径保持一致。
   如果当前使用的是**MySQL**数据库，则需要在PostgreSQL环境变量的基础上进行以下配置调整：
   ```
   # # 数据库配置
   # 数据库IP地址
   RDS_IP=127.0.0.1
   # 数据库使用端口
   RDS_PORT=3306
   # 数据库账号
   RDS_NAME=root
   # 数据库密码
   RDS_PASSWORD=123456
   # 数据库名
   RDS_DATABASE=sdk17
   # 使用的数据库类型
   RDS_TYPE=mysql
   # 数据库连接url
   spring.datasource.url=jdbc:mariadb://${RDS_IP}:${RDS_PORT}/${RDS_DATABASE}
   # 数据库使用的连接驱动
   spring.datasource.driverClassName=org.mariadb.jdbc.Driver
   # 数据建模引擎初始化环境使用的数据库类型
   xdm.runtime.db-type=mysql
   # 数据建模引擎初始化模型使用的数据库方言
   xdm.runtime.hibernate.dialect=com.huawei.it.rdm.configuration.XdmMySqlDialect
   # # SSF单点登录
   # 单点登录使用的数据库类型
   SSF_RDS_TYPE=mysql
   # 单点登录使用的数据库连接驱动
   SSF_DRIVER=org.mariadb.jdbc.Driver
   # 单点登录的数据库连接信息
   # ${RDS_DATABASE}_ssf数据库，需要手动执行"set global log_bin_trust_function_creators=true;"，避免登录服务初始化失败
   spring.datasource.ssf.url=jdbc:mariadb://${RDS_IP}:${RDS_PORT}/${RDS_DATABASE}_ssf
   ```
   如果当前使用的是GaussDB数据库，则需要在PostgreSQL环境变量的基础上进行以下配置调整：
   ```
   ## 数据库配置
   # 数据库IP地址
   RDS_IP=127.0.0.1
   # 数据库使用端口
   RDS_PORT=8000
   # 数据库账号
   RDS_NAME=root
   # 数据库密码
   RDS_PASSWORD=123456
   # 数据库名
   RDS_DATABASE=sdk17
   # 使用的数据库类型
   RDS_TYPE=gaussdb
   # 数据库连接url
   spring.datasource.url=jdbc:opengauss://${RDS_IP}:${RDS_PORT}/${RDS_DATABASE}?stringtype=unspecified&sslmode=require&batchMode=off&reWriteBatchedInserts=true
   # 数据库使用的连接驱动
   spring.datasource.driverClassName=com.huawei.opengauss.jdbc.Driver
   # 数据建模引擎初始化环境使用的数据库类型
   xdm.runtime.db-type=gaussdb
   # 数据建模引擎初始化模型使用的数据库方言
   xdm.runtime.hibernate.dialect=com.huawei.it.rdm.configuration.XdmGaussDbDialect
   ## SSF单点登录
   # 单点登录使用的数据库类型
   SSF_RDS_TYPE=opengauss
   # 单点登录使用的数据库连接驱动
   SSF_DRIVER=com.huawei.opengauss.jdbc.Driver
   # 单点登录的数据库连接信息
   spring.datasource.ssf.url=jdbc:opengauss://${RDS_IP}:${RDS_PORT}/${RDS_DATABASE}_ssf
   spring.datasource.ssf.mapperLocations=classpath*:ssf/mapper_gauss/**/*.xml
   ```
   
   
7. 按**Esc** ，输入**:wq**，保存文件并返回。
8. 执行如下命令，新建"startxdm.bash"脚本文件。 
   ```
   vi startxdm.bash
   ```
   
   
9. 按**i** 切换至编辑模式，输入以下内容，设置启动应用运行态SDK脚本。
   
   ```
   # 指定启动类
   START_CLASS=com.huawei.microservice.rdm.RdmApplication
   # 指定启动类所在路径，为lib目录下
   LOAD_CLASSPATH=./lib/*:./
   BIND_ADDRESS=`hostname -I`
   # 从部署包中解压出olc配置文件，加粗的字段需要根据实际包名填写，请确保替换为正确的包名(jar包位于lib目录下)
   jar xvf ./lib/microserviceTemplate.app-1.0.0-SNAPSHOT-shaded-small.jar olc
   # 使用以下命令基于JDK 17启动Java服务。如需以后台方式运行，并将日志输出到xdm.log日志中，可在命令末尾添加>xdm.log 2>&1 &参数
   # 容器环境JVM参数配置建议：
   # 1. JVM内存分配为容器内存的80%，避免资源抢占
   # 2. 明确限定元空间和堆内存的最大大小，以避免资源过度消耗
   java -Xms8g -Xmx8g -XX:MaxMetaspaceSize=768m\
       --add-opens java.base/java.lang=ALL-UNNAMED \
       --add-opens java.base/java.util=ALL-UNNAMED \
       --add-opens java.base/javax.crypto=ALL-UNNAMED \
       --add-opens java.base/sun.security.util=ALL-UNNAMED \
       --add-opens java.base/sun.security.x509=ALL-UNNAMED \
       --add-opens java.base/sun.security.pkcs=ALL-UNNAMED \
       --add-opens=java.base/java.io=ALL-UNNAMED \
       -Dolc.config.path=./olc \
       -Dconfig.file=./application.properties \
       -classpath $LOAD_CLASSPATH $START_CLASS \
       --server.address=${BIND_ADDRESS}
   ```
   
   
10. 按**Esc** ，输入**:wq**，保存文件并返回。
11. 执行如下命令，设置"startxdm.bash"脚本文件权限。 
    ```
    chmod +x startxdm.bash
    ```
    
    
12. 执行如下命令，启动"startxdm.bash"脚本文件。 
    ```
    ./startxdm.bash
    ```
    
    
13. 完成部署后，xDM-F支持如下几种验证方式。您可以根据实际情况选择验证。 
    - **方式一：查看服务日志**
      执行如下命令，查看服务日志。
      ```
      tail -f xdm.log
      ```
      显示结果为类似如下信息，则说明启动成功。
      ```
      Started RdmApplication in xxx.xxx seconds (JVM running for xxx.xxx)
      ```
      
    
    - **方式二：调用指定接口**
      启动"startxdm.bash"脚本文件后，约等待2分钟，调用如下健康检查接口，查询服务是否正常启动。
      ```
      http://{部署服务器的IP地址}:{部署服务器的端口号}/rdm_{应用的唯一标识}_app/services/v1/health
      ```
      例如：
      ```
      http://127.0.0.1:8003/rdm_123456_app/services/v1/health
      ```
      显示结果为如下信息，则说明启动成功。
      ```
      {"result":"SUCCESS","data":["success"],"errors":[]}
      ```
      
    
    - **方式三：访问可视化页面**
      如果您已在[数据建模引擎运行SDK资源规划](https://support.huaweicloud.com/sdkreference-idme/idme_sdkreference_0008.html#ZH-CN_TOPIC_0000002101358320__section15530131311115)中规划了单点登录的相关资源/云服务，并在部署时配置了单点登录信息，可以选择此方式进行验证。
      在浏览器中访问如下地址，查看服务是否启动成功。
      ```
      http://{部署服务器的IP地址}:{部署服务器的端口号}/rdm_{应用的唯一标识}_app/services/index.html
      ```
      例如：
      ```
      http://127.0.0.1:8003/rdm_123456_app/services/index.html
      ```
      转入应用运行态登录页面，输入登录账号和登录密码，成功登录并进入应用运行态页面，即表示启动成功。
      
    
    
    
    
 
