• [介绍/入门] 分布式消息服务之TCP API配置说明!
    [*](可选)配置DNS。公网无法直接访问DMS,必须要先创建ECS,在ECS上才可以访问DMS。新创建的ECS不需要再配置DNS,如果使用已有的ECS需要配置DNS。[*]华北区的DNS IP:100.125.1.250 [*]华东区的DNS IP:100.125.17.29 [*]华南区的DNS IP:100.125.1.250 [*]参考表1的配置示例的配置项。表1 dms.client.properties参数说明 参数说明dms.server.ipDMS服务端的地址,配置为IP或者域名。华北区域名:dms-tcp.cn-north-1.myhuaweicloud.com华东区域名:dms-tcp.cn-east-2.myhuaweicloud.com华南区域名:dms-tcp.cn-south-1.myhuaweicloud.comdms.server.portDMS服务TCP端口,配置为60010。dms.client.blocked.worker.num执行阻塞callback的线程数,默认为-1,小于0则默认使用CPU核数两倍。dms.client.conn.timeout连接超时时间,单位为毫秒,默认6000dms.client.reconn.attempt.times连接重试次数,默认3次。dms.client.reconn.attempt.interval连接重试间隔,单位为毫秒,默认3000。dms.client.request.timeout请求超时时间,单位为毫秒,默认60000。dms.client.start.timeout启动超时时间,单位为毫秒,默认60000。dms.client.project.idproject id,获取方法参见获取project id。dms.client.access.keyaccess key,获取方法参见获取AK/SK。dms.client.secret.keysecret key,获取方法参见获取AK/SK。[*]开始编写代码,API接口请参考获取SDK中的dms.sdk.api.chm文档。
  • [介绍/入门] 分布式消息服务之TCP API创建工程!
    本章节以新建名为“tcpdemo”的Maven Project为例。操作步骤[*]打开Eclipse,建议使用4.6以上版本,新建一个Maven Project,工程名自定义,这里以tcpdemo为例。[*]单击“Finish”。 [*]导入DMS TCP SDK的jar包。 [list=a] [*]右键单击新建的工程“tcpdemo”,新建一个Folder,命名为libs。 [*]将dms.sdk-1.0.0.jar和dms.protocol-1.0.0.jar复制到libs目录下。 [*]在pom.xml文件中增加如下行,将DMS TCP SDK的jar包导入Maven仓库。 com.huawei.middleware.dms dms.protocol 1.0.0 jar system ${basedir}/libs/dms.protocol-1.0.0.jar com.huawei.middleware.dms dms.sdk 1.0.0 jar system ${basedir}/libs/dms.sdk-1.0.0.jar [*]保存“pom.xml”。 [*]如果没有自动导入第三方依赖包,请参考“DmsTcpDemo示例”将third_lib.zip中的包导入Maven仓库。
  • [介绍/入门] 分布式消息服务之TCP API获取SDK!
    如果您还没有下载SDK,请访问http://developer.huaweicloud.com/sdk/java/dms-tcp.html下载SDK压缩包。下载dms.sdk.zip压缩包,即为DMS TCP SDK开发包,包含如下文件:[*]dms.sdk-1.0.0.jar:DMS TCP SDK包 [*]dms.protocol-1.0.0.jar: DMS TCP SDK包 [*]dms.client.properties:配置文件 [*]README.txt:发布说明文件 [*]third_lib.zip:DMS TCP SDK依赖的第三方jar包 [*]dms.sdk.api.chm:API接口参考
  • [介绍/入门] 分布式消息服务之TCP API环境准备!
    本帖最后由 云彩飞扬 于 2018-3-19 14:47 编辑 开发环境Eclipse:Eclipse 3.6.0及以上版本,可至Eclipse官方网站下载。JDK:Java Development Kit 1.8.111及以上版本,可至Oracle官方下载页面下载。Maven:Apache Maven 3.0.3及以上版本。获取队列ID和消费组的ID使用SDK接口访问DMS服务,需要先创建队列和消费组,步骤如下:[*]登录管理控制台。 [*]单击“服务列表”,选择“应用服务 > 分布式消息服务”,进入分布式消息服务信息页面。 [*]单击左侧菜单栏的“队列管理”。 [*]在“队列管理”页面,单击页面上方的“创建队列”。 每个用户默认最多可以创建5个队列,您可以在“删除队列”按钮上面看到您还可以创建多少个队列。如果您想创建更多队列,请联系客服申请增加配额。 [*]填写队列名称和描述信息。 表1 参数说明参数说明当前区域表示当前创建队列的区域。队列名称队列的名称,必须唯一。DMS为您自动生成了队列名称,您可以根据需要修改,队列名称只能包含a~z,A~Z,0-9,-,_,长度是[1,64]。创建队列后不能修改名称。队列类型[*]普通队列:包括分区有序和全局有序 [*]AMQP队列:使用AMQP协议的队列。Advanced Message Queuing Protocol,是统一消息服务的应用层标准的高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。 [*]Kafka队列:支持使用开源kafka客户端进行生产消息和消费消息,支持高吞吐和高可靠两种模式。队列模式队列类型为普通队列时,队列模式取值范围: [*]分区有序:的普通队列具有更高的并发性能,不保证先入先出(FIFO)的严格顺序。 [*]全局有序:的普通队列保证消息先入先出(FIFO)的严格顺序。 队列类型为Kafka队列时,队列模式取值范围: [*]高吞吐:消息副本异步落盘,具有较高的性能 [*]高可靠:消息多副本同步落盘,保证消息的可靠性。是否开启死信仅队列类型为普通队列时,才有该参数。是否开启死信消息,死信消息是指无法被正常消费的消息。当达到最大消费次数仍然消费失败后,DMS会将该条消息转存到死信队列中,有效期为72小时,用户可以根据需要对死信消息进行重新消费。消费死信消息时,只能消费该消费组产生的死信消息。全局有序的队列的死信消息依然按照先入先出(FIFO)的顺序存储在死信队列中。默认值:关闭。消息保留时长(小时)仅Kafka队列才有该参数。指定kafka队列的消息保存时间,超过该时长的消息将会被删除,删除的消息无法被消费。取值范围:1-72,必须为整数。默认值:72小时。最大消费次数仅开启死信时,才有该参数。消息进入死信队列前可重复接收次数。取值范围:1~100默认值:3描述(可选)队列描述不能包含,长度是[0,160]。图1 创建队列[*]单击“确定”。创建队列完成。 [*]单击队列名称,显示队列详情,获取队列ID,如图2所示。 图2 获取队列ID [*]单击“创建消费组”。进入“创建消费组”页面。 [*]填写消费组的名称。 DMS为您自动生成了消费组名称,您可以根据需要修改,消费组的名称只能包含a~z,A~Z,0~9,-,_,长度是[1,32]。同个队列的消费组名称不能重复。 [*]单击“确定”。创建消费组完成,获取消费组ID,如图3所示。 图3 获取消费组ID 获取project id在调用接口的时候,需要填入项目编号project_id,所以需要先在管理控制台上获取到项目编号,步骤如下:[*]注册并登录管理控制台。 [*]单击用户名,在下拉列表中单击“我的凭证”。 [*]在“我的凭证”页面的“项目列表”中查看项目ID。 图4 获取项目ID 获取AK/SK[*]登录管理控制台。 [*]单击用户名,在下拉列表中单击“我的凭证”。 [*]在“我的凭证”页,单击“管理访问密钥”页签。 [*]单击“新增访问密钥”,进入“新增访问密钥”页面。 [*]输入当前用户的登录密码。 [*]通过邮箱或者手机进行验证,输入对应的验证码。 [*]单击“确定”,下载访问密钥。 说明:为防止访问密钥泄露,建议您将其保存到安全的位置。 [*]保存文件到本地,从下载的credentials.csv文件中获取“Access Key Id”和“Secret Access Key”。 获取区域和Endpoint Region域名端口号中国华北区1dms-tcp.cn-north-1.myhuaweicloud.com60010中国华东区2dms-tcp.cn-east-2.myhuaweicloud.com60010中国华南区1dms-tcp.cn-south-1.myhuaweicloud.com60010购买弹性云服务器使用DMS TCP SDK之前,需要购买弹性云服务器ECS,否则公网无法直接访问DMS,购买方法请参考“购买弹性云服务器”。说明:弹性IP用于登录弹性云服务器,以及上传文件等。配置内网DNS。说明:新创建的ECS不需要再配置DNS,如果使用已有的旧的ECS,则需要配置DNS的IP。华北区的DNS IP:100.125.1.250华东区的DNS IP:100.125.17.29华南区的DNS IP:100.125.1.250示例如下:环境信息汇总表2 环境信息汇总类型项目收集的信息(以下为示例,请根据实际情况替换)弹性云服务器弹性IP114.115.141.228用户名huaweicloud密码password分布式消息服务队列名称my-tcp-queue队列ID5964181e-b67e-4d35-9281-a58c352abda6队列类型普通队列消费组名称my-tcp-group消费组IDg-c861aa48-a082-48ff-bc9d-ff36fe7aed38访问密钥AK (Access Key Id)VAODAIIJGPUAYTJRRLODSK (Secret Access Key)ZHN49c6bpwDiQvPqKJ5CxutJxqc04Glt9xSzxYWi项目ID所属区域中国华北区1项目cn-north-1项目IDbd67aaead60940d688b872c31bdc663b区域和Endpoint区域名称中国华北区1Endpointdms-tcp.cn-north-1.myhuaweicloud.com端口号60010DNSDNS服务器IP华北:100.125.1.250华东:100.125.17.29华南:100.125.1.250
  • [介绍/入门] 分布式消息服务之TCP API示例工程代码导读
    本帖最后由 云彩飞扬 于 2018-3-16 11:55 编辑 DMS TCP Demo示例工程中包含DmsProducerDemo和DmsConsumerDemo两个示例,DmsProducerDemo用于展示生产消息流程,DmsConsumerDemo用于展示消费和确认消息流程。生产消息[*]创建并启动DmsProducer。 DmsProducer producer = new DmsProducerImpl();producer.start(); [*]构建要发送的消息内容。 List messages = new ArrayList();final int messageNum = 10;for (int i = 0; i messageNum; i++){ DmsMessage record = new DmsMessage(); record.setBody(("Hello DMS syn produce: " + i).getBytes()); messages.add(record);} [*]发送消息。 try{ List result = producer.produce(queueId, messages); result.forEach(r -> { System.out.println(r.getState()); });}catch (Throwable t){ t.printStackTrace();} [*]停止生产。 producer.stop();消费消息[*]创建并启动消费实例。 DmsConsumer consumer = new DmsConsumerImpl();consumer.start(); [*]消费消息。 List records = consumer.consume(queueId, groupId); [*]构建确认请求。 DmsCommitRequest commitRequest = new DmsCommitRequest();List messages = new ArrayList();for (DmsConsumeResult record : records){ System.out.println(record.getHandler()); DmsCommitItem commitItem = new DmsCommitItem(); //确认时需要回填对应消息handler commitItem.setHandler(record.getHandler()); //设置消息处理状态: true or false commitItem.setStatus(true); messages.add(commitItem);}//一次可确认多条消息commitRequest.setMessage(messages); [*]确认消息。 DmsCommitResult commitResult = consumer.commit(queueId, groupId, commitRequest); [*]停止消费。 consumer.stop();
  • [介绍/入门] 分布式消息服务之TCP API编译示例工程
    本帖最后由 云彩飞扬 于 2018-3-16 11:35 编辑1.下载并解压。DMS TCP Demo示例工程代码2.打开Eclipse,通过“File -> Import…”菜单导入已存在的Maven工程,选择DmsTcpDemoClient解压目录,导入示例工程代码。3.鼠标右键点击“dms.tcp.demo”项目,在弹出的上下文菜单中选择“Run As -> Maven build…”,执行目标输入“clean package”,执行编译构建。4.构建输出位于DmsTcpDemoClient工程的target目录下,缺省文件名为dms.tcp.demo-1.0.0-SNAPSHOT.jar。5.使用dms.tcp.demo-1.0.0-SNAPSHOT.jar替换弹性云服务器DmsTcpDemoClient/dist/libs目录下的dms.tcp.demo-1.0.0.jar文件,按照“运行示例工程”执行验证。
  • [介绍/入门] 分布式消息服务之TCP API下载和运行示例工程
    本帖最后由 云彩飞扬 于 2018-3-16 11:30 编辑下载示例工程下载DmsTcpDemo示例工程代码,下载地址:https://dms-demo.obs.myhwclouds.com/DmsTcpDemoClient.zip运行示例工程12469
  • [介绍/入门] 分布式消息服务之TCP API快速入门环境准备
    本帖最后由 云彩飞扬 于 2018-3-15 18:14 编辑 开发环境Eclipse:Eclipse 3.6.0及以上版本,可至Eclipse官方网站下载。JDK:Java Development Kit 1.8.111及以上版本,可至Oracle官方下载页面下载。Maven:Apache Maven 3.0.3及以上版本。创建消息队列[*]通过HTTP API创建队列参考《分布式消息服务API参考》创建队列和查看队列。 [*]通过Web Console创建队列通过浏览器登录华为云,在分布式消息服务控制台中创建队列,队列类型选择“普通队列”或“有序队列”。请记录队列ID,后续访问需要使用。如果已创建过消息队列,可以跳过此步骤。创建消费组[*]通过HTTP API创建消费组参考《分布式消息服务API参考》创建消费组和查询消费组。 [*]通过Web Console创建消费组通过浏览器登录华为云,在分布式消息服务控制台中选择上文创建的消息队列,为该队列创建一个消费组。请记录消费组ID,后续访问需要使用。如果已为该消息队列创建过消费组,可以跳过此步骤。创建访问密钥通过浏览器登录华为云,选择“我的凭证”菜单,点击“管理访问密钥”标签,新增一组访问密钥,保存credentials.csv文件到本地。从credentials.csv文件中可以提取“Access Key Id”和“Secret Access Key”。如果之前已创建过访问密钥,可以跳过此步骤。获取项目ID通过浏览器登录华为云,选择“我的凭证”菜单,点击“项目列表”标签,根据所属区域记录对应的项目ID。获取区域和EndpointRegion域名端口号中国华北区1dms-tcp.cn-north-1.myhwclouds.com60010中国华东区2dms-tcp.cn-east-2.myhuaweicloud.com60010中国华南区1dms-tcp.cn-south-1.myhuaweicloud.com60010申请弹性云服务器通过浏览器登录华为云,在弹性云服务器控制台中申请创建一台Linux弹性云服务器,并绑定弹性IP。请记录弹性IP地址、用户名和密码,后续访问需要使用。如果已申请过华为云弹性云服务器,可以跳过此步骤。说明:弹性IP用于登录弹性云服务器,以及上传文件等。环境信息汇总表1类型项目收集的信息(以下为示例,请根据实际情况替换)弹性云服务器弹性IP114.115.141.228用户名huaweicloud密码password分布式消息服务队列名称my-tcp-queue队列ID5964181e-b67e-4d35-9281-a58c352abda6队列类型普通队列消费组名称my-tcp-group消费组IDg-c861aa48-a082-48ff-bc9d-ff36fe7aed38访问密钥AK (Access Key Id)VAODAIIJGPUAYTJRRLODSK (Secret Access Key)ZHN49c6bpwDiQvPqKJ5CxutJxqc04Glt9xSzxYWi项目ID所属区域中国华北区1项目cn-north-1项目IDbd67aaead60940d688b872c31bdc663b区域和Endpoint区域名称中国华北区1Endpointdms-tcp.cn-north-1.myhwclouds.com端口号60010DNSDNS服务器IP华北:100.125.1.250华东:100.125.17.29华南:100.125.1.250
  • [行业前沿] ServiceComb不能做api gateway,但是却有api gateway的一些功能,功能重合怎么办
    ServiceComb不能做api gateway,但是却有api gateway的一些功能,功能重合怎么办。 比如:ServiceComb有限流等,但是限流一般是api gateway的功能,大部分微服务需要gateway,用作权限控制,限流等,但是如果再用ServiceComb,就会发现有一些功能是重复的,不清楚这种情况怎么解决,ServiceComb有做gateway的功能吗
  • 【活动已结束】 体验华为云API SDK,输出体验报告有机会赢mate10!
    活动时间: 输出体验报告:2018年3月5日—5月14日 体验报告评审:2018年5月15-17日 活动结果公布:2018年5月18日(所有体验报告正在公平公正地评选中,待评选完成后将公布结果) 华为云API SDK介绍: 您可以基于华为云SDK通过编写代码的方式调用华为云API,或通过发起HTTP/HTTPS请求调用华为云API的方式来使用云产品,实现对应用、资源和数据更灵活的部署、更快速的操作、更精准的使用、更及时的监控。 活动参与方式: 1、注册登录并实名认证; 2、调用已购买产品或免费试用产品的API/SDK; 3、在该贴下按模板输出体验报告(问题描述+使用界面截图); 4、体验报告评审:筛选有效体验报告后由产品专家对报告进行综合评分。 5、活动结果公布:公布活动最终结果,获奖用户奖品寄送(所有奖品均包邮)。 体验报告输出规则: 1、文字、图片必须本人原创;逻辑清晰、图文并茂容易获得专家加分; 2、内容包含但不限于产品使用感受(如使用中存在bug,接口定义不够准确、规范不够清晰、文档不够细化、很难读懂、交互性和体验性不够好,以及使用华为云API/SDK存在的问题,有哪些需要重点提升的方面等各种建议。) [color=rgb(54,56,60)]3、报告格式: a.注明购买的产品和调用的API或使用的SDK; b.反馈跟API/SDK相关的使用问题(问题描述+截图)或改进建议; c.如有重复反馈,以最先回帖的用户为准。 [color=rgb(54,56,60)]体验报告参考模板(两种方式可任选): 1、#API SDK体验报告#使用的产品名称+是否好用+有没有需要优化的地方 如:XX产品可调用的SDK支持语言太少,建议增加XX语言。 2、#API SDK体验报告# 产品名称+ 使用环节 + 问题描述 + 优化建议 + 界面截图 如:在调用XX产品API时,在XX环节发现XX问题,建议做XX优化。 [color=rgb(54,56,60)]奖项评选方式: 1、产品团队从问题或BUG的级别、用户建议的价值等方面进行综合评分。最具价值体验官须反馈提议3条以上有效体验报告; 2、各类奖项不能叠加,每个用户只能获得一个奖项,如遇同一用户获得两个奖项,则以所获最高奖项为准,其奖品顺延至下一用户; 3、如体验报告总数未达到30份,则奖项及奖品酌情处理;4、活动参与需遵守《华为云社区常规活动规则》,戳>>>这里 活动奖品展示: [color=rgb(54,56,60)]最具价值体验官(1名):华为mate 10(4GB+64GB) [color=rgb(54,56,60)]优质建议奖(3名):华为VR [color=rgb(54,56,60)]特别参与奖(15名):荣耀引擎耳机二代 华为云开发者中心:http://developer.huaweicloud.com/ 更多开发者活动请戳:礼献开发者 爱在华为云
  • [公告] DLS的模型开发API为什么叫“MoXing”?
    小伙伴们探索华为云DLS的过程中,一定会发现我们独家提供的MoXing API。相比使用TensorFlow和MXNet原生API,使用MoXing API开发深度学习算法模型不但编程简单,而且能够自动获得高性能的分布式执行能力。大家可能会好奇,这套强大的API为什么叫做“MoXing”呢? MoXing首先是“模型”一词的汉语拼音。深度学习时代,我们中国的科研和工程团队已经成为行业的引领者。使用源于中文的名称,彰显了DLS研发团队的自信。我们将努力把MoXing API打造为“模型”开发领域的业界标杆。当然,脑洞大开的用户也可以把MoXing理解成“魔性”,相信我们API的魔性能够使您的模型开发如虎添翼。 MoXing同时也是英文“ModelCrossing”的缩写。Crossing一方面具有“道路交汇口”的含义,Model Crossing代表我们的API汇集了来自四面八方的经典模型,为用户打通了连接模型领域最新成果的道路。Crossing另一方面具有“跨越式航行”的含义,Model Crossing代表我们的API旨在实现模型的跨越式发展,为用户提供显著优于社区原生API的性能与易用性。 名称噱头再多,也盖不过底下的干货。希望小伙伴们好好研究一下MoXingAPI的用法,把它的潜力充分发掘出来吧!
  • [热门活动] 【成就最牛体验官】轻松玩转API测试,限时免费体验(已结束)
    本活动已结束,获奖公告详见:https://forum.huaweicloud.com/thread-8500-1-1.html 华为云DevCloud API测试功能重磅上线,助力轻松玩转API测试,降低技术门槛,适用多种角色,限时免费体验,反馈意见有机会赢取好礼,还等什么,快来参与吧!一、 活动时间2018年2月27日至2018年4月30日 二、 活动规则 1. 按照指引免费体验API测试功能,戳此查看详情>>>; 2. 体验后,回复本帖进行意见反馈; 3. 用户可从#产品功能#、#用户体验#、#使用技巧#、#实践分享#、#产品对比#、#其他#角度反馈意见,字数至少30字以上,可以提交多条反馈意见,活动结束后进行评奖; 请参照如下格式进行回帖: #用户体验#拖拽脚本模板即可编排测试用例,降低了编写测试用例的工作量,增强了使用乐趣,但拖拽仅限制于拖拽到指定方框内,而不是整个空白区域,有些不便,希望能够改善。 4. 专家评审将从用户建议的价值、问题或BUG的级别等方面进行综合评选,文字、图片需本人原创,逻辑清晰、图文并茂者加分; 5. 回复无意义内容(纯数字、标点、表情或词不达意等)、谩骂、造谣等,均视为无效; 三、 评奖方式: 以下所有奖项将于活动结束后在论坛公布获奖名单。 1. 最牛体验官 专家评审,评选出一份最有价值的体验报告,获最牛体验官奖,奖品为kindle一个; 2. 优质建议奖 专家评审,评选出三份较为优质的体验意见,获优质建议奖,奖品为肩颈**器一个; 3. 幸运满满奖 活动结束后,在所有盖楼的用户中抽取获奖楼层,获奖楼层=总楼层*中奖百分比,中奖百分比为5%、15%、25%、35%、45%、55%、65%、75%、85%、95%。例如:活动结束后总楼层为500,500*5%=25,即第25楼获奖,其他获奖楼层同理可得。如出现小数点,则四舍五入,例如:活动结束后总楼层为530,530*5%=26.5,即第27楼获奖。无效楼层不参与中奖,做顺延处理,例如:抽取获奖楼层为第5楼,但5楼为无效楼层,即顺延至第6楼获奖,若依然为无效楼层,则继续顺延,以此类推,奖品为笔记本支架一个; 四、 奖品展示: 1. 最牛体验官一名,可获得kindle一个: 精巧轻薄外观设计,电子墨水屏,媲美纸书,运行内存翻倍,更加稳定,超长续航,持久陪伴。 10268 2. 优质建议奖三名,可获得肩颈10290器一个: 红光热敷,八颗10294头,更立体更真实,正反结合,推拿捏揉层层深入,全身适用,多重享受,守护健康。10269 3. 幸运满满奖十名,可获得笔记本支架一个: 折叠便携,稳固支撑,办公要舒适,拒做低头族。 10270 五、 奖品发放说明: 获奖用户请扫描下方二维码添加服务人员微信,验证信息请输入“API”,请将华为云用户名、帖子所在楼层、姓名、手机号、收货地址发送给微信群的服务人员,奖品将于活动结束后15个工作日内发放完毕。所有奖品均包邮,不额外收取任何费用。 10271 六、 注意事项: [*] 同一ID只能获奖一次,不能重复获奖; [*] 如有重复反馈,以最先回帖的用户为准; [*] 获奖用户需在奖项公布后的7个工作日内在华为云提交实名认证,并扫描微信二维码联系工作人员,提供收货人信息,否则视为自动放弃; [*] 奖品视为特殊商品,颜色和型号随机发送,发出后,不予退换; [*] 请大家文明参与活动,凡涉及在论坛灌水、作弊等违规行为,一经查出,将取消获奖资格; [*]活动参与需遵守《华为云社区常规活动规则》,戳>>>这里。
  • [分享交流] 【干货分享】华为云API介绍(三)华为云Java SDK 使用指导
    前提条件1.        已经获取相关API文档。       登录华为云官网 http://support.huaweicloud.com  查看各个云服务的接口参考文档。       通过这些文档,可以学习云平台所支持的API参数。2.        获取Java SDK(jar包)及其介绍文档       登录以下网站获取Python OpenStack SDK 的官方文档:       http://developer.huaweicloud.com/dev/sdk?all3.        获取华为云IAM鉴权信息和endpoint信息。          projectId/userDomainId参数获取方法见: http://forum.huaweicloud.com/forum.php?mod=viewthread&tid=1813        endpoint/AZ信息见: http://developer.huaweicloud.com/endpoint.html4.        开发环境已经安装好JDK 1.85.        欲了解Java SDK项目的源代码,请访问如下地址。       https://github.com/huawei/openstack4jJava代码示例DNS服务的简单Demo:创建zone、查询zone、删除zonepackage openstack4jdemo;import java.util.List;import com.huawei.openstack4j.core.transport.ProxyHost;import com.huawei.openstack4j.api.OSClient.OSClientV3;import com.huawei.openstack4j.api.types.ServiceType;import com.huawei.openstack4j.core.transport.Config;import com.huawei.openstack4j.model.common.Identifier;import com.huawei.openstack4j.model.dns.v2.Zone;import com.huawei.openstack4j.openstack.OSFactory;import com.huawei.openstack4j.openstack.dns.v2.domain.DesignateZone;import com.huawei.openstack4j.openstack.identity.internal.OverridableEndpointURLResolver;public class dns_test {        private static final String LANGUAGE = "zh-cn";        public static void main(String[] args) {                // step 1: add cloud service override endpoint   注意:示例中endpoint都使用华北区的,如果需要在华南区操作资源,需要相应修改为华南区的endpoint                OverridableEndpointURLResolver endpointResolver = new OverridableEndpointURLResolver();                endpointResolver.addOverrideEndpoint(ServiceType.VOLUME_BACKUP,                                "https://vbs.cn-north-1.myhwclouds.com/v2/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.DNS,                                "https://dns.myhwclouds.com/v2");                endpointResolver.addOverrideEndpoint(ServiceType.AUTO_SCALING,                                "https://as.cn-north-1.myhwclouds.com/autoscaling-api/v1/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.CLOUD_EYE,                                "https://ces.cn-north-1.myhwclouds.com/V1.0/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.LOAD_BALANCER,                                "https://elb.cn-north-1.myhwclouds.com/v1.0/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.MAP_REDUCE,                                "https://mrs.cn-north-1.myhwclouds.com/v1.1/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.KEY_MANAGEMENT,                                "https://kms.cn-north-1.myhwclouds.com/v1.0/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.CLOUD_TRACE,                                "https://cts.cn-north-1.myhwclouds.com/v1.0/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.ANTI_DDOS,                                "https://antiddos.cn-north-1.myhwclouds.com/v1/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.Notification,                                "https://smn.cn-north-1.myhwclouds.com/v2/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.MessageQueue,                                "https://dms.cn-north-1.myhwclouds.com/v1.0/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.MAAS,                                "https://maas.cn-north-1.myhwclouds.com/v1/%(project_id)s/objectstorage");                endpointResolver.addOverrideEndpoint(ServiceType.DATABASE, "https://rds.cn-north-1.myhwclouds.com");                // step 2: setup the authentication credit                String user = "wanglianmin";                String password = "XXXX";                String projectId = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";         //  华为云-用户中心-账号管理-基本信息-安全凭证-管理我的凭证,项目ID,按照region区分,如果想在华北创建资源,就找cn-north-1对应的项目ID。                String userDomainId = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";     //  华为云-用户中心-账号管理-基本信息-安全凭证-管理我的凭证,账户ID,各个区域统一。                String authUrl = "https://iam.cn-north-1.myhwclouds.com/v3";                // step 3: initial OpenStack4j Client                OSFactory.enableHttpLoggingFilter(true);                // config of the client                // with language setting is required for RDS(trove&database) service                Config config = Config.newConfig().withEndpointURLResolver(endpointResolver).withLanguage(LANGUAGE)                                .withSSLVerificationDisabled();                // initial client                OSClientV3 osclient = OSFactory.builderV3().withConfig(config).endpoint(authUrl)                                .credentials(user, password, Identifier.byId(userDomainId)).scopeToDomain(Identifier.byId(userDomainId))                                .scopeToProject(Identifier.byId(projectId)).authenticate();                // // use client to visit DNS API                //                // create a public zone                Zone creation = DesignateZone.builder().name("sdk.tutorial.com.").description("tutorial").ttl(600)                                .email("admin@tutorial.com").build();                Zone zone = osclient.dns().zones().create(creation);                // get the created zone                Zone get = osclient.dns().zones().get(zone.getId());                // delete the created zone                //osclient.dns().zones().delete(get.getId());                List list = osclient.dns().zones().list();                System.out.println(list);                               // delete zone                osclient.dns().zones().delete(get.getId());        }}[/code]再来一个ECS弹性云服务器的示例,包括查询Server、创建Server、启动、停止、重启、删除Server[code]import java.util.List;import java.util.stream.Collectors;import sun.misc.BASE64Encoder;import sun.misc.BASE64Decoder;import java.util.ArrayList;import java.util.HashMap;import java.util.Map;import java.util.concurrent.TimeUnit;import com.huawei.openstack4j.api.Builders;import com.huawei.openstack4j.api.OSClient.OSClientV3;import com.huawei.openstack4j.api.types.ServiceType;import com.huawei.openstack4j.core.transport.Config;import com.huawei.openstack4j.model.common.ActionResponse;import com.huawei.openstack4j.model.common.Identifier;import com.huawei.openstack4j.openstack.OSFactory;import com.huawei.openstack4j.openstack.identity.internal.OverridableEndpointURLResolver;import com.huawei.openstack4j.model.compute.Action;import com.huawei.openstack4j.model.compute.RebootType;import com.huawei.openstack4j.model.compute.Server;import com.huawei.openstack4j.model.compute.Server.Status;import com.huawei.openstack4j.model.compute.ServerCreate;public class Demo_for_WebSite {        private static final String LANGUAGE = "zh-cn";        public static void main(String[] args) {                /* 第一步:填入华为云区域的endpoint                 * 如下,对接华北区1就需要填入华北区服务的endpoint,以下为全量服务,用户根据自己的需要进行覆写                 */                OverridableEndpointURLResolver endpointResolver = new OverridableEndpointURLResolver();                endpointResolver.addOverrideEndpoint(ServiceType.VOLUME_BACKUP,                                "https://vbs.cn-north-1.myhuaweicloud.com/v2/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.DNS,                                "https://dns.myhuaweicloud.com/v2");                endpointResolver.addOverrideEndpoint(ServiceType.AUTO_SCALING,                                "https://as.cn-north-1.myhuaweicloud.com/autoscaling-api/v1/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.CLOUD_EYE,                                "https://ces.cn-north-1.myhuaweicloud.com/V1.0/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.LOAD_BALANCER,                                "https://elb.cn-north-1.myhuaweicloud.com/v1.0/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.MAP_REDUCE,                                "https://mrs.cn-north-1.myhuaweicloud.com/v1.1/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.KEY_MANAGEMENT,                                "https://kms.cn-north-1.myhuaweicloud.com/v1.0/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.CLOUD_TRACE,                                "https://cts.cn-north-1.myhuaweicloud.com/v1.0/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.ANTI_DDOS,                                "https://antiddos.cn-north-1.myhuaweicloud.com/v1/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.Notification,                                "https://smn.cn-north-1.myhuaweicloud.com/v2/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.MessageQueue,                                "https://dms.cn-north-1.myhuaweicloud.com/v1.0/%(project_id)s");                endpointResolver.addOverrideEndpoint(ServiceType.MAAS,                                "https://maas.cn-north-1.myhuaweicloud.com/v1/%(project_id)s/objectstorage");                endpointResolver.addOverrideEndpoint(ServiceType.DATABASE, "https://rds.cn-north-1.myhuaweicloud.com");                /* 第二步: 配置鉴权信息(以对接华北区为例)                 * user为用户名                 * projectId为华为云控制台-账户中心-基本信息-管理我的凭证-项目列表中华北区的项目ID                 * userDomainId为华为云控制台-账户中心-基本信息-管理我的凭证的账户ID                 * authURL为IAM服务华北区的域名                 */                String user = "wanglianmin";                String password = "XXXXXX";                String projectId = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";                String userDomainId = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";                String authUrl = "https://iam.cn-north-1.myhuaweicloud.com/v3";                // 第三步: 初始化一个连接                OSFactory.enableHttpLoggingFilter(true);   //调试用,可以显示request body和response body                Config config = Config.newConfig().withEndpointURLResolver(endpointResolver).withLanguage(LANGUAGE)                                .withSSLVerificationDisabled();                OSClientV3 osclient = OSFactory.builderV3().withConfig(config).endpoint(authUrl)                                .credentials(user, password, Identifier.byId(userDomainId)).scopeToDomain(Identifier.byId(userDomainId))                                .scopeToProject(Identifier.byId(projectId)).authenticate();                // 第四步: 过滤查询弹性云服务器列表                Map filter_name = new HashMap();                filter_name.put("name", "ecs");                filter_name.put("status", "ACTIVE");                List servers = osclient.compute().servers().list(filter_name);                System.out.println(servers);                               // 第五步:创建虚拟机,填入所需参数;停止、启动、重启、删除虚拟机                String imageId = "1189efbf-d48b-46ad-a823-94b942e2a000";                String flavorId = "s2.small.1";                String networkId = "ef039b60-6a14-42d1-963b-687b627fea08";                String imageId_Windows = "201150a6-479e-45f3-8a4c-fe91855758f0";                                              // 创建Linux密码虚拟机,目前密码使用user-data参数传入,将来会统一使用adminPass参数(注意echo后面的是单引号,单引号!!!)                String userData_org = "#!/bin/bash \r\n echo ´root:P@ssWr0d123´ | chpasswd ;";                byte[] userData_byte = userData_org.getBytes();                String userData = new BASE64Encoder().encode(userData_byte);                // generate networkList                ArrayList networkList = new ArrayList();                networkList.add(networkId);                // generate server body                ServerCreate sc_Linux = Builders.server().name("zt-Linux-test-sdk").flavor(flavorId).image(imageId).availabilityZone("cn-north-1b").userData(userData).networks(networkList).build();                System.out.println("New Server body " + sc_Linux);                Server newServer = osclient.compute().servers().boot(sc_Linux);                osclient.compute().servers().waitForServerStatus(newServer.getId(), Status.ACTIVE, 10, TimeUnit.MINUTES);                System.out.println("New Server " + newServer);                                                              // 创建Windows密码虚拟机,目前密码使用metadata参数传入,将来会统一使用adminPass参数                ServerCreate sc_Windows = Builders.server().name("zt-Windows-test-sdk").flavor(flavorId).image(imageId_Windows).availabilityZone("cn-north-1b").addMetadataItem("admin_pass", "P@ssWr0d123").networks(networkList).build();                System.out.println("New Server body " + sc_Windows);                Server newServer_Windows = osclient.compute().servers().boot(sc_Windows);                osclient.compute().servers().waitForServerStatus(newServer_Windows.getId(), Status.ACTIVE, 10, TimeUnit.MINUTES);                System.out.println("New Server " + newServer_Windows);                                     // 停止虚拟机                ActionResponse repStop = osclient.compute().servers().action(newServer.getId(), Action.STOP);        if(repStop.isSuccess()) {            System.out.println("Stop the server success, status = " + newServer.getId() + newServer.getVmState());        }else {            System.out.println("Stop the server failed " + newServer.getId());        }        osclient.compute().servers().waitForServerStatus(newServer.getId(), Status.SHUTOFF, 3, TimeUnit.MINUTES);                // 启动虚拟机        ActionResponse repStart = osclient.compute().servers().action(newServer.getId(), Action.START);        if(repStart.isSuccess()) {            System.out.println("Start the server success, status = " + newServer.getId() + newServer.getVmState());        }else {            System.out.println("Start the server failed " + newServer.getId());        }        osclient.compute().servers().waitForServerStatus(newServer.getId(), Status.ACTIVE, 3, TimeUnit.MINUTES);                // 重启虚拟机                ActionResponse repReboot = osclient.compute().servers().reboot(newServer.getId(), RebootType.SOFT);        if(repReboot.isSuccess()) {            System.out.println("Reboot the server success, status = " + newServer.getId() + newServer.getVmState());        }else {            System.out.println("Reboot the server failed " + newServer.getId());        }        osclient.compute().servers().waitForServerStatus(newServer.getId(), Status.ACTIVE, 3, TimeUnit.MINUTES);                // 删除虚拟机        ActionResponse repDelete = osclient.compute().servers().delete(newServer.getId());        if(repDelete.isSuccess()) {            System.out.println("Delete the server success, status = " + newServer.getId() + newServer.getVmState());        }else {            System.out.println("Delete the server failed " + newServer.getId());        }                ActionResponse repDelete_Windows = osclient.compute().servers().delete(newServer_Windows.getId());        if(repDelete_Windows.isSuccess()) {            System.out.println("Delete the server success, status = " + newServer_Windows.getId() + newServer.getVmState());        }else {            System.out.println("Delete the server failed " + newServer_Windows.getId());        }                }        
  • [技术分享] API开发安全入门清单
    一、认证不要使用Basic Auth(基本身份认证),而要使用standard authentication(标准身份认证,例如JWT,OAuth);在身份认证、令牌生成、密码存储过程中不要重造轮子,必须使用标准的规范;在登录中使用Max Retry和jail功能;对所有敏感数据进行加密处理;JWT (JSON Web Token)使用一个随机的、复杂的密钥(JWT密钥)来增加暴力破解令牌的难度;不要从JWT的有效载荷中提取算法,在后端强制执行算法(HS256 or RS256);限制Token的过期时间(TTL,RTTL),越短越好;不要将敏感数据存储在JWT的有效载荷中,因为它可以很轻松地被解码;OAuth始终验证服务器端redirect_uri地址,确定其只允许白名单的网址进去;通过code(代码)而不是tokens(令牌)的方式进行信息交换(禁用response_type=token);在state参数中使用一个随机的哈希值,来防止OAuth认证过程中发生CSRF攻击行为;定义默认范围,并验证每个应用程序的范围参数;二、访问限制请求(节流),以避免DDoS/暴力破解攻击;在服务器端使用HTTPS来避免中间人攻击(MITM);使用带有SSL的HSTS标头,来避免SSL Strip攻击(一种中间人攻击);三、输入根据实际操作使用适当的HTTP方法:GET(读取)、POST(创建)、PUT(替换/更新)以及DELETE(删除记录),如果请求的方法无法对应请求的资源,则使用“405错误(方法不被允许)”进行响应;验证请求接受标头(内容协商)中的content-type(内容类型),只允许你支持的格式(例如application/xml、application/json等),如果不匹配,则返回“406 错误(无法接受请求)”;验证发布数据中你接受的内容类型(例如 application/x-www-form-urlencoded、multipart/form-data、application/json等);验证用户输入以避免一些常见的漏洞(例如XSS、SQL注入以及远程代码执行等);请勿在链接中使用任何敏感数据(凭据、密码、安全令牌或API密钥等),而要使用标准的Authorization header(认证标头);四、处理检测所有端点是否受到身份验证保护,以避免身份验证过程中断;用户应该避免使用自己的资源ID。应该选择使用/me/orders 替代 /user/654321/orders;禁止使用自增ID,可以使用UUID替代;如果你正在解析XML文件,请确保未启用实体解析,以避免遭受XXE(XML外部实体攻击);如果你正在解析XML文件,请确保实体扩展功能未启用,以避免遭受递归实体扩展攻击(这种方式也被称之为“XML Bomb”或是“Billion Laughs Attack”);如果系统后台会将用户传入的参数作为命令或命令的一部分来执行,一定要进行严格的校验和限制;所有的上传都要进行大小校验和文件类型白名单校验,确保文件只能被上传到指定位置并限制用户能够上传文件的总大小;如果你需要处理的数据量很大,请尽可能在后台使用Workers 和 Queues的方式进行快速响应,以避免HTTP阻塞;不要忘记关闭DEBUG模式;五、输出发送X-Content-Type-Options:nosniff 标头;发送X-Frame-Options:deny标头;发送Content-Security-Policy:default-src‘none’ 标头;对响应的内容类型进行限制,如果你返回application/json,那么你的响应内容类型应为application/json;所有用户存入的数据或者来自第三方的数据输出的前台一定要进行滤过或者转义,防止XSS;不要返回凭据、密码、安全令牌等敏感数据;根据已经完成的操作返回适当的状态码。(例如200 OK、400 Bad Request、401 Unauthorized、405 Method Not Allowed等);集成及部署使用unit/integration(单元/集成)测试来审核你的设计和实施活动;启用代码审查程序,避免盲目自信;确保你服务器上的所有组件在进入生产之前都通过AV软件进行了静态扫描,包括供应商库(libraries)和其他依赖项;为部署过程设计一个回滚(rollback)的解决方案
  • [云日志] 云审计有提供API吗?
    RT, 我想把我线下的一些日志通过API上传到云上,和我云上的日志一起分析下。