在Java工程中部署数据建模引擎运行SDK
xDM-F不仅支持以独立服务的方式部署数据建模引擎运行SDK,还支持以依赖引入的方式嵌入用户已存在的项目中,将其作为一个数据底座,提供可直接调用的xDM-F内置Service方法,减少网络IO。
如下操作以Windows 11操作系统的本地服务器为例。
准备事项
在部署数据建模引擎运行SDK之前,需要提前准备如下事项。
- 从Oracle官网下载和安装推荐使用的JDK版本。
推荐使用的JDK版本:JDK 17以上版本。
- 根据开发需要,下载并安装开发工具,例如Eclipse IDE、IntelliJ IDEA等。
- 获取SDK包和License文件。
如何获取SDK请参见获取数据建模引擎SDK。
操作步骤
- 解压缩已获取的SDK包。
- 将解压缩后“lib”文件夹下的所有文件引入到已有的Maven工程中。
- 在“resources”目录下,单击。
- 在弹出的窗口中,选择,单击。
- 全选“lib”文件夹下的所有文件,单击“OK”。
- 单击“Apply”。
- 在启动类上方添加如下注解。
@SpringBootApplication @EnableAsync(proxyTargetClass = true) @EnableScheduling @ComponentScan( basePackages = {"com.huawei.it", "com.huawei.innovation", "com.huawei.iit", "com.huawei.opendme", "com.huawei.xdm"}) @PropertySource(value = {"classpath:application.properties"}) @EnableCaching - 在启动类中添加System.setProperty()方法,设置“olc.config.path”系统属性。
System.setProperty("olc.config.path", "D:\\workspace\\sdk-test\\src\\main\\resources\\lib\\microserviceTemplate.app-1.0.0-SNAPSHOT-shaded-small.jar!\\olc");其中,“D:\\workspace\\sdk-test\\src\\main\\resources\\lib\\microserviceTemplate.app-1.0.0-SNAPSHOT-shaded-small.jar!\\olc”为“lib”文件夹下“microserviceTemplate.app-1.0.0-SNAPSHOT-small.jar”中的olc所在路径。
完整的示例代码如下:
package com.sz; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.PropertySource; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; /** * 启动类 * **/ @SpringBootApplication @EnableAsync(proxyTargetClass = true) @EnableScheduling @ComponentScan( basePackages = {"com.huawei.it", "com.huawei.innovation", "com.huawei.iit", "com.huawei.opendme", "com.huawei.xdm"}) @PropertySource(value = {"classpath:application.properties"}) @EnableCaching public class SdkApplication { public static void main(String[] args) { SpringApplication app = new SpringApplication(SdkApplication.class); System.setProperty("olc.config.path", "D:\\workspace\\sdk-test\\src\\main\\resources\\lib\\microserviceTemplate.app-1.0.0-SNAPSHOT-shaded-small.jar!\\olc"); app.run(args); } } - 在已有的Maven工程中,添加SDK启动配置。
- 单击。
- 在弹出的窗口中,单击“Environment variables”。
- 在弹出的窗口中,单击
,依次添加对应资源的配置信息。
请根据实际的数据建模引擎运行SDK资源规划,按需添加。
图1 添加环境变量
- 单击“OK”。
- 在已有的Maven工程中,单击
,启动项目。 - 完成部署后,xDM-F支持如下几种验证方式。您可以根据实际情况选择验证。
- 方式一:查看服务日志
在项目运行日志中如果存在如下类型信息,则说明启动成功。
Started RdmApplication in xxx.xxx seconds (JVM running for xxx.xxx)
- 方式二:调用指定接口
项目启动后,约等待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资源规划中规划了单点登录的相关资源/云服务,并在项目中添加了对应的单点登录配置信息,可以选择此方式进行验证。
在浏览器中访问如下地址,查看服务是否启动成功。
http://{部署服务器的IP地址}:{部署服务器的端口号}/rdm_{应用的唯一标识}_app/services/index.html例如:
http://127.0.0.1:8003/rdm_123456_app/services/index.html
转入应用运行态登录页面,输入登录账号和登录密码,成功登录并进入应用运行态页面,即表示启动成功。
- 方式一:查看服务日志
配置解密(可选)
当在Maven工程中引入SDK包后,如果用户已通过加密算法对敏感信息进行加密,可按照以下步骤进行二次开发,实现服务启动时的自动解密功能,保障运行时配置的可用性。
以下将以Base64加密为例,指导您如何通过二次开发实现服务启动时的自动解密功能。
- 在配置文件(如“application.properties”)中,添加加密后的配置项。
例如,添加部署阶段已加密的数据库密码。其示例如下:
# 数据库密码(部署阶段已加密) # 格式:{解密前缀}{加密内容} # (XdmNeedDec)为解密前缀,用于标识该配置项需要解密,客户可自定义该前缀 RDS_PASSWORD=(XdmNeedDec)123456 - 创建自定义加密工具类(如“MyCryptoTool”),实现com.huawei.xdm.security.tool.IEncryptTool接口,用于对带特定前缀的加密配置项进行自动解密。
示例代码:
public class MyCryptoTool implements IEncryptTool { // 解密前缀标识,必须与配置文件中加密配置项的前缀保持一致 // 示例:配置文件中需解密项格式为(XdmNeedDec)加密内容 private static final String NEED_DEC_FLAG = "(XdmNeedDec)"; /** * 加密工具优先级设置 * 为确保本工具优先于xDM-F内置工具生效,优先级应设置为高于Ordered.LOWEST_PRECEDENCE * 值越小,优先级越高 * 推荐值:Ordered.LOWEST_PRECEDENCE - 1 * * @return 优先级数值 */ @Override public int getOrder() { return Ordered.LOWEST_PRECEDENCE - 1; } /** * 获取解密前缀,xDM-F通过此方法识别需要解密的配置项 * * @return 解密前缀字符串 */ @Override public String getNeedDecryptPrefix() { return NEED_DEC_FLAG; } /** * 加密方法(当前场景无需实现,返回空字符串即可) * * @param plainText 待加密的明文内容 * @return 加密后的密文字符串 */ @Override public String encrypt(String plainText) { return ""; } /** * 带解密前缀的加密方法(当前场景无需实现,返回空字符串即可) * * @param plainText 待加密的明文内容 * @return 带解密前缀的加密字符串 */ @Override public String encryptWithPrefix(String plainText) { return ""; } /** * 解密方法,xDM-F会自动调用此方法解密带指定前缀的配置项 * 示例使用Base64,请根据实际加密算法替换此处逻辑 * * * @param cipherText 待解密的加密内容 * @return 解密后的明文 */ @Override public String decrypt(String cipherText) { if (StringUtils.isEmpty(cipherText)) { return cipherText; } byte[] decode = Base64.getDecoder().decode(cipherText.getBytes(StandardCharsets.UTF_8)); return new String(decode, StandardCharsets.UTF_8); } /** * 控制是否加载指定配置项。true:加载并使用此工具;false:忽略此工具 * 必须返回true,否则当前加密工具类不会被xDM-F启用。 * * @param configKey 配置项键名 * @return 始终返回true,启用当前工具 */ @Override public boolean needLoad(String configKey) { return true; } } - 在项目的“resources”目录下,创建SPI配置文件“/META-INF/services/com.huawei.xdm.security.tool.IEncryptTool”,并写入自定义解密工具类(MyCryptoTool)的全路径类名。
SPI配置文件示例:
com.huawei.it.crypt.MyCryptoTool
完成以上步骤后,您的项目核心结构应如下所示:
项目结构 ├── src │ ├── main │ │ ├── java │ │ │ └── com | | | | └── huawei | | | | | ├── it | | | | | | └── crypt | | | | | | | └── MyCryptoTool | | | | | └── xdm | | | | | | └── demo02 | | | | | | | └── Demo02Application │ │ └── resources │ │ │ ├── META-INF | | | | └── services | | | | | └── com.huawei.xdm.security.tool.IEncryptTool | | | ├── application-sdk.properties | | | └── license.dat └── lib | └── xDM-F的SDK依赖包
异常处理
引入SDK包下的文件到Maven工程时,可能会存在引入失败的情况。如下图所示:
您可以参考如下操作进行修复。
- 右键单击引入失败的JAR包,选择“Add as Library”。
- 在弹出的窗口中,选择“Classes”,单击“OK”。
- 在弹出的窗口中,将“Level”设置为“Module Library”,单击“OK”。
图3 添加Library