云服务器内容精选

  • IaC代码开发介绍 在一次完整的业务变更中,往往会涵盖多种类型、多个模块的变更,如集群扩容、申请ELB、创建数据库、软件升级等等。在IaC的语境下,每一个变更本质上都是IaC资源的变更。在一次完整的业务变更中,部分资源的变更依赖于其他资源的变更,如为一个微服务创建NUWA实例之前往往需要先创建该微服务的数据库。 通过IaC代码对各资源在具体变更过程中的依赖关系、先后顺序进行代码化描述。本质上就是描述各模块、各资源之间的依赖关系。在变更过程中,IaC将根据由依赖关系生成的有向无环图顺序执行各资源的变更过程。 IaC代码开发主要围绕声明资源和变更流程编排两个方面展开。 在IaC代码中声明资源 定义component:定义component是IaC将一个环境的资源组织起来的方式,将同一类资源组织起来成为一个component。 定义资源:一个component下可以定义多个资源,所有的资源描述都存放于resources.yaml中。 在IaC代码中定义流水线 component间的编排在spec包中的meta.yaml文件中描述,用户可以根据自己的需求定义整个环境在变更时的执行过程。
  • IaC简介 基础设施即代码(Infrastructure as Code,简称IaC)是一种以YAML作为输入,经由云原生环境管理服务、IaC执行引擎、Operator平台解析和执行,实现环境自动部署以及管理动态基础设施的方法。它强调一致,可重复的供给和变更系统及其配置。当代码发生变更后,可以进行自动化测试,测试完成后可自动化的应用变更到运行系统中。使用基础设施即代码的方法,可以使用敏捷工程的优秀实践(如测试驱动开发,持续集成,持续发布)来更加快速安全的变更基础设施。
  • IaC代码结构介绍 IaC代码支持单文件描述结构、多文件描述结构以及带global的多文件描述结构,具体介绍请参见IaC代码结构介绍。 单文件描述结构:在IaC主体描述文件meta.yaml中进行变更流程编排同时定义所有资源。 多文件描述结构:通过引入resources.yaml和文件引用语法,将单文件结构改造为多文件描述目录结构,避免诸多资源的描述都集中于meta.yaml,而造成文件内容过长难以管理。 带global的多文件描述结构:为解决不同规格目录间配置复用问题,IaC3.0支持带global的多文件描述结构。 带global的多文件描述结构为IaC3.0的典型目录结构,IaC Spec目录结构请参见IaC Spec包典型目录结构。
  • IaC目录规划 IaC脚本开发规范请参考应用平台IaC部署代码开发,本实践中,IaC包结构规划如下: 表1 IaC Spec包结构说明 位置 描述 iacspec IaC压缩包 └── global/ 全局默认的IaC描述,包含完整文件结构。 │ └── meta.yaml 变更策略描述 └── specs/ 环境特定的IaC描述,结构与global相同,但仅包含与global有差异的文件。 │ └── cn_green_cbu_default/ 研发联调环境,命名采用站点级Cloud Map的名称,可以在环境管理界面查看可选的站点级Cloud Map名称列表。 │ └── DemoOrgidLogin/ 微服务DemoOrgidLogin。 │ └── config/ DemoOrgidLogin的配置目录。 │ └── aiops_sidecar_param.json 接入AIOps服务的配置文件。 │ └── config_records.yaml DemoOrgidLogin的业务配置项。 │ └── config_schema.yaml 声明DemoOrgidLogin的业务配置项属性,敏感业务配置项需要声明,非敏感配置项可以不声明。 │ └── envs.yaml 用于配置和管理DemoOrgidLogin的环境变量。 │ └── hosts.yaml 配置主机 域名 映射。 │ └── resources.yaml DemoOrgidLogin的资源列表。 │ └── values.yaml 定义DemoOrgidLogin的资源列表中使用的变量。 │ └── DemoServiceAService/ 微服务DemoServiceAService │ └── config/ ServiceA的配置目录。 │ └── aiops_sidecar_param.json 接入AIOps服务的配置文件。 │ └── config_records.yaml ServiceA的业务配置项。 │ └── config_schema.yaml 声明ServiceA的业务配置项属性,敏感业务配置项需要声明,非敏感配置项可以不声明。 │ └── envs.yaml 用于配置和管理ServiceA的环境变量。 │ └── hosts.yaml 配置主机域名映射。 │ └── resources.yaml ServiceA的资源列表。 │ └── values.yaml 定义ServiceA的资源列表中使用的变量。 │ └── DemoServiceBService/ 微服务DemoServiceBService。 │ └── config/ ServiceB的配置目录。 │ └── aiops_sidecar_param.json 接入AIOps服务的配置文件。 │ └── config_records.yaml ServiceB的业务配置项。 │ └── config_schema.yaml 声明ServiceB的业务配置项属性,敏感业务配置项需要声明,非敏感配置项可以不声明。 │ └── envs.yaml 用于配置和管理ServiceB的环境变量。 │ └── hosts.yaml 配置主机域名映射。 │ └── resources.yaml ServiceB的资源列表。 │ └── values.yaml 定义ServiceB的资源列表中使用的变量。 └── package.json 包描述文件。
  • 图标管理操作 低代码平台通过对系统中的图标进行分类,为用户提供了更加便捷的应用开发体验。用户不仅可以浏览不同分类的图标,还能够在每一类图标中进行个性化设计,并将自己设计的图标上传至系统。这项功能的主要好处在于: 定制化体验:允许用户根据个人或项目需求设计和上传符合特定风格或主题的图标,为应用注入个性化元素。 自主管理:用户拥有对上传的图标进行管理的权力,包括编辑、删除和应用等操作,提升了用户对图标的控制能力。 系统整洁性:通过分类和个性化管理,系统图标的使用变得更加有条理,使得用户能够更快速地找到并使用所需的图标资源。 提升开发效率:自定义图标管理使得开发者能够更高效地应用特定的图标资源,加快了应用开发的速度和质量。 创意与独特性:用户可以将自己独特的创意融入到应用中,从而使得应用更具个性化和吸引力。 这种自定义图标管理的方式为用户提供了更多的自由度和灵活性,有助于提升用户体验和应用的美观度。 类图标 图1 类图标1 图2 类图标2 操作图标 图3 操作图标1 图4 操作图标2 LOV图标 图5 LOV图标1 图6 LOV图标2 应用图标 图7 应用图标 操作步骤:进入图标库,按页面提示,新建、查询、修改、删除当前不同类型的模板即可;同时页面支持批量导入导出配置; 父主题: 低代码开发功能操作说明
  • 依赖配置 该内容仅适用于Fabric架构版本的 区块链 实例的Java语言链代码开发。 请使用Gradle或Maven构建管理工具组织链代码项目。若链代码项目中包含非本地依赖,请确保对应区块链实例的节点均绑定了弹性ip。若链代码容器将运行在受限网络环境,请确保项目中的所有依赖已配置为本地依赖。示例链代码获取方法:登录 区块链服务BCS 控制台,进入“应用案例”,单击“Java示例Demo-Java SDK Demo”中“Chaincode_Java_Local_Demo”的“下载”按钮。
  • 防止出现panic后链代码容器异常 该内容仅适用于Fabric架构版本的区块链实例的Go语言链代码开发。 为避免出现panic异常时链代码容器异常重启,找不到日志,导致问题无法及时定位,可在Invoke函数入口处添加defer语句时,出现panic异常时返回错误给客户端。 // 定义命名返回值,发生panic在defer里面赋值,确保客户端可以收到返回值// 使用debug.PrintStack()将错误的堆栈信息打印到标准输出,方便问题定位func (t *SimpleChaincode) Invoke(stub shim.ChaincodeStubInterface) (pr pb.Response) { defer func() { if err:=recover(); err != nil { fmt.Println("recover from invoke:", err) debug.PrintStack() pr = shim.Error(fmt.Sprintf("invoke painc. err: %v",err)) } }() fmt.Println("ex02 Invoke") function, args := stub.GetFunctionAndParameters() if function == "invoke" { // Make payment of X units from A to B return t.invoke(stub, args) } else if function == "delete" { // Deletes an entity from its state return t.delete(stub, args) } else if function == "query" { // the old "Query" is now implemented in invoke return t.query(stub, args) } pr = shim.Error("Invalid invoke function name. Expecting \"invoke\" \"delete\" \"query\"") return pr}
  • 链代码相关的API Fabric源码包中的shim包提供了如下几种类型的接口,您可以参考使用: 参数解析API:调用链代码时需要给被调用的目标函数/方法传递参数,该API提供解析这些参数的方法。 账本状态数据操作API:该API提供了对账本数据状态进行操作的方法,包括对状态数据的查询及事务处理等。 交易信息获取API:获取提交的交易信息的相关API。 对PrivateData操作的API: Hyperledger Fabric在1.2.0版本中新增的对私有数据操作的相关API。 其他API:其他的API,包括事件设置、调用其他链代码操作。 父主题: Go语言链代码开发
  • 低代码合约开发 传统的智能合约开发需要开发人员使用底层区块链支持的合约语言进行相关业务开发和测试,开发人员不仅要求具备一定的编程能力,还需具备区块链等相关知识以保障合约的安全性。华为区块链提供低代码开发能力,开发人员仅需要根据实际业务画出业务流程建模符号(Business Process Modeling Notation,简称BPMN)和少量辅助功能代码的开发,即可完成安全可靠的智能合约编写。 通过设计以下模块实现低代码开发和部署: BPMN业务图绘制 BCS 提供的BPMN绘制页面简单易用,用户通过拖拽方式将开始事件、活动、网关、连接对象、结束事件、泳道等组合起来,通过实际业务逻辑绘制定制化BPMN业务图。其中,用户仅需编写少量业务需要的代码和查询功能代码即可完成智能合约的制作。通过绘制页面可实时验证BPMN的有效性,验证无误后单击构建,生成智能合约。 智能合约部署 Package Management界面用于智能合约的管理,用户登录业务管理页面后跳转到该界面,可查看和管理已生成的智能合约。通过对生成的智能合约选择背书策略、安装合约的组织等配置,完成合约的安装和实例化,智能合约最终运行在背书节点中的一个Docker容器内。 智能合约触发 实例化后的智能合约,可以通过外部条件来触发合约执行过程,支持事件触发和交易触发的方式,两种模式均会触发背书节点进行一致性共识,避免恶意节点作恶。 智能合约变更 业务更替升级后,用户绘制新的BPMN业务图并改变版本号,构建新版本的智能合约,重新部署合约即完成智能合约的变更。为保证安全性,合约的变更需要一定数量的背书节点达成共识后才能完成。 父主题: 区块链应用低代码开发功能
  • 链代码结构 Java语言的链代码结构如下: package main // 引入必要的包,系统自动操作,只要在maven或gradle中配置即可 import org.hyperledger.fabric.shim.ChaincodeBase; import org.hyperledger.fabric.shim.ChaincodeStub; public class SimpleChaincodeSimple extends ChaincodeBase { @Override public Response init(ChaincodeStub stub) { // 在该方法中实现链代码初始化或升级时的处理逻辑 // 编写时可灵活使用stub中的API } @Override public Response invoke(ChaincodeStub stub) { // 在该方法中实现链代码运行中被调用或查询时的处理逻辑 // 编写时可灵活使用stub中的API } //主函数,需要调用shim.Start()方法 public static void main(String[] args) { new SimpleChaincode().start(args); } }
  • 链代码接口 链代码启动必须通过调用shim包中的start方法。实际开发中, 您需要自行定义一个类,来继承ChaincodeBase。以下为继承时必须重写的方法: public class SimpleChaincodeSimple extends ChaincodeBase { @Override public Response init(ChaincodeStub stub) { } @Override public Response invoke(ChaincodeStub stub) { } } init方法:在链代码实例化或升级时被调用,完成初始化数据的工作。 Invoke方法:更新或查询账本数据状态时被调用, 需要在此方法中实现响应调用或查询的业务逻辑。
  • 开发前准备 链代码(Chaincode)又称智能合约,在Hyperledger Fabric中是用Go、Java或Node.js语言编写的程序,主要用于操作账本上的数据。链代码是运行在区块链上的、特定条件下自动执行的代码逻辑,是用户利用区块链实现业务逻辑的重要途径。基于区块链特点,智能合约的运行结果是可信的,其结果是无法被伪造和篡改的。 在面向Hyperledger Fabric使用可信数据链接服务时,用户需要结合Hyperledger Fabric链代码开发规范、 可信跨链 服务的要求与自身业务需求开发自己的跨链链代码。 开发环境准备 下载源码包 父主题: 跨链链代码开发(Hyperledger Fabric)