1. 前言
神州泰岳基于某客户需求, “希望通过SaaS模式实现“即开即用”的全流程数字化服务,通过整合CAD、CAE、CAM等核心工业软件打造云桌面+工业软件平台”,构建了 UltraDesktop云端智能化解决方案。平台通过云端部署,用户无需下载安装,仅需浏览器登录即可使用各类工业软件,大幅降低企业IT投入与运维成本。针对中小企业工业软件购买和使用痛点,平台推出灵活的订阅套餐,企业可按照自己实际需求进行购买,同时企业还可以在平台进行灵活的人员及角色配置。
2. 业务背景
解决方案在AWS上构建,需要通过整合一套完整的基于浏览器的云桌面方案。云桌面方案能够提供用户组织管理、权限管理、云桌面管理和调度、云桌面高效连接以及资源池、文件共享与漫游等能力和所需的SDK以及API。
解决的行业痛点:
1)软件购买成本高
传统工业软件单套授权费用高达数十万元,中小企业无力承担,大型企业采购多模块时成本剧增。
2)软件试错成本高
制造业细分领域需求差异大(如汽车与电子行业CAE需求不同),企业缺乏试错成本,常购买“不适用”的软件。
3)软件运维成本高
传统工业软件需本地部署,安装过程繁琐,并且版本更新不及时。
4)教学受限于软件授权与硬件条件
高效实验室需高价采购软件授权,且学生仅能在特定机房使用,个人学习受设备性能限制。
5)团队无法协作
传统软件数据存储于本地,供应链上下游企业协作需频繁传输文件,会造成版本文件混乱等问题。
整体方案的技术优势:
1)全栈云端化架构
基于分布式云计算技术,实现工业软件全流程云端部署,用户无需本地安装即可通过浏览器直接调用CAD/CAE/CAM等软件,支持高并发计算任务与实时数据交互。
2)多工业软件无缝兼容
集成多类工业软件,平台内的文件可在多个工业软件间进行互转。
3)企业级数据安全保障
采用加密传输与存储隔离技术,结合权限分级管理,确保工业核心数据零泄漏风险。
4)弹性资源智能调度
动态分配算力资源,自动匹配用户访问并发,提升资源利用率。
3. 客户成功评价指标
某集团企业依托云桌面+工业软件平台,成功实现智能制造数字化转型。通过云端部署,企业构建了高效协同的设计生态,设计团队依托平台集成的CAD软件开展云端建模,打破传统物理空间限制;通过种类丰富的CAE仿真软件,在云平台实现复杂工况模拟,显著降低研发测试成本;通过创新的订阅模式,将传统千万级工业软件采购费用转化为灵活可扩展的十万级年度服务费,大幅降低企业数字化门槛。
4. 基于Amazon DCV的云桌面解决方案优势
1)技术领先性:业界领先的远程显示协议
自适应流媒体技术
采用先进的H.264/H.265硬件编码,相比传统VNC/RDP协议带宽消耗降低60-80%
智能网络自适应算法,根据带宽条件动态调整画质(1080p到4K分辨率支持)
超低延迟传输技术,端到端延迟控制在50ms以内,实现近乎实时的交互体验
GPU加速优化
原生支持NVIDIA GRID、AMD FirePro等专业显卡,充分释放GPU计算能力
针对CAD、3D建模、视频编辑等图形密集型应用深度优化
支持CUDA、OpenCL等并行计算框架,满足科学计算和AI训练需求
2)AWS生态集成:与AWS服务无缝集成
身份认证与权限管理
支持Active Directory联合身份验证,无缝对接企业现有用户体系
细粒度权限控制,支持基于角色的访问控制(RBAC)
存储与数据管理
与Amazon S3无缝集成,提供海量用户数据存储和备份
支持Amazon FSx共享文件系统,实现多用户协作和数据共享
集成AWS Backup服务,提供自动化数据保护和灾难恢复
监控与日志
原生集成Amazon CloudWatch,提供实时性能监控和告警
支持AWS CloudTrail审计日志,满足合规性要求
3)企业级特性:安全、可靠、可扩展
多层安全防护
端到端TLS 1.3加密传输,确保数据传输安全
支持多因素认证(MFA),包括硬件令牌、生物识别等方式
会话隔离技术,确保用户间数据完全隔离,防止数据泄露
支持网络访问控制列表(ACL)和安全组,实现网络层面的精细化访问控制
高可用性架构
支持多可用区(Multi-AZ)部署,提供99.9%以上的服务可用性
自动故障转移和负载均衡,确保服务连续性
支持会话持久化和断线重连,网络中断后可自动恢复会话状态
弹性扩展能力
基于Amazon EC2/ECS/EKS的容器化部署,支持秒级扩缩容
智能负载均衡算法,根据CPU、内存、GPU使用率动态分配资源
支持Spot实例,在保证性能的前提下降低成本高达90%
4)成本效益:按需付费,资源优化
灵活的计费模式
按实际使用时长计费,避免资源闲置浪费
支持预留实例和Savings Plans,长期使用可节省成本
智能资源调度,自动关闭空闲会话,最大化资源利用率
成本优化策略
支持混合实例类型,根据工作负载特性选择最优实例配置
集成AWS Cost Explorer,提供详细的成本分析和优化建议
自动化生命周期管理,闲置资源自动回收,避免不必要的费用
5)用户体验:接近本地桌面的使用体验
跨平台兼容性
支持Windows、macOS、Linux原生客户端,以及Web客户端
统一的用户界面和操作体验,降低用户学习成本
丰富的交互功能
支持多显示器配置,最多支持4个4K显示器同时输出
完整的外设支持,包括USB重定向、音频双向传输、打印机共享
支持文件拖拽、剪贴板同步等便捷操作,提升工作效率
个性化定制
支持用户配置文件漫游,个人设置和应用配置自动同步
可定制的桌面环境和应用程序集,满足不同角色用户需求
支持多语言界面和输入法,适应全球化部署需求
6)运维简化:自动化管理和监控
全方位监控体系
实时性能监控,包括CPU、内存、网络、GPU等关键指标
用户行为分析,提供使用模式洞察和容量规划建议
集成AWS Systems Manager,实现统一的系统管理和自动化运维
DevOps集成
支持Infrastructure as Code(IaC),通过AWS CloudFormation或Terraform实现基础设施自动化
集成CI/CD流水线,支持应用程序的自动化部署和更新
提供丰富的API接口,便于与第三方管理系统集成
7)综合价值体现
这种基于Amazon DCV的云桌面设计不仅在技术层面实现了突破,更在商业价值上为企业带来显著收益:
业务连续性保障:通过高可用架构和灾难恢复机制,确保关键业务7×24小时不间断运行,避免因系统故障造成的业务损失
安全合规增强:满足SOC 2、ISO 27001、GDPR等国际安全合规标准,为金融、医疗、政府等高安全要求行业提供可信赖的解决方案。
运营效率提升:通过自动化运维和智能监控,IT运维效率提升50%以上,释放人力资源投入到更有价值的创新工作中。
成本结构优化:相比传统VDI解决方案,总体拥有成本(TCO)降低30-50%,同时提供更好的性能和用户体验。
创新能力赋能:为企业数字化转型提供强有力的基础设施支撑,加速新技术应用和业务模式创新。
这种设计使得云桌面解决方案能够提供企业级的性能、安全性和可扩展性,同时保持良好的用户体验和成本控制,真正实现了技术先进性与商业价值的完美结合。
5. 基于 Amazon DCV的Web远程桌面应用管理平台架构设计
5.1解决方案设计
平台概述
该云桌面管理平台采用现代化的微服务架构设计,构建在AWS云基础设施之上,为企业用户和系统管理员提供安全、高效、可扩展的云桌面服务。整个平台通过分层设计实现了从用户接入到底层资源管理的全链路覆盖。
用户接入层
平台支持不同角色的用户访问。企业通过专用接入通道享受定制化的云桌面服务,普通业务用户通过标准化接口获得日常办公所需的云桌面环境,系统管理员则拥有平台管理权限,负责整体系统的运维和监控。这种多角色设计确保了不同用户群体的差异化需求得到有效满足。
软件管理与编排层
在软件管理层面,平台集成了AWS的镜像管理服务和Amazon EKS容器编排平台。软件包管理模块负责维护各类应用软件的版本控制和分发部署,确保用户能够获得最新且稳定的软件环境。平台将Amazon EKS作为容器编排的核心,提供了强大的微服务管理能力,支持服务的自动扩缩容和故障恢复。特别值得注意的是,平台采用了iframe嵌套技术,使用户能够在Web浏览器中无缝访问云桌面,大大提升了使用便利性。
业务服务核心层
CSMS(Customer Sales Management System )管理后台是客户整个平台的核心,后台模块专注于系统运行的稳定性和安全性。用户授权服务提供统一的身份认证和单点登录功能;软件授权模块实现了细粒度的软件访问控制,确保服务的安全性。
CSMS应用前端,为主要的用户接入口,通过软件试用、软件购买等能力模块,连接到桌面实例运行层,进行实例的启动运行和呈现。
桌面实例运行层
在桌面实例层,平台采用了Pool、用户组的设计理念,通过资源池化实现了高效的资源利用。每个用户组都配置了专门的Amazon EC2实例作为云桌面载体,这些实例根据用户需求预装了不同的软件环境。特别是对于工程设计用户,平台提供了专门的CAD/CAE软件环境,配备了高性能的GPU资源,满足图形密集型应用的计算需求。
基础设施管理层
Ultra Desktop平台作为基础设施的管理核心,提供了全方位的服务管理能力。用户组织管理模块支持复杂的企业组织架构,实现了层级化的用户管理;云桌面管理模块负责桌面实例的全生命周期管理,包括创建、配置、监控和回收;云桌面高级功能模块提供了诸如桌面共享、文件传输、打印重定向等增值服务;云桌面监控模块实时监控系统性能和用户使用情况,为容量规划和故障预警提供数据支撑;数据管理模块则确保用户数据的安全备份和快速恢复。
资源池与镜像管理
在底层资源管理方面,平台构建了GPU资源池和存储资源池,通过智能调度算法实现资源的动态分配和优化利用。GPU资源池专门为图形处理和科学计算提供强大的并行计算能力,而存储资源池则提供了高性能、高可靠的数据存储服务。
AMI镜像管理系统作为平台的重要组成部分,负责维护各种预配置的系统镜像和应用镜像。通过版本化管理和自动化部署,确保新桌面实例能够快速启动并提供一致的用户体验。
技术优势与特色
该架构的最大优势在于其高度的模块化和可扩展性。通过微服务架构,各个功能模块可以独立开发、部署和扩展,大大提高了系统的灵活性和可维护性。同时,基于AWS云服务的设计确保了平台具备企业级的可靠性和安全性。
平台特别针对专业应用场景进行了优化,不仅支持常规的办公应用,还能够很好地支持CAD、CAE等专业设计软件,满足工程设计、科学研究等高性能计算需求。通过资源池化和智能调度,平台能够根据实际需求动态分配计算资源,既保证了性能,又实现了成本的有效控制。
5.2 系统架构设计
1)用户发起访问请求
用户通过域名访问云桌面管理端网站,发起云桌面连接请求
用户在浏览器中输入云桌面服务域名,系统自动识别用户身份并验证访问权限,为后续的桌面连接建立安全通道。
2)负载均衡智能分发
应用负载均衡器将请求转发到前端服务
Application Load Balancer根据当前系统负载情况和用户访问信息,智能选择最优的前端服务节点,确保用户获得最佳的访问体验和响应速度。
3)前端服务处理转发
前端服务将请求转发到后端服务
前端服务完成用户身份验证、权限校验和会话管理后,将经过预处理的请求安全转发至后端核心服务模块,实现前后端的有效解耦。
4)云桌面实例调度
Ultradesktop-service调度云桌面实例,并将连接信息返回
后端服务根据用户权限和资源需求,智能调度最适合的云桌面实例,生成安全的连接凭证和会话信息,并将这些关键信息返回给前端服务。
5)建立桌面连接
用户连接并登录云桌面
用户通过DCV客户端或Web浏览器,使用系统返回的连接信息建立与云桌面实例的安全连接,完成身份认证后成功登录个人专属的云桌面环境。
6)桌面环境管理
管理员登录跳板机
系统管理员通过专用的跳板机进行运维管理,实现对云桌面基础设施的监控、维护和故障处理,确保整体服务的稳定运行。
7)服务统一管控
通过跳板机管理和维护Ultradesktop-Service及其它服务
管理员利用跳板机的集中管理能力,对Ultradesktop-Service核心服务以及相关的微服务组件进行统一的配置管理、性能优化和安全加固,保障云桌面平台的高可用性和安全性。
6. 具体代码实现及部署解决方案
6.1业务流实现
6.1.1 用户认证与授权流程
1)身份验证服务实现,前端用户登录管理平台后先根据授权过的资源ID与用户编码获取临时token,用户拿着token信息会请求dcv server进行认证。
@GetMapping("token/{resourceId}/{userCode}")
@Operation(summary = "获取dcv token")
@OperateLog(type = OperateTypeEnum.GET)
@PreAuthorize("hasAuthority('cloudesk:instance:getDcvToken2') or hasRole('SUPER_ADMIN')")
public Result<Map<String,String>> getDcvToken(@PathVariable("resourceId") String resourceId,@PathVariable("userCode") String userCode) {
LambdaQueryWrapper<InstanceEntity> instanceWrapper = Wrappers.lambdaQuery();
instanceWrapper.eq(InstanceEntity::getEc2InstanceId,resourceId).eq(InstanceEntity::getUserCode,userCode).notIn(InstanceEntity::getInstanceStatus, Arrays.asList(
CommonConstant.INSTANCE_STATUS.TERMINATED,
CommonConstant.INSTANCE_STATUS.SHUTTING_DOWN));
InstanceEntity instanceEntity = instanceService.getOne(instanceWrapper);
if(instanceEntity == null){
return Result.error("用户与云桌面不匹配");
}
Map<String, String> result = new HashMap<>();
String dcvToken = dcvService.getDcvToken(resourceId);
Long dcvTokenExpire = sysParamsService.getLong("DCV_TOKEN_EXPIRE");
result.put("expire", String.valueOf(dcvTokenExpire));
result.put("token", dcvToken);
return Result.ok(result);
}
2)dcv server再回调应用端,应用端根据token信息获取用户信息,认证通过后即可链接云桌面。
@PostMapping("/authenticator")
@Operation(summary = "dcv回调接口")
public ResponseEntity<String> dcvAuthenticator(@RequestParam String authenticationToken) {
String resourceId = tokenStoreCache.getDcvUser(authenticationToken);
String result;
if(resourceId == null) {
result = String.format("<auth result=\"no\"><message>%s</message></auth>", "invalid token");
}else{
LambdaQueryWrapper<InstanceEntity> instanceWrapper = Wrappers.lambdaQuery();
instanceWrapper.eq(InstanceEntity::getEc2InstanceId,resourceId);
InstanceEntity instanceEntity = instanceService.getOne(instanceWrapper);
String userCode = instanceEntity.getUserCode();
LambdaQueryWrapper<SysUserEntity> wrapper = Wrappers.lambdaQuery();
wrapper.eq(SysUserEntity::getCode, userCode);
SysUserEntity sysUser = sysUserService.getOne(wrapper);
String netBiosName = sysParamsService.getString("NET_BIOS_NAME");
if("0".equals(netBiosName)){
result = String.format("<auth result=\"yes\"><username>%s</username></auth>", sysUser.getUsername());
}else{
result = String.format("<auth result=\"yes\"><username>%s</username></auth>", netBiosName+"\\"+sysUser.getUsername());
}
}
tokenStoreCache.deleteDcvUser(authenticationToken);
final HttpHeaders httpHeaders= new HttpHeaders();
httpHeaders.setContentType(MediaType.TEXT_XML);
return new ResponseEntity<>(result, httpHeaders, HttpStatus.OK);
}
3)认证流程图
6.1.2 软件授权管理
主要使用TrueLicense进行授权,TrueLicense 是一个Java软件许可证管理库,可以用来生成、验证和管理软件许可证。
6.1.3 云桌面实例管理
1)资源池管理服务
可以进行资源池的创建、修改、删除、认证与授权等操作,授权主要是授予哪些用户能使用资源池。同时还支持资源池的自动扩缩容。
@PostMapping
@Operation(summary = "创建资源池")
@OperateLog(type = OperateTypeEnum.INSERT)
@PreAuthorize("hasAuthority('cloudesk:instancepool:save') or hasRole('SUPER_ADMIN')")
public Result<String> save(@RequestBody @Valid CloudInstancePoolSaveVO vo) throws IOException {
instanceService.validateImageSize(vo.getAmiId(), vo.getSystemDiskSize(), vo.getResourceName(), "");
return Result.ok(service.save(vo));
}
@PutMapping
@Operation(summary = "修改资源池")
@OperateLog(type = OperateTypeEnum.UPDATE)
@PreAuthorize("hasAuthority('cloudesk:instancepool:update') or hasRole('SUPER_ADMIN')")
public Result<Void> update(@RequestBody @Valid CloudInstancePoolUpdateVO vo) throws IOException {
service.update(vo);
return Result.ok();
}
@DeleteMapping
@Operation(summary = "删除云资源池")
@OperateLog(type = OperateTypeEnum.DELETE)
@PreAuthorize("hasAuthority('cloudesk:instancepool:delete') or hasRole('SUPER_ADMIN')")
public Result<String> delete(@RequestBody List<Long> idList) {
service.delete(idList);
return Result.ok();
}
@PostMapping("authorize")
@Operation(summary = "资源池授权与解授权")
@OperateLog(type = OperateTypeEnum.UPDATE)
@PreAuthorize("hasRole('SUPER_ADMIN')")
public Result<Void> authorize(@RequestBody @Valid PoolAuthorizeVO vo) {
instancePoolBindUserService.authorize(vo);
return Result.ok();
}
2)资源池管理界面
6.1.4 DCV会话管理
主要通过下发SSM命令来管理会话:
/**
批量检查实例是否有活跃的DCV会话
@param instanceIds 实例ID列表
@return 实例ID到是否有会话的映射,true表示有会话,false表示无会话
*/
public Map<String, Boolean> getBatchDCVSessionExists(List<String> instanceIds) {
if (CollectionUtils.isEmpty(instanceIds)) {
return new HashMap<>();
}
List<String> commands = Arrays.asList(
"$dcv = 'C:\\Program Files\\NICE\\DCV\\Server\\bin\\dcv.exe'",
"$s = & $dcv describe-session console -j 2>$null",
"if ($s -and $s -match '\"id\"') { Write-Output 'true' } else { Write-Output 'false' }"
);
try {
String[] instanceArray = instanceIds.toArray(new String[0]);
Map<String, String> results = executeSSMCommandWithBatchResult(instanceArray, commands, "checkDCVSessionExists");
Map<String, Boolean> sessionExistsMap = new HashMap<>();
for (Map.Entry<String, String> entry : results.entrySet()) {
String instanceId = entry.getKey();
String result = entry.getValue();
sessionExistsMap.put(instanceId, parseSessionExistsResult(result));
}
return sessionExistsMap;
} catch (Exception e) {
log.error("批量检查DCV会话是否存在失败: {}", e.getMessage());
// 返回默认值false
Map<String, Boolean> defaultMap = new HashMap<>();
for (String instanceId : instanceIds) {
defaultMap.put(instanceId, false);
}
return defaultMap;
}
}
6.2 部署实现
通过docker compose部署单机版
1)mysql+redis部署
networks:
app-network:
driver: bridge
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: youpassword
TZ: Asia/Shanghai
ports:
- "3306:3306"
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/config/my.cnf:/etc/mysql/my.cnf
- ./mysql/init:/docker-entrypoint-initdb.d
- ./mysql/log:/var/log/mysql
- ./mysql/mysql-files:/var/lib/mysql-files
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--max_connections=1000
--default-time-zone='+08:00'
restart: always
networks:
- app-network
redis:
image: redis:latest
command: redis-server --appendonly yes --requirepass "youpassword"
ports:
- "6379:6379"
restart: always
volumes:
- ./redis/data:/data
networks:
- app-network
networks:
cloud-desktop_app-network:
external: true
2)应用部署
services:
upcloudx-boot:
image: accountId.dkr.ecr.us-east-1.amazonaws.com/upcloudx-boot:v1.9
container_name: upcloudx-boot
ports:
- 8088:8080
environment:
- HOST_CPU_SERIAL=${HOST_CPU_SERIAL}
- HOST_BOARD_SERIAL=${HOST_BOARD_SERIAL}
- HOST_IP=${HOST_IP}
- SPRING_PROFILES_ACTIVE=prod
- JAVA_OPTS=-Xms1024M -Xmx1024M -Dlogging.config=/app/config/logback.xml
- CLOUDESK_LICENSE_PATH=/app/config/license.lic
- DOMAIN=https://cloudesk.upcloudx.cn/upcloudx-boot-server
- TZ=Asia/Shanghai
volumes:
- /root/cloud-desktop/upcloudx-boot/upload:/app/upload
- /root/cloud-desktop/upcloudx-boot/config:/app/config
- /etc/localtime:/etc/localtime
restart: always
networks:
- cloud-desktop_app-network
upcloudx-boot-web:
image: accountId.dkr.ecr.us-east-1.amazonaws.com/upcloudx-boot-web:v1.9
container_name: upcloudx-boot-web
ports:
- 80:80
- 8443:8443
restart: always
environment:
- SERVER_IP=10.0.0.246
- BACKEND_URL=http://upcloudx-boot:8080
- DCV_URL=https://cloudesk.upcloudx.cn:8443
networks:
- cloud-desktop_app-network
6.3 调用实现
1)通过传入资源id、用户编码、任务id来获取DCV 的 Web链接
@GetMapping("/connection/{resourceId}/{userCode}")
@Operation(summary = "获取DCV连接信息")
@OperateLog(type = OperateTypeEnum.GET)
@PreAuthorize("hasAuthority('cloudesk:instance:getDcvConnection') or hasRole('SUPER_ADMIN')")
public Result<Map<String,String>> getDcvConnectionInfo(
@PathVariable("resourceId") String resourceId,
@PathVariable("userCode") String userCode,
@RequestParam(value = "taskId", required = false) String taskId) {
return dcvService.getDcvConnectionInfo(resourceId, userCode, taskId);
}
2)连接云桌面成功后的效果图
7. 总结
神州泰岳基于Amazon DCV构建云桌面+工业软件平台,通过微服务架构整合CAD/CAE/CAM等工业软件,实现浏览器即开即用。采用资源池化、智能调度、容器编排技术,提供用户管理、授权、会话管理、文件共享与漫游等完整能力,解决传统工业软件成本高、部署难、协作弱等痛点,助力企业数字化转型。
*前述特定亚马逊云科技生成式人工智能相关的服务目前在亚马逊云科技海外区域可用。亚马逊云科技中国区域相关云服务由西云数据和光环新网运营,具体信息以中国区域官网为准。
本篇作者