• [技术干货] 通过DME运行态的多租户能力实现数据的逻辑隔离
    操作场景假设A公司在工业数字主线-数据模型驱动引擎(Data Model Engine,简称DME)上开发了一个应用(PDM),希望将该应用授权给B公司和C公司使用,且两个公司之间的数据不互通。此时,用户可以通过DME提供的多租户能力,创建多个租户,为B公司和C公司的数据进行逻辑隔离。操作步骤步骤1:登录DME平台登录IDT控制台。在左侧导航栏中,单击“应用管理”,进入“应用管理”页面。找到待操作的PDM应用,单击“登录”,进入该应用的DME平台。在控制台界面,单击上方的“运行态”页签,进入DME平台的运行态页面。步骤2:创建租户在左侧导航栏中,选择“数据模型管理 > 数据实例”,进入“数据实例”页面。选择“Tenant”数据实体,单击“创建”。​在展开的页面,填写如下主要信息。​名称:tenantB。描述:B公司。租户编码:tenantB。数据源:默认为DefaultDataSource。失效标识:默认为false。        4. ​​​​单击“确定”。        5. 重复执行2-4,创建租户tenantC。步骤3:隔离租户数据在PDM应用的管理系统中,为B公司和C公司添加“tenantid”必填参数。即,当B公司或者C公司对PDM应用进行增删改查操作时,发送的请求头和消息体中必须带有tenantid。请求头:POST http://域名/App名称/services/dynamic/api/实体名称/请求方法 Content-Type: Application/Json Content-Length: Content Length X-AUTH-TOKEN: Token ID tenantid: 租户编码 { "params": { "id": "唯一编码", "tenant": { "id": 租户编码 }, ...... } }以创建单位类型为例,请求示例如下:POST http://support.huaweicloud.com/DmeTestApp/services/dynamic/api/UnitType/create Content-Type: Application/Json Content-Length: Content Length X-AUTH-TOKEN: XXXXXXXXXX tenantid: tenantB { "params": { "id": "439166695949471744", "tenant": { "id":tenantB }, "nameEn": "UnitTest", "name": "UnitTest", "descriptionEn": "", "descriptionCn": "", "unitGbFlag": true } }验证登录DME平台,进入运行态页面。在左侧导航栏中,选择“基础数据管理 > 计量单位”,进入“计量单位”页面。发现在计量单位页面下无“UnitTest”的数据。通过API方式,发送请求头和消息体均带有“tenantid”为“tenantB”的查询请求。POST http://support.huaweicloud.com/DmeTestApp/services/dynamic/api/UnitType/find/1/10 Content-Type: Application/Json Content-Length: Content Length X-AUTH-TOKEN: XXXXXXXXXX tenantid: tenantB { "params": { "sort": "DESC", "orderBy": "lastUpdateTime", "filter": { "joiner":"string", "conditions": [] }, "isNeedTotal": true } }发现可查询到刚创建的单位类型。
  • 【已重新上线】关于《轻松入门容器基础操作》等6个沙箱实验下线优化的通知
    沙箱实验《轻松入门容器基础操作》、《应用容器化改造》、《GaussDB 部署》、《GaussDB 客户端实践》、《GaussDB基础操作编程-Java》、《数据仓库服务GaussDB(DWS)权限管理》于2023年2月3日下线优化,实验下线后将无法开始实验,下线前的实验操作记录可在【开发者个人中心】的【我的实验】页面中进行查看,请知悉以下预计重新上线时间。《轻松入门容器基础操作》、《应用容器化改造》:2023年2月10日《GaussDB 部署》、《GaussDB 客户端实践》、《GaussDB基础操作编程-Java》、《数据仓库服务GaussDB(DWS)权限管理》:2023年2月6日感谢您的关注,欢迎到沙箱实验室,体验更多精彩实验!发布日期:2023年2月3日
  • 关于微认证《使用昇腾弹性云服务器实现目标检测应用》下线优化的通知
    尊敬的客户:您好!为保证您获得最佳的学习与实验体验,华为云开发者学堂于2023年1月30日对微认证《使用昇腾弹性云服务器实现目标检测应用》进行下线优化,预计于2023年4月10日重新上线,届时请您关注华为云开发者学堂资讯专栏-业务动态通知。为此,我们将采取以下措施:1.对于已购买该微认证并通过考试领取证书的客户,原证书在证书有效期内仍有效,并与课程优化后的证书拥有同等效力;2.对于已购买该微认证但未通过考试且仍有考试机会的客户,可在重新上线后进行新课程学习、实验,参加考试并领取证书;3.对于已购买该微认证但未完成实验操作的客户,请您关注华为云开发者学堂资讯专栏-业务动态的上线通知,待实验优化重新上线后再前往沙箱开展实验。如您有任何问题,可随时通过工单或者服务热线(+86-4000-955-988 )与我们联系。感谢您对华为云微认证的支持!发布日期:2023年1月30日
  • 【已上线】关于微认证《基于Spark实现车主驾驶行为分析》下线优化的通知
    尊敬的客户:您好!为保证您获得最佳的学习与实验体验,华为云开发者学堂于2023年1月18日对微认证《基于Spark实现车主驾驶行为分析》进行下线优化,预计于2023年2月25日重新上线,届时请您关注华为云开发者学堂资讯专栏-业务动态通知。为此,我们将采取以下措施:1.对于已购买该微认证并通过考试领取证书的客户,原证书在证书有效期内仍有效,并与课程优化后的证书拥有同等效力;2.对于已购买该微认证但未通过考试且仍有考试机会的客户,可在重新上线后进行新课程学习、实验,参加考试并领取证书;3.对于已购买该微认证但未完成实验操作的客户,请您关注华为云开发者学堂资讯专栏-业务动态的上线通知,待实验优化重新上线后再前往沙箱开展实验。如您有任何问题,可随时通过工单或者服务热线(+86-4000-955-988 )与我们联系。感谢您对华为云微认证的支持!发布日期:2023年1月18日
  • 关于《在鲲鹏BMS上进行WRF部署与性能优化》等4个沙箱实验停止服务的通知
     沙箱实验《在鲲鹏BMS上进行WRF部署与性能优化》、《基于鲲鹏应用使能套件进行NUMA亲和性实践》、《基于鲲鹏应用使能套件进行Hadoop调优》、《通过鲲鹏开发套件实现Hyper Tuner性能调优》即将于2023年1月18日正式停止服务,实验下线后将无法开始实验,请知悉。感谢您的关注,欢迎到沙箱实验室,体验更多精彩实验!发布日期:2023年1月18日
  • [技术干货] 针对iDME开发共建问题如何提交工单?
    前提条件已参考配置工单提交权限配置工单提交权限。说明:假设A是企业管理员,B为IAM用户当A启用提单策略后,需参考配置工单提交权限为B配置工单提交权限。根据支持计划权益项,进行提单限制,如未购买支持计划不可以提交技术类工单。伙伴帐号购买支持计划后有提单次数限制,如购买标准级后每月可以提交30次,超出后需要购买工单增购包(10个工单/包)来提升工单提交次数。操作步骤登录管理控制台。单击右上角“工单”,进入“工单管理”页面。(说明:在低分辨率情况下,请单击“更多 > 工单”)单击左侧导航栏的“新建工单”,选择问题所属业务类型或产品类型。​​​​​​​4. 选择问题类型后,根据服务策略,您会遇到以下两种情况:情况一:a. 如下图所示,在新建工单区域,单击“去新建”。图2 新建工单b. 新建工单时,选择区域、填写问题描述、上传文件(可选)。c. 在“我的相关信息”区域,输入或选择弹性公网IP、云服务器ID、远程登录端口(可选)等参数。d. 在“通过以下方式提醒我工单进展”区域,勾选工单进展的提醒方式,并输入对应信息。勾选“我已阅读并同意《用户授权书》”,单击“提交”。返回“我的工单”页面,可以查看到已经 提交的工单列表。图3 提交工单情况二:a. 如下图所示,选择问题后,优先进入智能客服自助服务。与智能客服对话后如果问题未解决,可通过单击“转人工”按钮触发工单填写流程。图4 智能客服内新建工单b. 新建工单时,选择区域、填写问题描述、上传文件(可选)。c. 在“我的相关信息”区域,输入或选择弹性公网IP、云服务器ID、远程登录端口(可选)等参数。d. 在“通过以下方式提醒我工单进展”区域,勾选工单进展的提醒方式,并输入对应信息。勾选“我已阅读并同意《用户授权书》”,单击“提交”。单击右侧“我的工单”入口,可以查看到已经提交的工单列表。图5 智能客服内提交工单​
  • [业务动态] 关于沙箱实验《使用DRS实现数据实时同步》下线优化的通知
     沙箱实验《使用DRS实现数据实时同步》即将于2023年1月16日下线进行优化刷新,实验下线后将无法开始实验,下线前的实验操作记录可在【开发者个人中心】的【我的实验】页面中进行查看,预计2023年2月4日重新上线,请知悉。感谢您的关注,欢迎到沙箱实验室,体验更多精彩实验!发布日期:2023年1月16日
  • [业务动态] 关于沙箱实验《基于IoT边缘实现MQTT协议设备接入》下线优化的通知
       沙箱实验《基于IoT边缘实现MQTT协议设备接入》即将于2023年1月13日下线进行优化刷新,实验下线后将无法开始实验,下线前的实验操作记录可在【开发者个人中心】的【我的实验】页面中进行查看,预计2023年2月4日重新上线,请知悉。感谢您的关注,欢迎到沙箱实验室,体验更多精彩实验!发布日期:2023年1月13日
  • [技术干货] 如何理解华为账号、华为云账户、IAM用户、物理隔离、逻辑多租等概念?
    一、华为账号、云租户、用户等一些名词和概念的定义和含义澄清在初次接触华为工业软件云的时候,会经常遇到一些名词和概念,如:“华为账号”、“华为云账号”、“租户”、“IAM用户”等等,初学者很容易弄混或者不理解这些名词概念。下面,我先试着澄清这些名词概念的区别和含义。1.我们先看看登录华为云时用到的账号:1.1我们在浏览器中输入cid:link_1,点击右上角登录1.2在下面的登录界面中,使用华为账号进行登录第一个输入框,输入华为账号,对于个人通常是手机号或者邮箱地址,根据注册时填的内容填写。1.3登录成功后点击右上角控制台:再点击右上角账号名称,点击基本信息,可以查到华为账号名和华为云租户名。1.4创建IAM用户上述用华为账号登录了华为云的控制台以后,可以在控制台创建多个IAM用户,IAM即统一身份认证的意思。也就是在一个华为云租户下可以创建多个IAM用户。每个IAM用户还可以授予不同权限。点击右上角账户名下的统一身份认证,进入创建IAM用户:1.5创建IAM用户及给IAM用户授权(略),请参考其他案例文档。2.我们再看看在登录DME时,用到的账户和用户名称:在浏览器中输入DME的登录地址:cid:link_0点击管理控制台,进入登录界面,选择IAM用户登录方式,如下图:第一栏,填写在1.3中查询到的华为云租户名;第二栏,填写在1.4中创建的IAM用户名;第三栏,填写创建IAM用户时设置的用户密码。二、DME中数据的物理隔离1.1 不同租户之间的物理隔离这里租户指的是华为云租户,不同的华为云租户,虽然都是使用的华为云DME,但是他们物理上使用不同的数据库,物理上数据就是隔离的。1.2同一租户下不同应用之间的物理隔离同一租户下在DME中创建了不同的应用,在DME中不同的应用也对应了不同的数据库,因此在同一租户下不同应用之间的数据也是物理隔离的1.3同一租户下,不同IAM用户之间的数据隔离吗?同一租户下,如果不同的IAM用户都被授权使用的同一个应用,那么这些用户在这同一个应用中产生的数据是可以互相看到的,这是为了便于多个IAM用户可以协同开发和管理同一个应用。如果同一租户下,不同的IAM用户被授权使用的是不同的应用,那他们之间的数据是互不可见的,因为不同的应用的数据是物理隔离的。1.4DME如何实现数据的逻辑多租?有这样一种使用场景:例如A公司(租户A)在DME上开发了一个应用PDM,A公司需要将该PDM应用授权给B公司和C公司使用,B公司和C公司并不是华为云的新租户,而是使用A公司的租户名,由于B公司和C公司的数据都是使用的同一个PDM应用,因此他们的数据物理上是使用的同一个数据库,但是他们是不同的公司,还是需要数据隔离,这时需要使用逻辑租户,将B公司和C公司的数据进行逻辑隔离,使他们之间互不可见,甚至对A公司也不可见。为了实现上述的逻辑多租,需要以租户A登录DME,登录该PDM应用。进入运行态-数据模型管理-数据实例,在数据实体/关系实体下拉框中选择Tenant,点击创建按钮,填写相应的信息,为B公司和C公司分别创建逻辑租户。如下图,创建了租户编码分别为110和111的B公司和C公司的逻辑租户:由于B和C公司使用的是同一个应用,所有数据模型是一样的,但是数据实例需要隔离。当B或C公司需要增删改查数据时,它们发送的请求头和消息体中必须要带有tenantid。以Postman模拟发送create消息为例:请求头中需要增加tenantid字段:消息体:成功发送上述消息后,就会在Cinema数据库中新增一条租户id为110的数据实例。验证是否新增了该数据实例:如果我们回到DME运行态,在数据模型管理-数据实例,选择Cinema数据实体,查询Cinema的数据实例,这时我们发现看不到刚才增加的这条实例。这是因为,DME只允许看到tenantid为-1的数据实例,其他数据实例被DME隔离了,不可见。为了证明确实增加了这条数据,我们可以用Postman再模拟发送一条查询信息,请求头和消息体重要带上tenantid为110,这样就可以在Postman的响应消息中查到刚才Create的数据实例。以上证实了DME具有数据逻辑多租功能。需要指出的是,数据逻辑多租,不仅仅是指不同逻辑租户之间的数据实例是隔离的,不同租户之间的基础数据也是隔离的,基础数据包括(合法值、分类、属性库的属性、枚举、文件夹等)。
  • 关于《使用MindX SDK开发智能质检应用》等5个微认证下线优化的通知
    尊敬的客户:您好!为保证您获得最佳的学习与实验体验,华为云开发者学堂于2023年1月10日对微认证《使用MindX SDK开发智能质检应用》、《Web应用防火墙WAF安全防护实践》、《通过靶场平台演练增强安全攻防意识》、《黑白棋实时对战游戏开发》、《使用Python爬虫抓取图片》进行下线优化,届时请您关注华为云开发者学堂资讯专栏-业务动态通知。预计重新上线时间如下:《使用MindX SDK开发智能质检应用》、《Web应用防火墙WAF安全防护实践》、《通过靶场平台演练增强安全攻防意识》:2023年3月10日《黑白棋实时对战游戏开发》:2023年2月1日《使用Python爬虫抓取图片》:2023年4月10日为此,我们将采取以下措施:1.对于已购买该微认证并通过考试领取证书的客户,原证书在证书有效期内仍有效,并与课程优化后的证书拥有同等效力;2.对于已购买该微认证但未通过考试且仍有考试机会的客户,可在重新上线后进行新课程学习、实验,参加考试并领取证书;3.对于已购买该微认证但未完成实验操作的客户,请您关注华为云开发者学堂资讯专栏-业务动态的上线通知,待实验优化重新上线后再前往沙箱开展实验。如您有任何问题,可随时通过工单或者服务热线(+86-4000-955-988 )与我们联系。感谢您对华为云微认证的支持!发布日期:2023年1月10日
  • [技术干货] iDME中如何实现生命周期管理和文件管理
         华为工业软件云iDME产品内置了很多功能,合作伙伴ISV可以利用这些内置的功能,快速开发出满足客户需求的功能。本文将介绍如何使用iDME内置的生命周期管理功能和文件管理功能。因为在进行产品或设备的生命周期管理的时候,通常我们也需要在生命周期的各个阶段进行相应的文件归档和管理,iDME的内置功能可以方便的实现这些管理。     我们假设以iDME产品本身为例,对iDME产品本身进行生命周期管理。假设iDME产品遵循IPD开发流程。我们将IPD流程简化为如下几个阶段:概念阶段、计划阶段、开发阶段、验证阶段、发布阶段、生命周期阶段。从每个阶段进入到下一阶段,需要完成相应的决策评审操作。如下图:     在iDME产品开发的每一个阶段,由管理员检出版本,进行相应的编辑活动,例如归档相应的文档,当达到了进入下一个阶段的条件后(例如相应的决策评审通过),由管理员检入版本,将该产品的当前阶段自动调整到下一阶段。下面介绍在iDME中实现上述功能的具体操作。1.创建生命周期管理模板1.1创建业务操作进入运行态-生命周期管理-业务操作,点击创建,输入业务操作的名称等信息,即可创建业务操作。所谓业务操作,就是从一个生命周期的状态进入到下一个状态时,需要进行的操作。对于我们这个iDME的生命周期管理的例子,业务操作就是CHART, TR1~TR6评审。我们可以一个一个的创建出这几个业务操作。如下图:1.2创建状态进入运行态-生命周期管理-业务操作,点击创建,输入相应的名称等信息后即可以创建状态。对于我们这个例子,相应的状态分别是,概念、计划、开发、验证、发布、生命周期。我们可以分别创建出以上6种状态。如下图:1.3创建生命周期模板进入运行态-生命周期管理-生命周期模板,点击创建,输入名称信息,创建一个名为IPD的生命周期模板。点击保存。点击该生命周期模板的阶段信息页签,点击检出-更新,如下图:这是一个简单的流程图的编辑工具。利用该工具,将我们定义的IPD流程图画出来,其中需要用到我们前面已定义的状态和业务操作。下图,是我用该工具画出的IPD流程图:然后,点击检入操作,完成该生命周期模板的编辑。2.创建数据实体和文件夹2.1进入设计态-数据模型管理-数据实体,点击创建,填写相应的名称信息。由于要进行版本的检入检出编辑等操作,父模型选择VersionObject。在基本信息-添加功能列表时,勾选生命周期管理和文件夹管理。2.2 保存和发布该数据实体在应用发布中,发布该数据应用。然后在iDME管理控制台,卸载该应用,并且重新部署该应用,以使得我们设计的数据实体生效。2.3 创建文件夹进入运行态-数据模型管理-文件夹,点击创建文件夹,输入名称等信息,创建iDME生命周期管理文件夹。用同样的方法,在该文件夹下创建多个子文件夹,子文件夹名用各阶段的名称命名,用于归档保存不同阶段的文件。各子文件夹创建完后如下图:3.增加数据实例和进行管理操作3.1设置实例界面显示进入运行态-用户模型管理-数据实体,点击刚创建的数据实体DMEdev进行编辑,将实例界面显示设置为“是“:3.2增加数据实例:进入运行态-数据实例,在数据实体/关系实体下拉列表中,选择DMEdev,点击创建,输入version名称,描述等信息,点确定,生成一条数据实例。如下图:3.3  检出操作我们可以在iDME界面对DMEdev这条M-V数据对象进行检入,检出,修改,上传文档等操作。这和之前介绍的M-V对象操作类似。假设,我们需要在当前状态下进行操作,操作完不改变当前状态:我们找到“iDME广州环境“的这条实例数据,点击数据右侧的检出按钮,在下面的模板值、业务操作、目标状态等信息可以不填信息,这样操作只会修改迭代版本号,而不会更改生命周期的状态。点击确定后,进入检出状态。3.4  编辑-上传文档操作 假定在检出状态,我们需要归档文件。点击这条数据实例右侧的编辑按钮,进入编辑状态。在version.文件夹里选择文件需要上传到的文件夹,例如选择“iDME生命周期管理-概念阶段“文件夹。如果上传的文件长度小于5M,可以点击单文件上传,逐个上传需要归档的文件。如果单个文件大于5M可以选择分块上传或外链上传。可以在同一个文件夹下上传多个文件。点击确定完成数据实例修改和文件上传。如果我们进入到运行态-数据模型管理-文件夹下面,可以观察到对应的文件夹下面有文件上传的信息记录,如下:3.5 检入及改变生命周期状态当我们在编辑态下完成了所有操作,希望检入版本,并使得生命周期的状态也进入到下一个状态。这时,我们点击这条数据右侧的检入操作按钮,在弹出的提示框中,选择正确的模板值,业务操作,以及目标状态。如下图这样选择以后,检入操作将改变迭代版本号,同时使生命周期状态进入到下一个状态。3.6 直接修订和管理员操作“直接修订“操作将使大版本号(业务版本)+1,迭代版本号重新归1。”管理员操作“可以直接修改版本中的一些属性,但不能修改版本号,这和普通M-V对象的操作是一致的。不同的地方是:生命周期管理操作会提示用户选择:模板,业务操作和目标状态。如果选择了,将会发生生命周期状态迁移,如果不选,则不迁移状态。小结:以上以一个最简单的Demo介绍了如何在iDME中进行生命周期管理和文件/文件夹的管理。
  • [技术干货] IES_DME运维手册
    一、启动方式一:DME运行态包分为4个目录:bin、config、lib和suggestion_sql,其中启动所涉及的Jar包在目录lib下。DME的主启动类为 com.huawei.microservice.rdm.RdmApplication,并且启动时需要导入必要的环境变量信息(包括依赖的中间件信息:数据库、MongoDB、Redis、ES、Kafka以及文件存储系统)。开发团队提供了启动脚本模板startxdm.bash,该脚本默认加载路径为/opt/cloud/tenant-service。通过该脚本配置环境变量后,即可通过命令./startxdm.bash一键式启动应用,启动后验证可以采用查看日志(/opt/cloud/logs/iit/)和调用接口的方式。方式二(推荐使用):采用systemd的dme.service启动,启动命令systemctl start dme.service。二、停止方式一:停止DME的Java进程可以采用Linux命令获取当前服务的进程号(jps -l | grep com.huawei.microservice.rdm.RdmApplication),并通过kill命令结束进程。或者通过提供的结束脚本(shutdownxdm.sh)执行命令sh shutdownxdm.sh来结束DME服务进程,结束后验证同样采用命令jps -l | grep com.huawei.microservice.rdm.RdmApplication来检查是否成功关闭。方式二(推荐):采用systemd的dme.service停止,停止命令systemctl stop dme.service。三、监控 3.1 控制台监控通过华为云控制台,实时监控各台虚拟机的使用情况,包括CPU、内存、网络等各种看板,监控服务器的负载水平。3.2 服务器内部监控登陆服务器,通过arthas监控DME服务进程的JVM信息。Step 1: 进入arthas目录:cd /opt/arthas。Step 2: 启动arthas: java -jar arthas-boot.jar。Step 3: 进入DME进程,执行启动命令后可以看到当前的java进程,选择DME服务进程(com.huawei.microservice.rdm.RdmApplication)所对应的数字。见下图,示例为2。Step 4: 通过dashboard命令监控JVM状态,内存使用情况、GC、线程等。四、异常4.1 异常处理情况一:在接口调用发现异常时(后端无响应但进程还在)、监测时发现JVM异常(如OOM等)时,通过两种方式重启DME服务:推荐通过命令systemctl reload dme.service重启DME服务。Kill当前DME服务进程,使用启动脚本startxdm.bash启动服务。情况二:若服务器存活,进程挂了。已通过systemd的dme.service设置了自动重启,能自动监听DME服务是否存在,若不存在自动启动进程。情况三:若服务器挂了。在systemd的dme.service中同步设置了服务器启动时自动重启DME服务。4.2 异常分析(1)OOM已设置如果发生OOM,会将dump文件收集到目录/opt/cloud/dump_logs中,通过dump文件进一步分析OOM原因。(2)服务进程在但不可用此时需要同步信息到DME开发人员进行问题分析:日志信息、发生问题时的操作内容、操作的接口和参数,以及不可用时调用接口的报错信息。服务器宕机或进程挂了进程挂了dme.service会自动重启DME服务,此过程运维人员或用户可能无感知;服务器宕机需要重新启动服务器,服务器启动后dme.service会自动启动DME服务。此过程若有感知,同第(2)点,同步相关信息到DME开发人员进行分析。五、性能问题出现接口性能问题时,需要以下维度的信息:日志调用接口接口参数接口响应时间是否有接口对应的慢SQL日志,有的话也提供出现场景:是压测场景,还是正常访问,或者是偶发场景。
  • [技术干货] IES_DME服务定期健康检查脚本
     #!/bin/bash  # 检查服务是否可用,判断服务状态,会连续进行三次健康检查 function checkHealth() {     currTime=$(date +"%Y-%m-%d %H:%M:%S")     echo "$currTime $@" # 以列表的方式一次性打印所有的参数     ConsulResult=$(curl -s --connect-timeout 500 --max-time 2 http://$1/rdm_$2_app/services/rdm/basic/api/health/check)     echo 1st result $ConsulResult     local health=0     result=$(echo $ConsulResult | grep SUCCESS)     if [[ $result != '' ]]; then         echo "$2 第一次结果健康"     else         sleep 1s         ConsulResult=$(curl -s --connect-timeout 500 --max-time 2 http://$1/rdm_$2_app/services/rdm/basic/api/health/check)         echo 2nd result $ConsulResult         result=$(echo $ConsulResult | grep SUCCESS)         if [[ $result != '' ]]; then             echo "$2 第二次结果健康"         else             sleep 1s             ConsulResult=$(curl -s --connect-timeout 500 --max-time 2 http://$1/rdm_$2_app/services/rdm/basic/api/health/check)             echo 3rd result $ConsulResult             result=$(echo $ConsulResult | grep SUCCESS)             if [[ $result != '' ]]; then                 echo "$2 第三次结果健康"             else                 health=1                 echo "$2 结果不健康"             fi         fi     fi     return $health }  # 检查服务健康状态,并处理异常 function dealCheckResult() {     ipport=$1     name=$2     echo "start $name ======================="     reload_result=$(systemctl status dme.service | grep 'reloading (reload)')     echo service status $reload_result     if [[ $reload_result != '' ]]; then         echo "reloading ~~~~"         exit     fi     checkHealth $ipport $2     health=$?     if [[ $health -eq 0 ]]; then         echo "$name 检查完毕,无问题!"     else         echo "重启 $name 预计2分钟"     status_result=$(systemctl status dme.service | grep 'inactive (dead)')     if [[ $status_result != '' ]]; then             echo "service dead, starting~~~"         systemctl start dme.service             sleep 60s         else                     # 重启服务         systemctl reload dme.service         sleep 60s         # 重新检查一次是否启动成功,不成功则再休眠60s         checkHealth $ipport dme.service         health=$?         currTime=$(date +"%Y-%m-%d %H:%M:%S")         if [[ $health -eq 0 ]]; then             echo "$currTime dme.service 服务已重启完成"         else             echo "$currTime dme.service 服务尚未重启完成,再休眠60s等待"             sleep 60s         fi         fi     fi     echo "end $name 所有处理完毕===========" }  # 获取系统启动时间 uptime=$(cat /proc/uptime) echo "uptime: $uptime" uptimeArr=(${uptime//./ }) startTime=${uptimeArr[0]} echo $startTime a=$(expr $startTime + 1) b=1800 # 系统启动30分钟内不执行 if [[ "$a" -lt "$b" ]]; then     echo "系统启动30分钟内不执行"     exit fi echo "启动时间为$startTime秒,正常执行脚本" dealCheckResult $1 $2 
  • [技术干货] IES_systemd服务进程自动启动脚本
     # 脚本内容 [Unit] Description=dme xdm-f service  [Service] Type=forking Restart=always RestartSec=1 Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/jdk/jdk1.8/bin:/root/bin ExecStart=/usr/bin/env sh /opt/cloud/tenant-service/startxdm.bash ExecStop=/bin/bash /opt/cloud/tenant-service/shutdownxdm.sh ExecReload=/bin/bash /opt/cloud/tenant-service/shutdownxdm.sh /bin/bash /opt/cloud/tenant-service/startxdm.bash SuccessExitStatus=143  [Install] WantedBy=multi-user.target  # 涉及命令  cd /etc/systemd/system  systemctl daemon-reload  systemctl enable dme.service  systemctl start dme.service  systemctl stop dme.service  systemctl reload dme.service  systemctl status dme.service  # DME启动命令  java -Xms12g -Xms12g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/cloud/dump_logs -classpath $LOAD_CLASSPATH $START_CLASS --server.address=${BIND_ADDRESS} -Diit.test=true >/dev/null 2>&1 &  # 执行命令添加定时任务,不同机器ip不同 crontab -e * * * * * sh /opt/cloud/tenant-service/cron.bash 10.21.1.220:8005 pixdmuat >> /opt/cloud/health_logs/health.log 
  • [技术干货] XDM部署文档
    一、资源环境准备XDM部署依赖运行节点,数据交互依赖的中间件包括:数据库、MongoDB、Redis、ES、Kafka以及文件存储系统。因此,在部署XDM前需要确保中间件服务部署完成,并且部署XDM的节点能够正常访问中间件服务。将中间件服务访问方式信息汇总好,需要在XDM启动时写入环境变量。二、部署架构2.1 XDM服务部署所需资源XDM运行态部署需要节点,中间件需要Kafka、数据库、Redis、MongoDB和文件存储系统。部署XDM步骤第一步:登陆XDM部署的服务器第二步:挂载文件系统执行命令mount -t nfs -o vers=3,nolock 10.21.1.120:/ /mnt/sfs_turbo,在服务器上挂载SFS-T文件系统。由于每次服务器重启挂载会失效,因此需要设置开机自启。例如,把挂载命令写入开机自启脚本中。给开机自启脚本授权chmod +x /etc/rc.d/rc.local编辑开机自启脚本vim /etc/rc.d/rc.local在最后一行添加mount -t nfs -o vers=3,nolock 10.21.1.120:/ /mnt/sfs_turbo第三步:安装JDK未安装JDK的服务器需安装JDK1.8,作为XDM服务jar包运行环境。第四步:解压jar包创建目录/opt/cloud/tenant-service作为XDM的部署路径,把运行包解压到该路径下。第五步:编写XDM服务启动脚本此步骤依赖第一点中的资源环境准备,需要将所需中间件信息写入脚本作为启动环境变量。首先创建脚本startxdm.bash然后vim startxdm.bash,并按照如下格式进行编写:# 应用名export APP_NAME=PIXDMUAT# 应用ID:格式(rdm_${应用名小写}_app)export application_subAppId=rdm_pixdmuat_appexport BUCKET_NAME=prpdmiesbuckexport CDM_CLUSTER_ID=67ad4594-d3a2-4c96-a40b-754f4de7f7c9export CDM_END_POINT=http://cdm.cn-south-1.myhuaweicloud.comexport ES_PASSWORD=AAAAAgAAAAAAAAAAAAAAAwAAAAcYniG9vPP+dxwwf4ZJIt2RyFH8WvoRxsQT9hG4zUzVGAAAAAAAAAAAAAAAIKWhMfxyrS4+5A41stF4HOU3Fn324/B2xmCmdndAeUK6# ES端口号export ES_PORT=9200export ES_SCHEMA=http# ES的ip地址export ES_URL=10.21.1.22,10.21.1.23,10.21.1.25# ES用户名export ES_USERNAME=adminexport IAM_END_POINT=http://iam.cn-south-1.myhuaweicloud.com:31943# KAFKA集群信息export KAFKA_BOOTSTRAP_SERVERS=10.21.1.13:9092,10.21.1.14:9092,10.21.1.15:9092export MONGODB_DATABASE=pisxMongdb# MongoDB连接URLexport MONGODB_URI=mongodb://10.21.1.19:27017,10.21.1.20:27017,10.21.1.21:27017export MONGODB_INIT=falseexport OBS_BUCKET_NAME=prpdmiesbuckexport OBS_END_POINT=http://192.168.1.94:9000export PROJECT_ID=0dc1a5fc3700d4b82f0ec0053f3981a4# 数据库export RDS_DATABASE=xdm_f# 数据库连接IPexport RDS_IP=10.21.1.104# 数据库连接密码export RDS_PASSWORD=NSpdmpg@888# 数据库端口号export RDS_PORT=5432# 数据库类型export RDS_TYPE=postgresql# Redis连接IP地址export REDIS_HOST=10.21.1.201# Redis密码export REDIS_PASSWORD=Pisx@1234# Redis端口export REDIS_PORT=6379export RES_AK=IJNHPNTX4TO6JHHZU2KXexport RES_SK=5LWOUtqyb3aGYmjyoQiDR8YG2Y0w8M9A6K0RWjuA# 是否开启httpsexport HTTPS_AUTH=false# 忽略证书export IIT_IGNORE_HTTPS_VERIFY=trueexport rdm_dbType=postgresql export iit_interceptors_auth_enable=falseexport rdm_hibernate_dialect=com.huawei.it.rdm.configuration.XdmPostgresqlDialectexport debug=trueexport server_port=8005 export server_ssl_enabled=false export spring_datasource_driverClassName=org.postgresql.Driverexport spring_datasource_druid_master_url=jdbc:postgresql://${RDS_IP}:${RDS_PORT}/${RDS_DATABASE}?stringtype=unspecifiedexport spring_datasource_druid_slave_url=jdbc:postgresql://${RDS_IP}:${RDS_PORT}/${RDS_DATABASE}?stringtype=unspecifiedexport spring_datasource_username=root export spring_profiles_active=implexport application_tenantId=rdm_pixdmuat_appexport server_servlet_context_path=/rdm_pixdmuat_app/servicesexport spring_redis_database=10export IAM_LOGIN_ENDPOINT=test# 文件系统类型export FILE_STORAGE_TYPE=SFS#nohup java -Diit.test=true -jar microserviceTemplate.app-1.0.0-SNAPSHOT.jar >xdm.log 2>&1 &START_CLASS=com.huawei.microservice.rdm.RdmApplicationPROCESS_PATH=/opt/cloud/tenant-serviceLOAD_CLASSPATH=./lib/*:./# 启动类cd $PROCESS_PATHBIND_ADDRESS=`hostname -I`java -classpath $LOAD_CLASSPATH $START_CLASS --server.address=${BIND_ADDRESS} -Diit.test=true >xdm.log 2>&1 &第六步:运行脚本在/opt/cloud/tenant-service路径下执行启动脚本./startxdm.bash第七步:检验启动情况通过vim xdm.log或tail -f xdm.log查看启动日志,检查是否正常启动。第八步:将XDM启动脚本设置为开机自启把startxdm.bash脚本写入开机自启脚本。首先给XDM启动脚本赋予权限:chmod +x startxdm.bash编辑开机自启脚本:vim /etc/rc.d/rc.local在最后一行添加:/opt/cloud/tenant-service/startxdm.bash部署后验证调用XDM接口,正常调用则说明部署成功。部署Q&AQ:部署XDM过程MongoDB连接失败?A:由于华为云的MongoDB服务没有下沉到IES,需要用户自行搭建集群,在版本选择时需要选取4.x版本,连接url为形如mongodb://10.21.1.19:27017,10.21.1.20:27017,10.21.1.21:27017的格式。若选择5.x版本则会报错:[cluster-ClusterId{value='6380a0889bcb6f2d7d2ba480',description='null'}-10.21.1.19: 27017] INFO [org.mongodb.driver.cluster: info] [76] - Exception in monitor thread while connecting to server 10.21.1.19:27017com.mongodb.MongoSocketOpenException: Exception opening socketERROR [o.s.boot.SpringApplication: reportFailure] [830] - Application run failedcom.mongodb.MongoSocketReadException: Prematurely reached end of streamQ:XDM部署启动时间过长?A:在服务器Linux系统启动,由于安全随机数导致的线程阻塞,会使得启动时间过长,半小时左右。因此在IES启动XDM时需要将安全随机数生成函数由Windows下的SecureRandom secureRandom = SecureRandom.getInstanceStrong();调整为:SecureRandom secureRandom = SecureRandom.getInstance("NativePRNGNonBlock ing");综合后可调整为:SecureRandom secureRandom = null;if (isWindows()) {secureRandom = SecureRandom.getInstanceStrong();} else if (isLinux()) {secureRandom = SecureRandom.getInstance("NativePRNGNonBlocking");}Q:接口调用方式?A:前缀采用http://${XDM服务器ip地址}/rdm_pixdmuat_app/services,后缀再拼接需要调用的接口mapping地址。例如调用获取所有非内部的数据实体模型的接口,采用前缀拼接上后缀/rdm/basic/api/DataModelManagement/getAllDMEntity,即调用:http://${XDM服务器ip地址}/rdm_pixdmuat_app/services/rdm/basic/api/ DataModelManagement/getAllDMEntity