云服务器内容精选
-
单文件描述结构 单文件描述结构样例如下: ├── package.json # 包描述文件(必须) └── specs # 规格总目录(必须) ├── cn_dev_default # cn_dev_default规格目录,可用于描述一个开发用途的服务环境所使用的基础设施 └── cn_product_default # cn_product_default规格目录,可用于描述一个生产用途的服务环境所使用的基础设施 └── meta.yaml # IaC主体描述文件 IaC主体描述文件meta.yaml type: WiseCloud::Environment # 描述环境类型,当前仅支持 WiseCloud::Environment components: # 定义服务环境所包含的组件列表,每个组件包含一个资源列表 - name: environment # 组件名称 resources: # 资源列表 - name: fgc_cloudmap # 资源名称,同类型的资源的名称在整个服务环境中唯一 type: WiseCloud::Endpoint::CloudMap # 资源类型 properties: # 资源属性:具体包含哪些属性,由资源类型决定 ... - name: FGCActionInvokerService resources: ... - name: FGCAbilityCenterService resources: ... applyPipeline: default # 默认选用名为default的组件编排流水线 pipelines: # 定义可用的组件编排流水线 - name: default # 流水线的名称,作为流水线被引用的唯一标识 action: Serial # 串行编排 tasks: # 串行编排的任务列表 - name: apply-environment # 任务名称 action: Apply # 应用变更 component: # 变更组件的相关约束 name: environment # 变更的组件名称 - name: parallel-others action: Parallel # 并行编排 tasks: # 并行编排的任务列表 - name: apply-FGCActionInvokerService # 任务名称 action: Apply # 应用变更 component: # 变更组件的相关约束 name: FGCActionInvokerService # 变更的组件名称 - name: apply-FGCAbilityCenterService # 任务名称 action: Apply # 应用变更 component: # 变更组件的相关约束 name: FGCAbilityCenterService # 变更的组件名称 以上示例清晰地展示了IaC3.0的资源组织结构: Nuwa,CloudMap等资源,依照业务需要,可划分到不同的组件中。 一个组件可对应于一个微服务,或是服务内共享的中间件集合。 全体组件的集合,则汇总描述了整个服务环境的期望部署状态。 组件编排流水线,则是以组件为最小粒度来描述服务环境是如何做部署状态的迁移的。其可以处理组件间的升级依赖关系,以及通过多阶段方式提供灰度升级能力。
-
多文件描述结构 为了避免诸多资源的描述都集中于meta.yaml,而造成文件内容过长难以管理。通过引入resources.yaml和文件引用语法,可以将单文件结构改造为多文件描述目录结构,样例如下: ├── package.json # 包描述文件(必须) └── specs # 规格总目录(必须) ├── cn_dev_default # cn_dev_default规格目录,可用于描述一个开发用途的服务环境所使用的基础设施 └── cn_product_default # cn_product_default规格目录,可用于描述一个生产用途的服务环境所使用的基础设施 └── meta.yaml └── VirtualAppManangerService ├── config │ └── business_config.yaml │ └── nginx.conf ├── db │ └── schema.sql ├── values.yaml └── resources.yaml
-
带global的多文件描述结构 Spec包通过不同规格目录来描述同一个服务在不同用途环境下所需的基础设施。但是,同一服务的不同的规格仍然存在大量相同的配置,需要一种机制来完成不同规格间配置的复用。因此,IaC支持放置一个global目录,其与specs目录同级,用于放置被所有规格目录所复用的配置文件。而各具体规格目录,只需包含与 global 目录的增量差异文件即可。 当某个规格被选用于部署时,会先将该规格目录下所有文件与global目录进行合并,得到该规格目录最终的所有配置文件,再进行部署动作。 合并策略:若文件的相对路径相同,则规格目录下的文件保留, global目录下的文件被覆盖,其他文件则共存。 带global的多文件描述结构样例如下: ├── package.json # 包描述文件(必须) ├── global # global目录:放置所有规格目录所复用的配置文件 │ │ │ ├── meta.yaml # IaC 主体描述文件,内容不包含 components │ ├── WiseEyeChaosMonkeyMgrService # 组件一:ChaosMonkey 管理服务,名称需要为该服务下的微服务名称。 │ │ └── resources.yaml # 组件一的资源列表 │ ├── WiseEyeChaosMonkeyPortal # 组件二:ChaosMonkey 网页服务 │ │ └── resources.yaml # 组件二的资源列表 │ ├── environment # 组件三:环境 │ │ └── resources.yaml # 组件三的资源列表 │ └── functions # 组件四:函数 │ ├── resources.yaml # 组件四的资源列表 │ └── values.yaml # 组件四的values.yaml │ └── specs # 规格总目录(必须) ├── cn_dev_default # cn_dev_default 规格目录,一般可用于描述一个开发用途的服务环境所使用的基础设施 └── cn_product_default # cn_product_default 规格目录,一般可用于描述一个生产用途的服务环境所使用的基础设施 └── functions # 与global下functions目录的相对路径一致 └── values.yaml # 用于覆盖global下functions目录的values.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代码开发介绍 在一次完整的业务变更中,往往会涵盖多种类型、多个模块的变更,如集群扩容、申请ELB、创建数据库、软件升级等等。在IaC的语境下,每一个变更本质上都是IaC资源的变更。在一次完整的业务变更中,部分资源的变更依赖于其他资源的变更,如为一个微服务创建NUWA实例之前往往需要先创建该微服务的数据库。 通过IaC代码对各资源在具体变更过程中的依赖关系、先后顺序进行代码化描述。本质上就是描述各模块、各资源之间的依赖关系。在变更过程中,IaC将根据由依赖关系生成的有向无环图顺序执行各资源的变更过程。 IaC代码开发主要围绕声明资源和变更流程编排两个方面展开。 在IaC代码中声明资源 定义component:定义component是IaC将一个环境的资源组织起来的方式,将同一类资源组织起来成为一个component。 定义资源:一个component下可以定义多个资源,所有的资源描述都存放于resources.yaml中。 在IaC代码中定义流水线 component间的编排在spec包中的meta.yaml文件中描述,用户可以根据自己的需求定义整个环境在变更时的执行过程。
-
使用SSH协议在Git Bash客户端克隆代码 本节内容指导如何使用Git Bash客户端克隆 代码托管服务 的仓库到本地环境中。 下载并安装Git Bash客户端。 设置SSH密钥。 获取仓库地址。 在仓库主页中,单击“克隆/下载”按钮,获取SSH地址,通过这个地址,可以在本地计算机连接代码托管仓库。 如果您未配置SSH密钥,你可单击上图中“SSH密钥管理”链接进行配置,详情请参考SSH密钥。 您可在代码托管服务仓库列表中“仓库地址”下获取SSH地址。 打开Git Bash客户端。 在本地计算机上新建一个文件夹用于存放代码仓库,在空白处单击鼠标右键,打开Git Bash客户端。 克隆仓库时会自动初始化,无需执行init命令。 输入如下命令,克隆代码托管仓库。 git clone 仓库地址 命令中“仓库地址”即3中获取的SSH地址。 如果您是第一次克隆仓库,会询问您是否信任远程仓库,输入“yes”即可。 执行成功后,您会看到多出一个与您在代码托管服务新建的仓库同名的文件夹,并且其中有一个隐藏的.git文件夹,则说明克隆仓库成功。 此时您位于仓库上层目录,执行如下命令,进入仓库目录。 cd 仓库名称 进入仓库目录,可以看到此时Git默认为您定位到master分支。 客户端在git clone代码仓库时失败的原因排查: 确保您的网络可以访问代码托管服务。 请在git客户端使用如下测试命令验证网络连通性(其中“**********.com”为代码仓库地址)。 ssh -vT git@**********.com 如果返回内容含有“Could not resolve hostname **********.com: Name or service not known”,则您的网络被限制,无法访问代码托管服务,请求助您本地所属网络管理员。 请检查建立的SSH密钥配对关系,必要时重新生成密钥并到代码托管控制台进行配置。 只有开启IP白名单的机器才可以在Git客户端克隆。
-
使用SSH协议在TortoiseGit客户端克隆代码 本节内容指导如何使用TortoiseGit客户端克隆代码托管服务的仓库到本地环境中。 下载并安装TortoiseGit客户端。 获取仓库地址。 在仓库主页中,单击“克隆/下载”按钮,获取SSH地址,通过这个地址,可以在本地计算机连接代码托管仓库。 您可在代码托管服务仓库列表中“仓库地址”下获取SSH地址。 进入您的本地仓库目录下,右键选择“Git克隆”菜单选项,如下图所示。 在弹出的窗口中将上述复制的SSH地址粘贴到URL输入框中,勾选“加载Putty密钥”并选择私钥文件,最后单击“确定”,如下图所示。 单击“确定”之后即开始克隆仓库,如果您是第一次克隆TortoiseGit客户端会询问您是否信任远程仓库,单击“是”即可。 克隆用时受仓库大小影响,克隆的动作如下图所示。
-
开发环境准备 请根据自身业务选择Go或Java开发环境。推荐使用CloudIDE(支持在线、快速地构建链代码开发环境)。 Go开发环境准备: 安装Go开发环境。安装包下载地址为:https://go.dev/dl/。(请选择1.9.2之后的版本) 各个系统对应的包名(以1.11.12版本为例): 操作系统 包名 Windows go1.11.12.windows-amd64.msi Linux go1.11.12.linux-amd64.tar.gz Windows下您可以使用.msi后缀的安装包来安装。默认情况下.msi文件会安装在“C:\Go”目录下。您可以将“C:\Go\bin”目录添加到Path环境变量中。添加后您需要重启命令窗口才能生效。 Linux下,您需要将下载的二进制包解压至/usr/local目录。将/usr/local/go/bin目录添加至Path环境变量: export PATH=$PATH:/usr/local/go/bin 安装完go语言后可以通过命令go version查看版本信息,以及通过go env命令来查看相关路径配置。 安装Go编辑器。编辑器可自行选择,推荐使用Goland:https://www.jetbrains.com/go/download。 Java开发环境准备: 仅适用于Fabric架构版本的 区块链 实例。 安装Java开发环境。下载JDK并安装(建议选择最新版本):https://www.oracle.com/technetwork/java/javase/downloads/index.html。 各个系统对应的包名(以15.0.2版本为例): 操作系统 包名 Windows jdk-15.0.2_windows-x64_bin.exe Linux jdk-15.0.2_linux-x64_bin.tar.gz Windows下您可以使用 .exe后缀的安装包来安装。 Linux下,您需要将下载的二进制包解压至/usr/local目录。 export PATH=$PATH:/usr/local/go/bin 配置环境变量(若无则新建): JAVA_HOME为jdk安装目录如“C:\Program Files (x86)\Java\jdk1.8.0_91”或“/usr/java/jdk1.8.0_91”(以下均略去双引号); CLASSPATH为“.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar; ”; 在Path中新增两条“%JAVA_HOME%\bin”和“%JAVA_HOME%\jre\bin”。 安装完jdk后,可以通过命令java -version查看版本信息。 安装Java编辑器。编辑器可自行选择,推荐使用IntelliJ IDEA。
-
下载源码包 下载Fabric源码包作为三方库。仅适用于Fabric架构版本的区块链实例。 请根据实际需求,选择下载对应版本的Fabric源码包: https://github.com/hyperledger/fabric/tree/release-2.2 Fabric源码包选择和创建的区块链实例版本对应,即如果创建区块链实例时,Hyperledger Fabric增强版内核是v2.2(4.X.X版本),则Fabric源码包对应选择2.2版本。
-
链代码接口 链代码启动必须通过调用shim包中的start方法。实际开发中, 您需要自行定义一个类,来继承ChaincodeBase。以下为继承时必须重写的方法: public class SimpleChaincodeSimple extends ChaincodeBase { @Override public Response init(ChaincodeStub stub) { } @Override public Response invoke(ChaincodeStub stub) { } } init方法:在链代码实例化或升级时被调用,完成初始化数据的工作。 Invoke方法:更新或查询账本数据状态时被调用, 需要在此方法中实现响应调用或查询的业务逻辑。
-
链代码结构 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); } }
-
链代码示例(1.4风格) Fabric架构版本的区块链实例: 如下是一个账户转账的链代码示例(1.4风格)仅供安装实例化,若您需要调测请参考Fabric官方示例中的链代码。 package main import ( "fmt" "strconv" "github.com/hyperledger/fabric/core/chaincode/shim" pb "github.com/hyperledger/fabric/protos/peer" )type SimpleChaincode struct {}// 初始化数据状态,实例化/升级链代码时被自动调用func (t *SimpleChaincode) Init(stub shim.ChaincodeStubInterface) pb.Response {// println函数的输出信息会出现在链代码容器的日志中fmt.Println("ex02 Init")// 获取用户传递给调用链代码的所需参数_, args := stub.GetFunctionAndParameters()var A, B string // 两个账户var Aval, Bval int // 两个账户的余额var err error// 检查合法性, 检查参数数量是否为4个, 如果不是, 则返回错误信息if len(args) != 4 {return shim.Error("Incorrect number of arguments. Expecting 4")}A = args[0] // 账户A用户名Aval, err = strconv.Atoi(args[1]) // 账户A余额if err != nil {return shim.Error("Expecting integer value for asset holding")}B = args[2] // 账户B用户名Bval, err = strconv.Atoi(args[3]) // 账户B余额if err != nil {return shim.Error("Expecting integer value for asset holding")}fmt.Printf("Aval = %d, Bval = %d\n", Aval, Bval)// 将账户A的状态写入账本中err = stub.PutState(A, []byte(strconv.Itoa(Aval)))if err != nil {return shim.Error(err.Error())}// 将账户B的状态写入账本中err = stub.PutState(B, []byte(strconv.Itoa(Bval)))if err != nil {return shim.Error(err.Error())}return shim.Success(nil)}// 对账本数据进行操作时(query, invoke)被自动调用func (t *SimpleChaincode) Invoke(stub shim.ChaincodeStubInterface) pb.Response {fmt.Println("ex02 Invoke")// 获取用户传递给调用链代码的函数名称及参数function, args := stub.GetFunctionAndParameters()// 对获取到的函数名称进行判断if function == "invoke" {// 调用 invoke 函数实现转账操作return t.invoke(stub, args)} else if function == "delete" {// 调用 delete 函数实现账户注销return t.delete(stub, args)} else if function == "query" {// 调用 query 实现账户查询操作return t.query(stub, args)}// 传递的函数名出错,返回 shim.Error()return shim.Error("Invalid invoke function name. Expecting \"invoke\" \"delete\" \"query\"")}// 账户间转钱func (t *SimpleChaincode) invoke(stub shim.ChaincodeStubInterface, args []string) pb.Response {var A, B string // 账户A和Bvar Aval, Bval int // 账户余额var X int // 转账金额var err errorif len(args) != 3 {return shim.Error("Incorrect number of arguments. Expecting 3")}A = args[0] // 账户A用户名B = args[1] // 账户B用户名// 从账本中获取A的余额Avalbytes, err := stub.GetState(A)if err != nil {return shim.Error("Failed to get state")}if Avalbytes == nil {return shim.Error("Entity not found")}Aval, _ = strconv.Atoi(string(Avalbytes))// 从账本中获取B的余额Bvalbytes, err := stub.GetState(B)if err != nil {return shim.Error("Failed to get state")}if Bvalbytes == nil {return shim.Error("Entity not found")}Bval, _ = strconv.Atoi(string(Bvalbytes))// X为转账金额X, err = strconv.Atoi(args[2])if err != nil {return shim.Error("Invalid transaction amount, expecting a integer value")}// 转账Aval = Aval - XBval = Bval + Xfmt.Printf("Aval = %d, Bval = %d\n", Aval, Bval)// 更新转账后账本中A余额err = stub.PutState(A, []byte(strconv.Itoa(Aval)))if err != nil {return shim.Error(err.Error())}// 更新转账后账本中B余额err = stub.PutState(B, []byte(strconv.Itoa(Bval)))if err != nil {return shim.Error(err.Error())}return shim.Success(nil)}// 账户注销func (t *SimpleChaincode) delete(stub shim.ChaincodeStubInterface, args []string) pb.Response {if len(args) != 1 {return shim.Error("Incorrect number of arguments. Expecting 1")}A := args[0] // 账户用户名// 从账本中删除该账户状态err := stub.DelState(A)if err != nil {return shim.Error("Failed to delete state")}return shim.Success(nil)}// 账户查询func (t *SimpleChaincode) query(stub shim.ChaincodeStubInterface, args []string) pb.Response {var A stringvar err errorif len(args) != 1 {return shim.Error("Incorrect number of arguments. Expecting name of the person to query")}A = args[0] // 账户用户名// 从账本中获取该账户余额Avalbytes, err := stub.GetState(A)if err != nil {jsonResp := "{\"Error\":\"Failed to get state for " + A + "\"}"return shim.Error(jsonResp)}if Avalbytes == nil {jsonResp := "{\"Error\":\"Nil amount for " + A + "\"}"return shim.Error(jsonResp)}jsonResp := "{\"Name\":\"" + A + "\",\"Amount\":\"" + string(Avalbytes) + "\"}"fmt.Printf("Query Response:%s\n", jsonResp)// 返回转账金额return shim.Success(Avalbytes)}func main() {err := shim.Start(new(SimpleChaincode))if err != nil {fmt.Printf("Error starting Simple chaincode: %s", err)}} 父主题: Go语言链代码开发
-
业务流程管理 常见的区块链业务开发管理需要操作人员监控链上交易数据来掌握该笔业务的流程走向,即使使用区块链浏览器也需操作人员对浏览器中的数据进行筛选过滤,无疑增加了操作人员的工作量以及需要操作人员无一遗漏的筛选出正确交易才能开展下一步业务流程。 BCS 提供以业务为维度的管理流程,操作人员通过界面更加直观地查看该笔业务的当前进展和历史交易数据。并且针对用户管理,提供了以角色和群组的细粒度访问授权(Hyperledger Fabric增强版目前不支持细粒度,功能正在开发中),不同角色或群组的用户授予不同的权限,例如仓库管理员仅可处理货物的发放、货物收件人员仅可确认货物的签收。该功能使用户更多的精力放在处理业务,丰富了区块链上层业务和人员管理,极大地增加了区块链的易用性。 用户权限管理 智能合约的发起者作为该合约的管理员,可通过用户管理页面User Management进行用户权限管理。首先根据实际业务设置角色,例如买家、卖家和仓库管理员等角色。然后设置群组,每个群组可包含多个或单个角色。最后添加用户,管理员为其设置用户名和登录密码,并选择对应的群组。 业务监控 用户可通过用户名和密码登录到业务监控页面,查看当前业务流程和业务历史交易数据,通过图形化呈现业务进展和下一步流程走向。并且通过状态标识,可直观的查看当前业务是否完成。 业务处理 业务处理包括接口调用业务处理、自动业务处理和人工处理三种业务处理方式。接口调用业务处理指用户通过调用合约SDK发起交易进行业务处理;自动业务处理指根据业务逻辑判断,满足一定要求后自动发起交易进行业务处理;人工处理指根据用户角色,不同用户拥有特定的权限执行相应的人工处理业务,以角色为维度进行细粒度访问授权(Hyperledger Fabric增强版目前不支持细粒度,功能正在开发中)。 父主题: 区块链应用低代码开发功能
-
开发跨链智能合约 开发跨链智能合约前,需要先了解跨链操作的原理。在跨链资产交换场景中,在减少某个链上资产后,需要相应的在对应链上增加资产,这种转移使各条链的资产发生了变化。因此,跨链操作需要保证整个跨链交易结束后不同链之间的全局事务保持一致性,即同时记账,或同时不记账。 可信跨链 服务基于分布式事务两阶段提交的思想设计了一套能确保全局事务保持一致性的跨链资产交换流程。若您的跨链业务不涉及跨链资产交换,则无需定制编写跨链智能合约,否则需设置跨链资产数据锁与跨链智能合约方法。 下面用一个完整的跨链资产交换智能合约为样例说明跨链智能合约开发流程,该样例可完成链A上的A账户与链B上的B账户之间的资产转账。完整智能合约示例获取方法:登录可信跨链服务管理控制台,在“总览”页面的跨链链代码下载用于演示的业务链代码tcsexample.zip。 跨链资产数据锁定义 跨链智能合约方法定义 跨链智能合约方法示例 父主题: 跨链链代码开发(Hyperledger Fabric)
更多精彩内容
CDN加速
GaussDB
文字转换成语音
免费的服务器
如何创建网站
域名网站购买
私有云桌面
云主机哪个好
域名怎么备案
手机云电脑
SSL证书申请
云点播服务器
免费OCR是什么
电脑云桌面
域名备案怎么弄
语音转文字
文字图片识别
云桌面是什么
网址安全检测
网站建设搭建
国外CDN加速
SSL免费证书申请
短信批量发送
图片OCR识别
云数据库MySQL
个人域名购买
录音转文字
扫描图片识别文字
OCR图片识别
行驶证识别
虚拟电话号码
电话呼叫中心软件
怎么制作一个网站
Email注册网站
华为VNC
图像文字识别
企业网站制作
个人网站搭建
华为云计算
免费租用云托管
云桌面云服务器
ocr文字识别免费版
HTTPS证书申请
图片文字识别转换
国外域名注册商
使用免费虚拟主机
云电脑主机多少钱
鲲鹏云手机
短信验证码平台
OCR图片文字识别
SSL证书是什么
申请企业邮箱步骤
免费的企业用邮箱
云免流搭建教程
域名价格