• [问题求助] 【智慧园区appcuebe产品】【ioc图标展示问题】线下环境cube ioc图标在哪里上传
    【所属项目】:春风动力 问题描述:cube是部署到客户环境的,客户需要更改ioc登录页面的图标,查看操作文档,发现需要上传图标,线下部署的cube用的是自带的minio作为图片服务器,想要知道是否可以使用这个自带的minio保存图标,以及 在哪里可以操作上传图标,需要保存到什么目前这些
  • [技术干货] 智慧园区业务权限凭证配置规范
    在创建FUNCTION类型的权限资源时,只能选择已有的业务权限凭证。AppCube平台的业务权限凭证,由开发者在应用开发的“配置> 业务权限凭证”页面创建,删除同样如此,权限BO仅关联已有业务权限凭证。在应用开发的“配置> 业务权限凭证”页面创建凭证,APP/BO编译打包时,可以将凭证以及API关联的凭证数据一起打包出来。配置规范业务权限凭证配置的粒度应符合实际业务使用场景,使实际业务中既能灵活配置权限,又不产生越权的问题。如果一个权限中需要调用多个接口,其权限资源应配置上多个接口对应的业务权限凭证(即创建多个FUNCTION类型的权限资源),然后分别给这些接口配置业务权限凭证。通常一个接口对应一个业务权限凭证。命名规范凭证名称的命名规范如下:模块名称(APP/BO名称)[必选]_特性[必选]_操作[非必选],大驼峰格式。例如:SystemManagement_CommonSystemManagement_Operator_Create凭证分类(目录)原则:以APP/BO为模块进行分类,命名与APP/BO一致。目录必选。定义业务权限凭证时目录名称可直接输入。区分使用者权限如:SystemManagement_Common配给匿名用户;SystemManagement_Operator_Update配给系统管理员区分读写权限如:SystemManagement_Operator_QueryAll只读;SystemManagement_Operator_Create可写区分单个/批量权限如:SystemManagement_Operator_Delete单个删除;SystemManagement_Operator_BatchDelete批量删除区分同一操作结果不同权限如:SystemManagement_Operator_QueryAll查询全部信息;SystemManagement_Operator_QueryBasic查询基本信息区分可操作对象不同权限如:SystemManagement_Operator_QueryBasic查询返回多个结果;SystemManagement_Operator_QueryCurrent查询仅返回当前对象结果
  • [技术干货] 智慧园区系统参数命名规范
    当前在AppCube平台上,BO、APP及管理界面上都可以创建系统参数。BO系统参数BO中的系统参数,统一命名规则为 :BO名称 + 下划线 + 系统参数名称<BOName>_<SystemParameterName>系统参数名采用首字母大写的驼峰样式。例如:SampleBO_DefaultValue 、AlarmBO_SecurityLevel 、GISBO_MapServerHost创建系统参数的时候,勾选“使用命名空间”这个选项,确保跨租户全局唯一。另外,系统参数名需要能尽可能地表明参数的业务含义,避免与其它参数混淆或者完全看不出业务含义。图1 创建BO系统参数APP系统参数APP中的系统参数,统一命名规则为 :APP名称 + 下划线 + 系统参数名称<APPName>_<SystemParameterName>系统参数名采用首字母大写的驼峰样式。例如:SampleMgmt_MaxValue 、SecurityMgmt_DefaultSecurityLevel 、IOCMgmt_DataSourceType创建系统参数的时候,勾选“使用命名空间”这个选项,确保跨租户全局唯一。另外,系统参数名需要能尽可能地表明参数的业务含义,避免与其它参数混淆或者完全看不出业务含义。管理界面中的系统参数原则上,所有的系统参数都应该放到各BO及APP中。但是如果确实有些系统参数是共性的,也可以在管理界面中创建。管理界面中创建的系统参数,统一命名规则为 :Common + 下划线 + 系统参数名称Common_<SystemParameterName>系统参数名采用首字母大写的驼峰样式。例如:Common_CurrentEnvDomain 、Common_ClientTimezone创建系统参数的时候,勾选“使用命名空间”这个选项,确保跨租户全局唯一。另外,系统参数名需要能尽可能地表明参数的业务含义,避免与其它参数混淆或者完全看不出业务含义。
  • [问题求助] 【智慧园区appcube】【视频调阅】调用roma 标准视频接口IO出错(急急急急)
    【所属项目】中宙项目【操作步骤&问题现象】1、视频调阅模块,点击摄像头列表,调用后台接口,获取实况播放地址时,返回{"resCode":"VideoProxy.InternalError","resMsg":"内部错误:连接失败。"},roma日志检索到请求,报401.【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 智慧园区
    【操作步骤&问题现象】1.导航栏溢出问题2.新表格组件中,配置的新增跳转可否跳出弹窗而不是打开新窗口页面3.希望实现顶部导航为一级导航栏,同时包含左侧导航(展示除一级导航目录之外的导航)例:4.增删改查需要有默认条件(无需用户选择的条件)时,可否仅通过服务编排实现5.层级懒加载表格现有组件能否实现6.表单中绑定数据对象以后,怎样获取表单数据7.能否自定义权限判断表单中数据的显隐以及是否禁用8.有进度条的表格展现形式现在能否实现,例:9.能否自定义合并表格行,例:10.表格内数据样式自定义,例根据当前行数据判断是否在表格数据中展示相应图标,例:11.动态生成表头数据能否实现
  • [技术干货] 智慧园区系统参数命名规范
    当前在AppCube平台上,BO、APP及管理界面上都可以创建系统参数。BO系统参数BO中的系统参数,统一命名规则为 :BO名称 + 下划线 + 系统参数名称<BOName>_<SystemParameterName>系统参数名采用首字母大写的驼峰样式。例如:SampleBO_DefaultValue 、AlarmBO_SecurityLevel 、GISBO_MapServerHost创建系统参数的时候,勾选“使用命名空间”这个选项,确保跨租户全局唯一。另外,系统参数名需要能尽可能地表明参数的业务含义,避免与其它参数混淆或者完全看不出业务含义。图1 创建BO系统参数APP系统参数APP中的系统参数,统一命名规则为 :APP名称 + 下划线 + 系统参数名称<APPName>_<SystemParameterName>系统参数名采用首字母大写的驼峰样式。例如:SampleMgmt_MaxValue 、SecurityMgmt_DefaultSecurityLevel 、IOCMgmt_DataSourceType创建系统参数的时候,勾选“使用命名空间”这个选项,确保跨租户全局唯一。另外,系统参数名需要能尽可能地表明参数的业务含义,避免与其它参数混淆或者完全看不出业务含义。管理界面中的系统参数原则上,所有的系统参数都应该放到各BO及APP中。但是如果确实有些系统参数是共性的,也可以在管理界面中创建。管理界面中创建的系统参数,统一命名规则为 :Common + 下划线 + 系统参数名称Common_<SystemParameterName>系统参数名采用首字母大写的驼峰样式。例如:Common_CurrentEnvDomain 、Common_ClientTimezone创建系统参数的时候,勾选“使用命名空间”这个选项,确保跨租户全局唯一。另外,系统参数名需要能尽可能地表明参数的业务含义,避免与其它参数混淆或者完全看不出业务含义。
  • [技术干货] 智慧园区错误码定义规范
    错误码使用原则原则上,系统里面所有的报错或者提示信息,都禁止直接在代码里面硬编码,必须使用错误码的形式。错误码的命名,必须遵循错误码命名规范。错误码要配置在APP或者BO内。错误码命名规范BO名称/APP名称+“.”+错误码名称。错误码名称采用大驼峰的方式,通常采用简练的英文单词,不要使用汉语拼音。状态码不能返回4xx,否则页面会跳转到登录页。错误码的中英文错误信息都要写。错误参数信息不能使用 \ ,应该使用{0}。错误码定义范例全部错误码需要在业务平台上查看。APP错误码名称英文错误信息状态码中文错误信息AlarmBOAlarm.ServiceUnAvailableThe request has failed due to a temporary failure of the server.500服务不可用。Alarm.InvalidOperatorThe input operator is invalid.500非法操作符类型。Alarm.illegalParameterThe input parameter is illegal.500非法参数类型。
  • [技术干货] 智慧园区ES搜索引擎加速的使用场景
    ElasticSearch作为专业的搜索引擎,具有搜索速度快的好处。但是业务中是否需要使用,则需要视具体情况而定。在AppCube平台的相关参数与限制章节中已经介绍了平台对接ES的一些限制:如果业务需要进行条件查询,条件查询的入参携带参数大于1024个时,不应该考虑使用ES进行加速,参考AppCube平台的相关参数与限制章节中的第1条限制。如果业务需要支持分页查询的起始条数大于10000的情况,则不应该考虑使用ES进行加速,参考AppCube平台的相关参数与限制章节中的第3条限制。如果对当前多表关联的搜索性能要求比较高,可以考虑使用ES进行加速查询。因为使用SQL进行多表关联查询,会受到表记录数量大小,查询SQL写法,SQL条件的复杂程度的影响。以基线人员BO为例,关联表数量较多,大于6表关联,并且表记录较多,有超过3张表的表记录数量达到数十万甚至数百万级别的。未使用ES的情况:如果进行5~6表关联查询,就算使用索引查询,也需要800ms以上。由于count查询性能较低,也会导致一条SQL需要1.5s以上的耗时。单个完整业务的接口处理时长大于2s甚至到达5s以上。这是由于一个业务场景中,这样的SQL不止一两条,会导致整个业务场景下前端调用接口时候高延时。这时候,则可以使用ES进行加速。使用ES后,相同单线程无并发的情况下,整个查询过程仅需要200ms~500ms,对比原来的几秒已经有了极大的提升,这时候推荐使用ES进行加速。
  • [技术干货] 智慧园区编码优化之——SQL拼接应该尽可能避免可能导致使用不到索引的情况
    平台SQL的where条件中的参数如果类型不匹配,会导致索引不生效。在完整的SQL语句前加上explain for可以查看SQL语句的执行计划,从而判断该SQL是否使用索引查询。例如,想要查看select id from PE_Person where name='abc'这条SQL语句的执行计划,那么可以在这条语句前面加上explain for,即执行 explain for select id from PE_Person where name='abc' 可以看到其执行计划。在索引字段上使用like进行模糊查询匹配,like操作符后的值的左边带有%时:例如,假设PE_Person对象模型中的name字段为索引字段。模糊查询PE_Person对象模型中的name字段中包含'bbb'的记录,其执行的SQL为select id from PE_Person where name like '%bbb%',是不使用索引而进行全表扫描匹配记录的。建议方案:如果知道了待搜索的name的精确值,则使用精确的=号查询,如select id from PE_Person where name='abbbc'。如果不知道的name的精确值,但是可以知道待搜索的name字段的前缀,则可以只使用右边的%左边精确填写,如select id from PE_Person where name like 'abbb%'。数据类型出现隐式转化如SQL语句中的where条件后的值,该字段上的数据类型为文本,但是查询的过程中传入的是数字,使得查询过程中出现了隐式转换,导致索引无效,从而全表扫描。查询应该保证查询条件的值应该与对象模型中的值的类型一致。例如,select id from PE_Person where name=123,但是name在模型对象中是字符串类型。应该改为select id from PE_Person where name='123'在索引列上使用 IS NULL 或 IS NOT NULL操作索引是不索引空值的,所以这样的操作不能使用索引,可以用其他的办法处理,例如:数字类型,判断大于0,字符串类型设置一个默认值,判断是否等于默认值即可。例如:explain for select name from de_devices where name is not null。使用or语句做SQL拼接例如:select id from PE_Person where id='0I05000000OFyd0pgSKO' or PersonName='张三'。对索引字段进行计算操作、字段上使用函数例如,PE_Person模型对象中的字段PersonName为索引字段,其中希望搜索条件满足PersonName为'abc'的记录。如果写为如下的两条SQL语句,会导致无法使用索引。select id from PE_Person where PersonName=lower('ABC') 或者 select id from PE_Person where lower(PersonName)='ABC'改进方案:可以将函数处理放置在执行SQL前执行,执行SQL时候则不用包含相关函数。例如以上的场景可以先将‘ABC’通过函数转换为'abc'再进行SQL语句查询:select id from PE_Person where PersonName='ABC'对索引字段使用<>符号进行SQL查询select name from PE_Person where id <> 'abc123'
  • [技术干货] 智慧园区编码优化之——单表的like查询用search语法来加速
    如果待搜索的字段建立的时候勾选了“是否可搜索”的选项,如图1,则该字段会将其字段上的记录秒级同步到平台的缓存上(即可以使用search语法进行搜索),该字段上的值在模型对象中的记录与平台缓存中的值是准同步的(两者相差1秒左右)。由于缓存上的搜索性能很高,体验较好,可以将耗时严重的单表特定字段的搜索(如,涉及到textArea类型的字段,平台没法建立数据库索引,勾选了该"是否可搜索"的选项),将其对象模型的搜索修改为缓存上的搜索。如果对象模型中的部分字段勾选了"是否可搜索",部分字段未勾选该选项,但是对于单表搜索的条件既涉及到可搜索字段,也涉及到不可搜索字段时候,可以使用search语法进行搜索。对于search语法进行搜索,平台会判断实现可搜索的字段从缓存中筛选,普通字段从对象模型中搜索。由于可搜索字段在缓存与对象中的同步时间相差1秒左右,所以不可在操作完该字段的记录后即刻通过search查询,这样会出现部分字段(对象模型中非可搜索的字段)是新的,部分字段的值(可搜索的字段)是旧的,从而导致查询结果有误。假设场景:假设PE_Person表中的code字段创建时勾选了“是否搜索”的选项,现在需要模糊搜索code字段包含'abc',并且name字段的值为'xxx'的记录。其中code为勾选了"是否可搜索"的字段,name字段是未勾选"是否可搜索"的普通字段。原SQL为:select id from PE_Person where code like '%abc% and name='xxx''可以优化为:search id from PE_Person where code like '%abc%' and name='xxx'图1 是否可搜索
  • [技术干货] 智慧园区BBS论坛五月技术贴汇总一览(五月持续更新)
    智慧园区设备通过IoT网关和平台接入园区预集成设备智慧园区设备通过IoT网关和平台接入园区集成架构智慧园区应用工程构建规范智慧园区服务编排开发规范与变量、图元、连线的命名要求智慧园区数字平台如何获取接口所需access-token值智慧园区查询公共系统参数接口智慧园区开发过程中涉及到的AppCube平台的相关参数与限制智慧园区高性能编码规范之数据建模优化智慧园区统一部署介绍智慧园区统一运维部署组网和规范要求智慧园区统一部署场景描述和制作镜像步骤智慧园区编码优化之——SQL中等价替换left join / right join查询智慧园区编码优化之——是否在查询SQL中带有order by,count智慧园区编码优化之——单表的like查询用search语法来加速智慧园区编码优化之——SQL拼接应该尽可能避免可能导致使用不到索引的情况智慧园区ES搜索引擎加速的使用场景如何解决ES搜索引擎与DB对象模型表的数据不一致的情况智慧园区错误码定义规范智慧园区系统参数命名规范智慧园区业务权限凭证配置规范智慧园区系统参数命名规范
  • [技术干货] 智慧园区编码优化之——是否在查询SQL中带有order by,count
    如果模型中满足某条件的数据量很大,查询的SQL语句中带有order by,count过程非常缓慢。可结合自身业务场景考虑是否可以放弃。如果业务上的 order by,count 不能删除,可以通过以下的方案进行优化:涉及order by的优化一般情况下,一个接口只需要一个order by,并且是对lastModifiedDate进行倒序查询输出的。但是lastModifiedDate字段是频繁修改的字段,同时也是平台的对象模型中的必带字段,不适合建立索引,所以其为非索引字段。例如,假设业务场景为:查询人员的页面上展示人员按照修改时间倒序排列,此时,如果需要新增一个人员进入系统。此时,倒序排列最主要的目的应该是添加了一个人员,添加成功后可以看见自己添加的人员信息,保证自己的添加是成功的。这时候,可以通过调用addPerson接口添加人员,当addPerson调用添加成功后,不再调用queryPerson进行查询,而是在修改前的记录上进行view model的修改,从而实现页面数据变更的效果。此时,查询接口中即使不使用order by也可以满足添加了一条记录成功后,在页面最前面显示自己的那条记录。当页面再次刷新(即,再次调用queryPerson接口时,刚才添加的记录或许不会在当前页面展示),但是无条件查询毕竟是模糊查询,如果需要精确查询刚才添加的记录,可以精确输入一些过滤条件进行查询,则可以直接获取得到刚才添加的记录。涉及count的优化由于count查询严重影响查询体验,所以可以考虑分情况讨论是否需要查询count。count一般用于前端分页展示选择页数,来进行分页选择查询。count查询的优化方案,将脚本查询接口的count输出改为可选输出,然后通过入参控制是否输出,如果需要输出再查询count,否则不返回count。对于页面上调用脚本的查询接口时,先试探查询传入start=5000,limit=5001,首次查询先通过入参控制不查询count并且携带其他查询条件,如果返回记录不为空,则表示满足条件的记录大于5000条。如果能查出一条记录则表示记录超过5000,则后续的正常分页查询也不查询count,只将分页查询的返回分页数据展示到页面上,页面也不展示count。页面也只可以翻页到0~5000的记录,5000以上的无法看。如果查不到记录(表示满足条件的数量少于5000)。则可以正常返回count,将返回的count用于前端分页的总记录数量,此时返回的分页数据亦可以正常展示,用法与普通的分页查询用法一致。
  • [技术干货] 智慧园区编码优化之——SQL中等价替换left join / right join查询
    多表的left join / right join关联查询性能较低,可以考虑等价替换为join的SQL语句或者是用逗号分隔各个表,然后用where条件替代on条件作为关联条件的方式,关联查询多表(目前也推荐用逗号分隔,where条件替代on条件的方式进行多表内连接查询)。例如对于同时符合以下设定的场景下:如果A表为主表,B为从表。其中,出参包含AB两个表的数据,查询的条件可能来源于A,B表。A表有记录,B表未必有记录。B表的code字段与A表的主键id字段关联。各个查询条件之间是AND关系。那么,查询SQL语句最直观地会写为:select A.id, B.id from A left join B on A.id=B.code where ……但是这样的SQL语句在宽表引擎下并非性能最佳, 可以等价替换为如下:如果查询条件来源于A和B两表,并且查询条件都是AND逻辑拼接。可以改为:select A.id, B.id from A, B where A.id=B.code and ……如果查询条件只来源于A表,可改为使用以下的两条SQL:select A.id from A where ……将以上查询获取得到的A表的id传入到下列B表的SQL,查询获取B表的出参。select B.id from B where B.code=?如果查询条件只来源于B表,可以改为使用以下的两条SQL:Select B.id, B.code from B where ……将以上查询获取得到的B表的code传入到下列A表的SQL,查询获取A表的出参。select A.id from A where A.id=?
  • [问题求助] 【智慧园区产品】【华为园区Cube业务容器之间是如何工作的】
    是否有材料说明华为园区Cube业务容器之间是如何工作的。例如下图是园区Cube运维平台的组网示意图。如下图中,各容器的功能是什么。namespacepod功能定位abcai-artwork-7c596584c9-5lgqlabcai-artwork-7c596584c9-9tpgcabcai-sketch-5647bd4fb6-4ngggabcai-sketch-5647bd4fb6-vd986abcauthcenter-5487f69db-jgt6mabcauthcenter-5487f69db-z2f4nabcbaasui-7557687c75-9srtzabcbaasui-7557687c75-mrkzsabcbastudio-7d84b5f646-fv8dwabcbastudio-7d84b5f646-qlgc9abcbingo-57b7c4dc87-7r4cwabcbingo-57b7c4dc87-qdc6zabccardbuilder-776f5fc67c-hcv7cabccardbuilder-776f5fc67c-n2n4pabccasserver-6d64c9654-2kmd4abccdappengines10169340-6b4549d796-p24cwabccompileengine-c45659776-hcb2gabccompileengine-c45659776-shjv5abcdmax-84689586b7-7m55sabcdmax-84689586b7-bwkclabcelasticsearch-0abcelasticsearch-1abcelasticsearch-2abcetcd-0abcetcd-1abcetcd-2abceventservice-86dd4594ff-jdmk5abceventservice-86dd4594ff-mnxq6abcflume-b8b5df9b8-jndc6abcflume-b8b5df9b8-rdm2wabciotgateway-0abciotgateway-1abciotgateway-2abckafka-0abckafka-1abckafka-2abcmagnogallery-78cd4dbd67-pjtlnabcmagnogallery-78cd4dbd67-qkkqkabcmagnorender-57bff94b54-7wh8gabcmagnorender-57bff94b54-wcxk4abcmagnostudio-78555445d5-752hbabcmagnostudio-78555445d5-ffbh8abcmanager-6c99d85674-fqdm9abcmanager-6c99d85674-vh8c5abcminio-5cff4b4bc6-rkkkwabcminio-5cff4b4bc6-xq9cxabcnasc-6d555b794b-hd4n5abcnasc-6d555b794b-trkrxabcnascgateway-fd474bffd-2tv4habcnascgateway-fd474bffd-qdggsabcnginxingresscontroller-86bb755968-qk9dwabcnginxingresscontroller-86bb755968-qrq6babcredis-0abcredis-1abcredis-2abcredis-3abcredis-4abcredisadapter-0abcredisadapter-1abcservicebroker-56fbc95b7c-7vl5xabcservicebroker-56fbc95b7c-wk9z6abctaskcenter-77f5d874dd-bs5hhabctaskcenter-77f5d874dd-d84jvabcwebsocket-7ddd66f96d-tjnhlabczookeeper-0abczookeeper-1abczookeeper-2booteragentbooteragent-deployment-56ddb5654-jpx8lbooteragentbooteragent-nsq-7f6847fc94-hpmvwcampusnativebatchfileprocess-deployment-6d6b56fcc8-4psqgcampusnativebatchfileprocess-deployment-6d6b56fcc8-tgwk5campusnativedatatool-deployment-dd474944b-smvwdcampusnativepytest-deployment-8878f69b9-9n7m5campusnativesecurityvoice-deployment-5cb799d874-bm5wfcampusnativetemplate-deployment-79b8f79f68-s7gcfcampusnativetemplate-deployment-79b8f79f68-x9qtzcdnativecdnatives10169340-854469659c-glt2tcdopscdopss10169375-68476dbc57-xr5c8cert-managercert-manager-cainjector-new-694b6b9f4b-gq4flcert-managercert-manager-cainjector-new-694b6b9f4b-qzn2vcert-managercert-manager-new-67c5788d68-gql8pcert-managercert-manager-new-67c5788d68-xqzbjcert-managercert-manager-webhook-new-5cddbbddbf-gszx7cert-managercert-manager-webhook-new-5cddbbddbf-kfwtfcpaas-systemapollo-8599c57669-k6js2cpaas-systemapollo-8599c57669-vk85ncpaas-systemarchon-67b8f79ff5-cfdvmcpaas-systemarchon-67b8f79ff5-tl5qzcpaas-systemauth-controller2-59b4bbd8d5-bjcjvcpaas-systemauth-controller2-59b4bbd8d5-c4hk8cpaas-systembase-operator-69bf779bbf-nnldncpaas-systembase-operator-69bf779bbf-t5t5zcpaas-systemcaptain-chartmuseum-7b6b47bcdb-cv6crcpaas-systemcaptain-controller-manager-5876f86ff7-7z5ghcpaas-systemcaptain-controller-manager-5876f86ff7-khmtrcpaas-systemcluster-transformer-7ff8c7484-22b5mcpaas-systemcluster-transformer-7ff8c7484-chflzcpaas-systemcourier-7b8b85c556-g69wvcpaas-systemcourier-7b8b85c556-pgmkjcpaas-systemcpaas-elasticsearch-5b49969c7c-ds5rncpaas-systemcpaas-elasticsearch-5b49969c7c-fnzw4cpaas-systemcpaas-elasticsearch-5b49969c7c-ltcjlcpaas-systemcpaas-kafka-75947c6884-frdmhcpaas-systemcpaas-kafka-75947c6884-gnw4pcpaas-systemcpaas-kafka-75947c6884-hw2pncpaas-systemcpaas-zookeeper-5bd745575c-dnjbkcpaas-systemcpaas-zookeeper-5bd745575c-dx7qhcpaas-systemcpaas-zookeeper-5bd745575c-f22xkcpaas-systemcreate-cert-issuer-r4fx9cpaas-systemdex-5d8fc5fdd6-8lz5vcpaas-systemdex-5d8fc5fdd6-sn5h8cpaas-systemerebus-7646cc55f-2frm2cpaas-systemerebus-7646cc55f-r6n66cpaas-systemglobal-alb2-5f6986bf9f-9s7mtcpaas-systemglobal-alb2-5f6986bf9f-bsvw7cpaas-systemglobal-alb2-5f6986bf9f-ph22mcpaas-systemicarus-5c5f598c85-jxhhlcpaas-systemicarus-5c5f598c85-sx6mrcpaas-systemjuno-56cfcfd899-5pjnkcpaas-systemjuno-56cfcfd899-r2bw6cpaas-systemkubectl-566876c965-h9m79cpaas-systemkubectl-566876c965-q6z82cpaas-systemkubernetes-event-exporter-67f74f7cd5-qk9dkcpaas-systemkubernetes-event-exporter-67f74f7cd5-s7mj7cpaas-systemlanaya-b96c4f4fd-8kzm2cpaas-systemlanaya-b96c4f4fd-pdpfscpaas-systemmars-6867756c74-7clmmcpaas-systemmars-6867756c74-98rtgcpaas-systemmeepo-5bcb5f8d54-w25ftcpaas-systemmeepo-5bcb5f8d54-zd6swcpaas-systemmetis-8456b84894-2t2l2cpaas-systemmetis-8456b84894-rp5c9cpaas-systemmorgans-857bc6cccd-tkvqqcpaas-systemmorgans-857bc6cccd-w5xgxcpaas-systemnaga-uploader-sgkmmcpaas-systemnevermore-48pjhcpaas-systemnevermore-5jfn6cpaas-systemnevermore-6p9xvcpaas-systemnevermore-78qdxcpaas-systemnevermore-7b5kccpaas-systemnevermore-8822fcpaas-systemnevermore-8fckwcpaas-systemnevermore-9qlvgcpaas-systemnevermore-9tkrqcpaas-systemnevermore-ccpp7cpaas-systemnevermore-cm828cpaas-systemnevermore-dwppscpaas-systemnevermore-f2c27cpaas-systemnevermore-f6wx8cpaas-systemnevermore-glh7ccpaas-systemnevermore-kxpwgcpaas-systemnevermore-ltpxpcpaas-systemnevermore-m4pv6cpaas-systemnevermore-mgfkwcpaas-systemnevermore-ngs6pcpaas-systemnevermore-qqcm2cpaas-systemnevermore-qt8xmcpaas-systemnevermore-qvq68cpaas-systemnevermore-rd5xncpaas-systemnevermore-t6twncpaas-systemnevermore-tz9dfcpaas-systemnevermore-vcgk8cpaas-systemnevermore-vhwr2cpaas-systemnevermore-xldmqcpaas-systemoci-chart-registry-56d77cbd5b-2rcmscpaas-systemoci-chart-registry-56d77cbd5b-v6d62cpaas-systemplatform-docs-865bcbff74-flzfmcpaas-systemplatform-docs-865bcbff74-hcm4vcpaas-systemreloader-5c76c77d5-9pxrwcpaas-systemreloader-5c76c77d5-jmnftcpaas-systemsentry-7f4ffbd569-wnw4ncpaas-systemtke-business-api-6c95854bff-kmct4cpaas-systemtke-business-api-6c95854bff-rgcqkcpaas-systemtke-business-controller-565bf5bfbb-d6bsmcpaas-systemtke-business-controller-565bf5bfbb-m6nckcpaas-systemtke-platform-api-85cff6cfb4-kt5l7cpaas-systemtke-platform-api-85cff6cfb4-vxsvrcpaas-systemtke-platform-controller-7fc88b9c99-95jxrcpaas-systemtke-platform-controller-7fc88b9c99-jn4t8cpaas-systemunderlord-6b5c5b98c6-4rd6scpaas-systemunderlord-6b5c5b98c6-zlc89deploydeploy-agent-7ddd475bfb-gc6t7foundationbasefoundationbase-deployment-55f4fb47f8-52c9fgissupermapisuperserver-deployment-778c56cc8c-knbdjiotgwapp-68b877dd9c-d4dlwiotgwapp2-89b647f4b-ttdrtiotiotapp-586ddd64cb-twz65iotiotdb-64d8469b86-p6fz4kube-systemcalico-kube-controllers-cd95797b7-h98dqkube-systemcalico-node-2g555kube-systemcalico-node-47n59kube-systemcalico-node-6v8gmkube-systemcalico-node-8cwhfkube-systemcalico-node-99cdpkube-systemcalico-node-bb9x5kube-systemcalico-node-bj4bbkube-systemcalico-node-bxmgnkube-systemcalico-node-cf4fkkube-systemcalico-node-cl4rwkube-systemcalico-node-dqnh4kube-systemcalico-node-fv7pgkube-systemcalico-node-g4x8jkube-systemcalico-node-hn7kvkube-systemcalico-node-krmz4kube-systemcalico-node-l8kf2kube-systemcalico-node-lmbnxkube-systemcalico-node-m7ggvkube-systemcalico-node-nfq5lkube-systemcalico-node-qwvjhkube-systemcalico-node-s69sqkube-systemcalico-node-sbld8kube-systemcalico-node-vnjnnkube-systemcalico-node-w7g78kube-systemcalico-node-wdj5nkube-systemcalico-node-whs57kube-systemcalico-node-x6575kube-systemcalico-node-xdfmmkube-systemcalico-node-xnf6nkube-systemcoredns-d557d9859-27c5ckube-systemcoredns-d557d9859-rdr2nkube-systemetcd-10.169.3.34kube-systemetcd-10.169.3.35kube-systemetcd-10.169.3.36kube-systemkeepalived-10.169.3.34kube-systemkeepalived-10.169.3.35kube-systemkeepalived-10.169.3.36kube-systemkube-apiserver-10.169.3.34kube-systemkube-apiserver-10.169.3.35kube-systemkube-apiserver-10.169.3.36kube-systemkube-controller-manager-10.169.3.34kube-systemkube-controller-manager-10.169.3.35kube-systemkube-controller-manager-10.169.3.36kube-systemkube-proxy-2b8n9kube-systemkube-proxy-4css5kube-systemkube-proxy-4s72vkube-systemkube-proxy-4vk7tkube-systemkube-proxy-72v6zkube-systemkube-proxy-7d4kgkube-systemkube-proxy-8ppmwkube-systemkube-proxy-cmwjgkube-systemkube-proxy-dsvwqkube-systemkube-proxy-dvw5gkube-systemkube-proxy-dxbqbkube-systemkube-proxy-h9fwckube-systemkube-proxy-hf4lgkube-systemkube-proxy-hj6rhkube-systemkube-proxy-jvkkfkube-systemkube-proxy-l2hdskube-systemkube-proxy-lpj27kube-systemkube-proxy-m9q2ckube-systemkube-proxy-n4w29kube-systemkube-proxy-qpkc7kube-systemkube-proxy-rlqxbkube-systemkube-proxy-rn597kube-systemkube-proxy-rq6hdkube-systemkube-proxy-tdlf8kube-systemkube-proxy-tsxcxkube-systemkube-proxy-x6mzjkube-systemkube-proxy-zhks5kube-systemkube-proxy-zl97qkube-systemkube-proxy-zrpljkube-systemkube-scheduler-10.169.3.34kube-systemkube-scheduler-10.169.3.35kube-systemkube-scheduler-10.169.3.36kube-systemraven-867fc9d4cf-678mzkube-systemraven-867fc9d4cf-7qhpvkube-systemregistry-10.169.3.34kube-systemregistry-10.169.3.35kube-systemregistry-10.169.3.36opsgrafana-67944b5874-8vbfcopsops-arangodb-0opsops-client-56db55698-jqj6zopsops-elasticsearch-0opsops-etcd-0opsops-kibana-54b78b4c5-m8pkfopsops-logstash-855c8448c5-h4zv6opsops-redis-0opsops-server-55c9866fd4-5r9f9opsops-watcher-76fb5ff4fc-9xlbmopszabbixproxy-5dd9546c87-bl89hopszabbixproxytls-dfd84b985-b9dg7opszabbixserver-74bb95c578-gp74popszabbixweb-6bf5849c4b-rlzs7romaroma-adapter-8df9fb44d-dqxm2romaroma-adapter-8df9fb44d-pfvzjromaroma-apigw-8496bd859-6rqz2romaroma-apigw-8496bd859-jkqdzromaroma-elasticsearch-0romaroma-elasticsearch-1romaroma-elasticsearch-2romaroma-eureka-f9ddc46d-8rmd9romaroma-eureka-f9ddc46d-prnfcromaroma-fdireader-0romaroma-fdireader-1romaroma-fdiwriter-0romaroma-fdiwriter-1romaroma-gaussinitialdata-7c8c8768db-nr9hzromaroma-kafka-0romaroma-kafka-1romaroma-kafka-2romaroma-kibana-bcd8d45d9-4k2pqromaroma-kibana-bcd8d45d9-mfqppromaroma-lb-6597dcdb75-w9fqmromaroma-livedata-8d6fcdc4-bqrfxromaroma-livedata-8d6fcdc4-sgb6hromaroma-logstash-7bc79d48c6-ql5nkromaroma-logstash-7bc79d48c6-rg5mqromaroma-mqbroker-0romaroma-mqbroker-1romaroma-mqbroker-2romaroma-mqbroker-3romaroma-mqnameserver-0romaroma-mqnameserver-1romaroma-nginx-58d67fdc47-phgcmromaroma-nginx-58d67fdc47-zfqbbromaroma-portals-764c9dd78-9c2b9romaroma-portals-764c9dd78-pc7ghromaroma-quartz-0romaroma-quartz-1romaroma-redis-0romaroma-redis-1romaroma-redis-2romaroma-umpconnector-7d9cf799c9-2qww4romaroma-umpconnector-7d9cf799c9-97fslromaroma-umphttpserver-7d8c7769f6-cg9m4romaroma-umphttpserver-7d8c7769f6-vcrr2romaroma-umpnameserver-0romaroma-umpnameserver-1romaroma-zookeeper-0romaroma-zookeeper-1romaroma-zookeeper-2
  • [技术干货] 智慧园区统一部署场景描述和制作镜像步骤
    假设现有一个基于nodejs开发的Hello World原生服务应用,如图1,且无需和AppCube平台进行API集成。图1 Hello World满足统一安装的规范后,可以使用园区的自动化部署工具安装到数字平台中。大致流程如下:基于安全的基础镜像制作原生服务应用的镜像。上传镜像到镜像仓库。制作基于Helm规范的Chart包。使用自动化部署工具部署原生服务。前提条件准备一台安装了docker的Linux主机。联系园区运营获取安全的Euler操作系统基础镜像,例如“HiCampus_DockerImageBase_EulerOS2.0SP5-x86_64_20210630.tar.xz”操作步骤使用root用户登录安装了docker的Linux环境。将获取Euler操作系统基础镜像上传到Linux服务器指定的目录中(例如/home/helloworld)。导入基础镜像并设置tag。# xz -d HiCampus_DockerImageBase_EulerOS2.0SP5-x86_64_20210630.tar.xz# docker import -m "hicampus euler_x86" HiCampus_DockerImageBase_EulerOS2.0SP5-x86_64_20210630.tar euleros:21.1.0下载nodejs的二进制包,并上传到Linux服务器指定的目录中(例如/hom/helloworld)。从官网上https://nodejs.org/download/release/v12.0.0/下载。例如“node-v12.0.0-linux-x64.tar.gz”。创建helloworld应用程序文件。# vi /home/helloworld/server.jsvar http = require('http'); http.createServer(function (request, response) { // 发送 HTTP 头部 // HTTP 状态值: 200 : OK // 内容类型: text/plain response.writeHead(200, {'Content-Type': 'text/plain'}); // 发送响应数据 "Hello World" response.end('Hello World\n'); }).listen(8888); // 终端打印如下信息 console.log('Server running at http://127.0.0.1:8888/');创建dockerfile文件。# vi /home/helloworld/Dockerfile# 使用欧拉安全的基础镜像 FROM euleros:21.1.0 # 创建用户和目录 RUN groupadd -g 9008 -r hello \ && useradd -u 9008 -m -d /home/hello hello -g hello \ && mkdir /home/hello/node \ && chown -R 9008:9008 /home/hello # 安装配置nodejs的二进制包 ADD node-v12.0.0-linux-x64.tar.gz /home/hello/node ENV NODE_HOME=/home/hello/node/node-v12.0.0-linux-x64 ENV PATH=$NODE_HOME/bin:$PATH # 拷贝应用所需的资源文件 COPY --chown=9008:9008 server.js /home/hello # 切换指定用户运行命令 USER hello WORKDIR /home/hello # 容器应用暴露的端口 EXPOSE 8888 # 容器中启动应用命令 CMD [ "node", "server.js" ]Dockerfile的文件详细说明请参考docker官网的资料:https://docs.docker.com/engine/reference/builder/。如何写出可读性更好的Dockerfile可参考华为云上的资料:如何编写高效的Dockerfile。使用dockerfile制作原生服务镜像。# docker build -t helloworld:0.1.0 ./其中:helloworld为原生服务镜像名称。0.1.0为原生服务镜像的tag。导出镜像文件。# docker save helloworld:0.1.0 | gzip > helloworld.tar.gz生成的helloworld.tar.gz即为镜像文件。