关于cloud:什么是云计算领域的-Lowtouch-概念

在当今疾速演变的计算机软件开发畛域中,low-touch 技术正逐步成为一个重要的概念。Low-touch,中文可译为 低接触 或 少人工干预,指的是那些须要较少人工操作或干涉就能自行运行和保护的软件系统或解决方案。这类技术的倒退,旨在通过自动化和智能化伎俩,缩小人为的谬误,提高效率,降低成本,并最终实现更优的用户体验。 在解释 low-touch 概念的利用前,了解其在软件开发生命周期中的重要性至关重要。软件开发不仅仅波及编写代码,还包含需要剖析、设计、测试、部署和保护等多个阶段。在这整个流程中,low-touch 技术可能在多个环节缩小手动干涉,使得软件产品从构想到上线,再到前期的保护更新,整个过程更加高效和晦涩。 自动化测试自动化测试是 low-touch 技术利用的典型例子。传统的软件测试须要大量的手动工作,包含编写测试用例、执行测试、记录测试后果以及验证bug的修复。而自动化测试工具,如 Selenium、JUnit 等,能够主动执行这些工作,不仅进步了测试的效率和准确性,还可能在软件开发的晚期发现潜在的问题,缩小前期的保护老本。 继续集成与继续部署(CI/CD)继续集成(CI)和继续部署(CD)是实现 low-touch 软件开发流程的关键技术。CI/CD 通过自动化的形式,将代码的合并、测试和部署整合到一套流程中。开发者只需提交代码到版本控制系统,后续的编译、测试、部署等步骤都能够主动实现。这不仅放慢了软件开发的速度,还大大降低了因手动操作引入谬误的危险。 云服务和无服务器架构云服务(如 AWS、Azure、Google Cloud)提供了丰盛的 low-touch 解决方案,特地是在无服务器(Serverless)架构方面。无服务器架构容许开发者构建和运行应用程序,而无需关注底层服务器的治理和保护。这种模式下,开发者能够专一于代码的编写,而运行环境的搭建、扩大和保护等都由云服务提供商主动解决。 人工智能与机器学习人工智能(AI)和机器学习(ML)技术的融入,为实现 low-touch 软件开发提供了新的可能。通过利用 AI 和 ML,软件系统能够自我学习和适应,自动化实现简单的决策和工作解决。例如,AI 能够用于代码生成、缺点辨认和修复、用户行为预测等方面,进一步缩小人工干预的需要。 利用案例剖析思考一个电子商务平台的开发案例,该平台采纳了 low-touch 技术策略。平台通过自动化测试保障软件品质,利用 CI/CD 实现疾速迭代,采纳无服务器架构简化运维工作,并通过 AI 举荐算法优化用户体验。这种综合利用不仅减速了开发流程,还晋升了平台的稳定性和用户满意度。 论断Low-touch 技术正在重塑软件开发畛域,通过缩小人工干预,晋升开发效率和软件品质。从自动化测试到 AI 和无服务器架构的利用,low-touch 不仅是一种技术趋势,也是软件开发将来的方向。随着技术的不断进步,咱们能够预感,软件开发的 low-touch 个性将会更加显著,带来更多的翻新和改革。

February 24, 2024 · 1 min · jiezi

关于cloud:Tapdata-Cloud-基础课新功能详解之微信告警更及时的告警通知渠道

【前言】作为中国的 “Fivetran/Airbyte”, Tapdata 是一个以低提早数据挪动为外围劣势构建的古代数据平台,内置 60+ 数据连接器,领有稳固的实时采集和传输能力、秒级响应的数据实时计算能力、稳固易用的数据实时服务能力,以及低代码可视化操作等。典型用例包含数据库到数据库的复制、将数据引入数据仓库或数据湖,以及通用 ETL 解决等。援用随着版本迭代,越来越多的新性能个性“入驻”,为了帮忙用户理解版本差别,相熟性能用法,咱们最新推出《Tapdata 性能菜单》系列内容,放弃一贯的文字+视频的组合解说模式,每期一个新性能或新个性,为大家解说性能亮点,疾速展现相干操作配置及留神点。本期内容围绕「微信告警」开展, 将和大家一起体验邮件、短信告诉外的及时告警快捷新模式。对于运维而言,监控告警的重要性自是显而易见。一方面可能提高效率,实现自动化监控,缩小人工运维干涉;一方面又有助于疾速发现问题,进步零碎稳定性。作为监控零碎中的重要性能,告警告诉非常重视“及时性”。运维人员不可能时刻盯着服务器,故障产生时就须要依赖告警告诉,来提醒咱们及时发现零碎中的异常情况,并采取相应的措施来解决问题,从而保障系统的失常运行。 常见的告警形式包含邮件、短信,以及即时通讯 App,其中,即时通讯又多以微信为代表,而这三种告诉形式又各具劣势: 邮件告诉的长处在于信息展现更全面、格局模板更清晰;短信告诉的长处在于高度牢靠,送达率较高,信息传递更简洁明了;即时通讯 App 告诉的长处以微信为例,包含告诉实时性更高,格局模板更清晰,不便置顶操作,以及作为大部分用户日常重度应用的软件,信息脱漏率更低。Tapdata Cloud【微信告警】已上线戳这里,查看性能详解及配置演示 入口指路:点击登录 Tapdata Cloud 为了进一步晋升应用体验,满足不同用户的信息接管习惯,补救邮件告诉和短信告诉的即时性短板,升高信息脱漏危险,造成优势互补的全组合告诉模式,防止因告警告诉信息未能即时触达而导致一系列后续问题,Tapdata 目前已实现【微信告警】性能。开启后,一旦出现异常状况,Tapdata 公众号就会向用户发送蕴含故障问题以及产生工夫的要害信息告警告诉,从而帮忙用户预防潜在问题,更快定位和解决问题,防止问题扩充,升高业务影响。 实用场景 目前,Tapdata Cloud 反对的告警告诉场景包含:当工作遇到谬误时当工作全量实现时当工作增量开始时当工作进行时当 Agent 状态为离线时当工作的增量提早在间断一段时间内超过预期划线数值时当数据源节点的均匀解决耗时在间断一段时间内内超过预期划线数值时当节点的均匀解决耗时在间断一段时间内内超过预期划线数值时…… 以上状况均可通过自主设置抉择是否获取告诉,以及对应的告诉渠道。除最新上线的微信告警外,用户还可同步抉择零碎告诉、邮件告诉,以及短信告诉。 告诉内容 如例图所示,Tapdata Cloud 将通过微信公众号向用户发送微信告警的要害信息,包含呈现的问题、对应地位,以及问题发现的工夫。须要用户登录在收到告诉后,登录 Tapdata Cloud 控制台查看并确认起因。 接下来,咱们还将围绕微信告警性能进行进一步优化,疾速落实错误码的实现。届时,每一个错误码会对应到具体的谬误形容、谬误起因,以及解决方案,以期为用户提供更多告警细节信息。 如何开启 Tapdata Cloud【微信告警】① 登录 Tapdata Cloud*留神:如需开启微信告诉,必须保障在登录注册环节已实现微信号绑定。因而,针对不同账号状况,须要注意不同的操作注意事项: A. 已有账号且已绑定过微信号间接扫码登录即可 B. 已有账号但尚未绑定集体微信号退出已有账号,回到登录首页抉择扫码登录(如需绑定已有账号,倡议PC端操作,微信内操作则默认创立新账号) 点击【我想绑定到已有账号】,通过短信验证实现绑定 C. 首次注册用户间接扫码注册并抉择创立新账号,开启 Tapdata Cloud 新体验② 关注 Tapdata 官网微信服务号 *留神:首次扫码注册登录会弹出公众号关注提醒,已绑定微信的历史用户需保障服务号处于关注状态,并敞开服务号设置中的【音讯免打搅】。 ③ 开启【微信告警】性能目前,Tapdata 同时反对全局微信告警设置,以及针对单个工作的独立告警设置。A. 全局微信告警设置进入【零碎告诉】页面 点击【告诉设置】 ...

March 3, 2023 · 1 min · jiezi

关于cloud:五分钟体验华为云-IoT-物模型创建过程

物联网(Internet of Things,简称IoT)是指通过包含信息传感器,射频辨认技术,全球定位系统等各种基础设施和通信技术,实时采集任何须要监控,连贯并互动的物体或过程,采集其声,光,热,电,力学,化学,生物等各种维度和类别的信息,通过网络接入,实现物与物,物与人的深度连贯,实现对物品和过程的智能化感知,辨认和治理。 国内各大 IT 公司都推出了本人的 IoT 解决方案和平台,华为也不例外。本文将帮忙没有任何 IoT 建模根底的敌人们,一窥华为云 IoT 平台上创立物模型的最简略流程。 咱们通过这个链接进入华为云 IoT 设施接入控制台: https://console.huaweicloud.c... 看到如下页面。单击左侧导航栏的产品菜单选项: 在右侧的产品性能介绍页面,单击 创立产品 按钮: 咱们新建一个产品模型,形容一种智能空调设备,设施类型抉择 智能空调: 点击确定即可保留。 咱们保留产品之后,能够点击 自定义模型,为该产品模型削减更多的自定义属性和行为: 比方增加一个自定义开机的服务,这样咱们就能够定时唤醒空调,比方上班前一小时,主动开启空调,这样上班回家之后,家里的温度就主动调节到了合适的值: 为定时开关机服务削减新的自定义属性:定时开机工夫,数据类型为 dateTime(日期工夫): 同理,削减另一个自定义属性:定时关机工夫 削减一个新的命令:定时开机 设施执行 定时开机 后,须要返回一个状态码给 IoT 平台,告知设施理论的执行状况。咱们把这个返回状态码命名为 设施状态,其数据类型为整型,0 示意开机胜利,大于 0 的返回值,阐明开机失败。每个大于 0 的值映射到一个具体的谬误起因。 设施的服务和自定义属性定义结束之后,能够点击导出按钮,以 JSON 格局输入咱们在华为云 IoT 平台里创立的模型信息: 能够本地查看这些模型定义文件的文本内容,或者上传到 Github,同团队其余成员协同编辑: 产品模型创立结束后,咱们能够通过华为云 IoT 平台提供的工具,进行简略的在线调试。选中咱们之前创立的产品模型,切换到在线调试面板,点击新增调试设施按钮: 在设施创立向导里,将设施类型设置为 虚构设施: 平台主动为咱们创立好了一个虚构设施: 咱们在所有设施菜单里,找到这个 IoT 平台帮咱们创立的虚构设施,抉择调试: ...

October 31, 2022 · 1 min · jiezi

关于cloud:三个最好的朋友TerraformAnsible-和-Jenkins

应用Jenkins CI/CD Pipeline通过Terraform和Ansible创立AWS基础设施。 首先,我要感激Derek Morgan和他的Terraform、Ansible and Jenkins课程。我最近实现了他的课程,再怎么举荐也不为过。它从小开始,到最初你有一个简单的工作我的项目。实现每门课程后,我都会尝试创立本人的我的项目来强化我所学的常识,而这篇文章正是记录了这一点。该项目标最终后果是Terraform代码,该代码创立了一个带有公共子网和EC2实例的AWS环境,以及一个在新创建的EC2实例上装置Docker的Ansible Playbook剧本脚本文件。当代码被推送到GitHub存储库时,GitHub Webhook将触发Jenkins CI/CD pipeline,该pipeline将执行一系列操作,具体取决于咱们是将代码推送到开发分支还是主分支。 留神:本文显示了实现的我的项目,但心愿您在构建它时测试每个局部以验证一切正常,而不是一下子就齐全构建它。对于这个,我不打算具体阐明我是如何做到的。例如,我不会具体介绍如何设置Terraform,而后在构建基础设施时逐渐测试代码,以及如何在将playbook利用到Jenkins管道之前配置Ansible并在本地测试它们等。只是意识到这些步骤在开发过程中是典型的。依照我列出此文档的形式,如果您依照这种形式独自进行测试,您将遇到谬误。如果您想理解更多详细信息,我再次建议您查看Derek的课程。免责申明:尽管本文将带您实现该项目标步骤,但它并不是一个教程,而是我最近的一个副我的项目的文档。如果您收到任何谬误,请不要发送怨恨邮件。 先决条件GitHub帐户AWS CLI装置TerraformAWS账户具备管理员权限的AWS用户AWS Cloud9(您能够应用其余 IDE,但要意识到某些步骤可能会有所不同)Terraform Cloud帐户装置Git开始设置环境创立您的Amazon Cloud9环境应用除平台局部之外的所有默认值。抉择Ubuntu Server 18.04LTS。 调配Elastic IP为了避免Cloud9实例在每次敞开和重新启动时更改其公共IP地址,请为其调配一个弹性IP。这也将容许稍后将公共IP调配给平安组的Terraform变量。只需确保在删除Cloud9实例后删除弹性IP,否则将收取费用。 在AWS控制台中导航到EC2在Network和Security下抉择Elastic IP单击调配Allocate Elastic IP address点击Allocate从Action下拉列表中抉择Associate Elastic IP Address实例:抉择您的Cloud9实例,公有IP地址:抉择您的Cloud9公有IP地址。单击Associate。 调整Cloud9实例的大小Derek的课程提供了一个很棒的大小调整脚本来扩充Cloud9实例的存储空间,这将是必须的。 在Cloud9中创立一个名为resize.sh的文件将Derek存储库中的代码复制到您的resize.sh文件中运行chmod +x resize.sh运行./resize.sh创立SSH密钥在您的终端中运行ssh-keygen -t rsa输出保留密钥的文件(我命名为 mykey):/home/ubuntu/.ssh/<key name>没有明码通过运行ls ~/.ssh验证您的密钥是否已创立装置jq运行sudo apt install jq Fork Repo如果您想fork并援用它,能够在这里找到我的代码:https://github.com/troy-ingra... Terraform Cloud[Terraform Cloud]容许您将Terraform状态存储在近程平安地位,而不是将其存储在本地。这容许更好的安全性和更好的团队合作。 创立一个新的workspace抉择CLI-driven workflow命名您的workspace,而后创立workspace复制workspace提供的示例代码并将其增加到backends.tf以替换以后后端通过单击Remote并抉择Local来设置Execution Mode创立Terraform Cloud令牌单击浏览器右上角的Profile,而后抉择User settings在User settings下抉择Token单击创立Create API token输出形容并单击创立Create API token复制提供的令牌并将其保留在平安的中央(如果您失落了它,您能够随时使令牌过期并创立另一个)导航到Cloud9终端并运行terraform login键入yes,而后粘贴之前复制的Terraform Cloud令牌运行terraform init这将咱们的Terraform代码连贯到咱们的Terraform Cloud的workspace的替换了Terraform Cloud的本地后端。Jenkins将来在运行管道时也会拜访Terraform Cloud。 Terraform作为与云无关的产品,HashiCorp的Terraform反对多云和本地。它是一个开源工具,具备企业版和社区版,应用HashiCorp本人的HashiCorp配置语言 (HCL)。 Terraform的HCL容许开发人员学习一种语言以应用多种云产品和本地提供商,而不用为每种语言学习新的服务和语言。 HCL是一种申明性语言,专一于最终状态,而不是过程语言,其中所有命令都按编写的程序执行。 Hashicorp为开发人员提供无关Terraform的文档,并且能够拜访官网和社区模板的Terraform Registry。 ...

October 24, 2022 · 4 min · jiezi

关于cloud:关于使用命令行-cf-login-登录-SAP-BTP-CloudFoundry-环境的问题

在 SAP BTP 平台 CloudFoundry 环境找到 API endpoint: 而后应用命令行 cf api,前面跟上这个 API endpoint: 而后应用 cf login 命令行登录: 如果password输出谬误,会遇到上图的谬误音讯: Authenticating...{"error":"invalid_grant","error_description":"User authentication failed: Unauthorized"}输出正确的password之后,就能够看到这个 CloudFoundry 环境下的 org 列表了: 在 windows 环境变量设置里,将 CF_TRACE 设置为 true: 而后输出一个谬误的password,能看到 HTTP 401 unauthorized 谬误: 在password输出正确的状况下,会返回颁发的 Access Token 和 refresh token: 这个 note 介绍了对于 SAP BTP 重置password的话题。 实际上,无奈通过 SAP Business Technology Platform 重置用户password。 这是因为,BTP 不存储用户password。它应用存储用户的身份提供者(Identity Providers),这是终端用户须要治理用户详细信息的中央。 用户详细信息的治理必须在身份提供者端(Identity Provider)进行: 如果您应用默认身份提供者(SAP ID 服务),您必须参考 1808560 - 如何重置 S-User ID password - SAP ONE Support Launchpad;如果您应用自定义身份提供者,您必须分割身份提供者团队并申请他们帮助刷新password。SAP ID 服务是 SAP BTP 平台用户和业务用户(在应用程序中)的默认身份提供者。 通常状况下,用户无需进一步配置即可开始应用它。 ...

September 1, 2022 · 1 min · jiezi

关于cloud:在-CloudIDE-里实现天猫精灵自定义技能的业务逻辑

技能后端编码技能的后端编码是天猫精灵自定义技能开发的重头戏。点击 代码编辑 面板,能够为该技能针对的业务接口实现,抉择对应的服务部署形式。 在线开发模式同阿里云云原生开发即 FAAS,这两种形式均无需搭建本人的应用服务器,区别在于前者作为一款收费的云服务资源和在线开发环境,资源额度无限,更适宜疾速体验天猫精灵技能利用的开发流程,而不适宜用于技能的生产模式下部署。 因此我抉择了阿里云的 Serverless 产品 FAAS,能够间接在浏览器里进行技能后端服务的开发,调试,部署和运行。 顺次开明 API 网关,日志服务,函数计算,对象存储四个资源后,基于 Java Spring Boot 利用模板,疾速创立一个服务实现: 拜访 FAAS 环境的控制台 url: 这个后盾服务接口的 Java 实现代码,托管在 codeup 代码仓库上: 在开发部署页面,咱们能够查看部署日志,对 FAAS 实例的硬件参数进行调整等操作: API 网关和 FC 计算服务的关系如下图所示: 点击 返回开发,就能够在浏览器里应用 CloudIDE 进行 Java 开发了: 对于天天用 Visual Studio Code 进行 Angular 开发的笔者,对于这个浏览器里应用的 Cloud IDE 的外观再相熟不过了:https://workbench.aliyun.com/... 在 Cloud IDE 里能实现绝大多数惯例的开发操作,比方代码编辑,git 代码仓库提交,Maven 构建,一键部署等等: 该 Cloud IDE 提供的更多功能,能够通过 视图-> 命令面板 里查看: ...

May 12, 2022 · 1 min · jiezi

关于cloud:如何成为一名亚马逊云科技-Community-Builder

申明:本文转自DEV Community网站,文章翻译由开发者社区提供;点击下方链接,查看英文原文: https://dev.to/aws-builders/h...你是一个雄心勃勃但又谦虚的人,对学习充斥了渴望。你热衷于分享云计算的力量,同时身边有一群气味相投的人。你可能不太确定本人是否“够得上”加入这个我的项目,或者不分明从哪里开始。 不要放心;咱们有数百个这样的你。咱们甚至为本人起了一个名字。欢送你,潜在的亚马逊云科技 Community Builder! 这篇博客提供了相干资源,我如许心愿在我第一次申请时就能领有。 如何申请?亚马逊云科技每年凋谢两次申请机会,你能够在亚马逊云科技 Community Builder 页面上进行申请;这里介绍了申请过程的最好、最新资源。申请时,你须要提供本人以及参加亚马逊云科技 Community 的相干信息。 咱们十分激励来自技术畛域的代表性有余的潜在 Community Builder 进行申请!这也是一个很好的跳板。 这也为任何想在亚马逊云科技 Community 有所倒退的人提供了敲门砖。”如何成为亚马逊云科技的 Hero" 尽管没有固定渠道或捷径可言,然而成为一名 Community Builder 就是一个很好的开始。 在寻找的是什么样的人? 这不是什么机密,亚马逊云科技 Community Builder 页面做出了最好的解释: “亚马逊云技术爱好者和热衷于分享常识并渴望与技术社区建立联系的新兴思维开发者” 没有设定具体的规范,所以不要放心须要发表十篇博客文章、拍摄五个 YouTube 视频、领有三年的行业教训,或相似的要求。有的人某些畛域并没有超群绝伦,这也没关系。 反过来说,也没有捷径能够走。仅仅在亚马逊云科技上构建,也没有取得任何认证,这是不够的。 要害是,他们寻找的人是渴望与更宽泛的社区分享对亚马逊云科技的兴奋和激情。 如果要退出,应该做什么?即使是具备分享常识的激情,也对亚马逊云科技充满热情,也很难晓得从哪里动手。 没有最好能做的“一件事”,也没有做什么就肯定能退出到这个我的项目。 志愿者 亚马逊云科技 User Groups 和相似的组织是参加亚马逊云科技 Community、在本地结交气味相投之友的好路径。 这并不代表你须要本人创立或率领一个小组。大多数小组都乐于吸纳违心提供帮忙的人,与组织者沟通就是一个很好的开始,可能包含帮忙安排场地、与赞助商配合、组织餐食、协调发言人等。 公开演讲毫无疑问,越来越多的演讲者在发展 Meetup Groups 流动。在这个虚构团聚流行的时代,你的抉择比以往任何时候都要多,团聚遍布寰球各地。 大多数组织并不要求你是专家或资深的主讲人。你能够找出本人有教训、懂得多的主题,以及能够作为切入点进行探讨的我的项目。 分割 Meetup Group 的组织者,与他们沟通。大多数人都十分违心帮忙你找到听众感兴趣的话题。如果话题不适宜你,也不用放心;还有很多其余的抉择。 ✍️ 写博客通过博客分享你的想法,是参加亚马逊云科技 Community 的另一种不错的形式,而且比拟容易接受。借助 dev.to 这样的平台,写博客比以往任何时候都容易。 以下是几个你能够写的博客主题: 解决你不得不靠本人解决的问题:发现一个亚马逊云科技文档中没有明确阐明的辣手“问题”?其他人也有可能遇到过这样的问题。评论一项亚马逊云科技新服务:每隔一周就会公布新的服务,而大多数人都没有机会尝试。试一试这些新服务,而后分享你的初步想法。即便是一个有点无聊的我的项目也是一次学习的机会。分享你的我的项目教训:你可能在应用 CloudFormation 时遇到了瓶颈,这意味着你不得不应用 Terraform。这个教训可能会给其他人带来帮忙。应该分享那些值得分享的想法。这也是造就业余写作能力的好办法。写一份对于制作 S3 存储桶的指南,并不是在为亚马逊云科技 Community 奉献常识,但能够用来存储公司网站上的动态对象,达到节省开支的后果,这对读者来是很有价值的。 ...

April 25, 2022 · 1 min · jiezi

关于cloud:我与无影的初体验使用无影云桌面进行一个开源-Angular-项目的端到端测试

近日很荣幸地收到了阿里云邀请做一个对于阿里旗下无影云桌面的评测,从官网上理解到阿里云无影云桌面原名为弹性云桌面,交融了无影产品技术后更名降级,可广泛应用于具备高数据安全管控、高性能计算等要求的平安办公、金融、设计、影视、教育等畛域。 我是一个程序员,最近一年的工作是参加开发一个开源的电商前端(Storefront)我的项目,代号 Spartacus,应用的编程语言是 TypeScript,开发框架是 Angular. 这是咱们我的项目的 Github 代码仓库: https://github.com/SAP/spartacus 这是从本地开发环境运行 Spartacus 的一些截图: 很快乐地承受了阿里的评测邀请之后,我就在推敲:无影云桌面是否用来进步我日常开发 Spartacus Storefront 的工作效率? 作为一个开源的电商前端利用,Spartacus 有着欠缺的端到端自动化测试,咱们应用自动化测试框架 Cypress 来进行 UI 端到端测试和回归测试。每次开发人员应用 git 提交代码更改到 Github 仓库时,会触发基于 Travis CI 的继续集成脚本,在 CI 服务器上执行所有的 Cypress 自动化测试用例。 上面是 CI 服务器上运行 Cypress 自动化测试的命令行: yarn --cwd ./projects/storefrontapp-e2e-cypress run cy:run:ci 在我理论的开发过程中,我不时会遇到这种状况,本地批改了代码之后,单元测试全副通过,而后提交代码,发现 CI 服务器上的某些 Cypress 自动化测试用例执行失败。 因为咱们在 Travis CI 上执行的脚本内容较多,build 一次须要破费 40 多分钟的工夫,所以靠在 CI 服务器上执行 Cypress 回归测试用例的形式来发现本地提交代码的缺点,效率切实低下。 因而,我就有了一个想法:把 Spartacus Cypress 自动化测试放到无影云桌面进行。这样,每次我在本地批改完代码之后,如果无影云桌面里能立刻辨认到这些代码批改,并在云桌面里运行所有的 Cypress 自动化测试,等全副测试都通过后,我再提交代码。这样,借助无影云桌面弱小的计算性能,我能够当时把所有可能引起回归测试失败的代码缺点都检测进去,这样能尽可能进步我提交代码之后,Travis CI build 的一次通过率。 ...

February 15, 2022 · 2 min · jiezi

关于cloud:Spring-Cloud-Alibaba-大型互联网领域多场景最佳实践fsfsd

download:Spring Cloud Alibaba 大型互联网畛域多场景最佳实际在学习 python 中列表、元组、汇合、字典的时候,总结了各种对象之间的转换方法,次要参考了Python 列表、元组、汇合、字典的区别和互相转换这篇文章,具体的代码示例能够参考这篇文章中的内容,本人敲一遍印象会非常粗浅,本文就不节约笔墨了,转换方法总结如下: 转换成列表:list()转换成元组:tuple(),zip()转换成汇合:set()转换成字典:dict()字符串5.1 转换成字符串:join()5.2 弱小的字符串表达式函数:eval()其中list()、tuple()、set()、dict()以及join()的用法都很常见,zip()和eval()的用法算是另辟蹊径了,能够参考上面的文章:zip()的应用,eval()的妙用和滥用 以上对象中,列表和字符串就像万能的粘合剂,能够充当许多转换的两头媒介。 在本人入手写代码练习的过程中,还发现了很多乏味的用法,比方以下字典转换成元组,tuple()和zip()失去了两种不同的后果,能够满足不同的业务需要:dict_test = {'a':1, 'b':0, 'c':2, 'd':4} print(tuple(dict_test.keys())) # 失去 ('a', 'b', 'c', 'd') zipped2 = zip(list(dict_test.keys()), list(dict_test.values())) for t2 in zipped2: print(t2) # 失去的后果: # ('a', 1) # ('b', 0) # ('c', 2) # ('d', 4)

December 16, 2021 · 1 min · jiezi

关于cloud:使用-SAP-Cloud-SDK-开发应用时如何通过环境变量的配置避免硬编码

Jerry 之前的文章SAP S/4HANA Cloud SDK 入门介绍介绍了如何在第三方利用里,调用 SAP S/4HANA Cloud SDK,生产 S/4HANA 零碎的 OData 服务。 过后我的代码里,指向 SAP API Business Hub Sandbox 的 url 是硬编码的,不够灵便。本文介绍如何通过环境变量的形式来配置这些 endpoint. 官网链接 在我的项目根目录新建一个 .env 文件,内容如下: destinations=[{"name": "sandbox", "url": "https://sandbox.api.sap.com/s4hanacloud"}]执行如下命令行: npm install @nestjs/config为了加载 .env 文件中定义的环境变量,咱们须要将 config 包提供的 ConfigModule 增加到应用程序的 @Module 定义中。 关上 app.module.ts 并应用以下代码更新它: 源代码: import { Module } from '@nestjs/common';import { ConfigModule } from '@nestjs/config';import { AppController } from './app.controller';import { AppService } from './app.service';import { BusinessPartnerController } from './business-partner.controller';@Module({ imports: [ConfigModule.forRoot()], controllers: [AppController, BusinessPartnerController], providers: [AppService],})export class AppModule {}将利用代码里 execute 办法的参数,从硬编码的 url,改成传递一个 .env 文件里保护的 Destination 名称即可。 ...

July 22, 2021 · 1 min · jiezi

关于cloud:使用-cf-push-部署应用到-SAP-BTP-时遇到错误消息-No-domains-exist-for-route

我应用的 SAP BTP CloudFoundry 环境的 API endpoint 在 BTP cockpit 里能够找到: https://api.cf.ap21.hana.onde... 应用命令行 cf login 登录: 创立一个 xsuaa 服务实例: 之后应用 cf push 上传利用,遇到谬误音讯: For application 'product-list': No domains exist for route product-list-jerry.cfapps.eu10.hana.ondemand.com 应用 cf routes 命令查看路由信息: 官网链接 本主题中的术语域与其常见用法不同,它特定于 Cloud Foundry。 同样,共享域和公有域指的是 Cloud Foundry 中具备特定含意的资源。 域名、根域和子域的应用是指 DNS 记录。 域向开发人员表明对从域创立的任何路由的申请都路由到 Cloud Foundry。 这须要在带外配置 DNS,以将域名解析为负载均衡器的 IP 地址,该负载均衡器配置为将申请转发到 Cloud Foundry 路由器。 无关配置 DNS 的详细信息,请参阅域的 DNS。 List Domains for an Org创立路由时,开发人员从可用的域中进行抉择。 应用 cf domains 查看指标组织的可用域列表: ...

July 20, 2021 · 1 min · jiezi

关于cloud:如何配置-SAP-BTP-Integration-Suite-测试帐号的环境

官网链接 SAP 集成套件将星散成(流程集成)、API 治理、集成 Advisor 和 Open Connectors 等集成性能组合成一个用于企业集成的有凝聚力和简化的工具包。 为了提供全面的集成体验,这些服务不独自提供,而仅作为 Integration Suite 服务打算的一部分提供。 应用此场景,您能够设计并执行一个集成流,该流从公共产品目录 (WebShop) 中读取给定产品标识符的产品详细信息。 例如,产品详细信息包含产品名称和价格等数据。 要实现该场景,您须要应用 SAP 集成套件,特地是其星散成和 API 治理性能。 您应用 Cloud Integration 来设计和部署 iFlow。 实现设计后,应用 API Management 的 API Explorer 工具将集成流端点公开为 API。 您还能够通过调配专用的预约义策略模板来定义如何在身份验证方面拜访 API。应用此策略模板,您能够依据 OAuth 客户端凭据授予办法定义 API 拜访权限。最初,您应用 API 治理调用 API 并在响应中获取产品详细信息。 进入 SAP Business Technology Platform trial 帐号控制台,点击 Instances and Subscriptions 的 create 按钮: 新建一个类型为 trial 的 Integration Suite service plan: service Subscription 创立好之后,就能够点击 Go to Application,进入 integration Suite 控制台了: ...

June 29, 2021 · 1 min · jiezi

关于cloud:SAP-业务技术平台BTP-上的-Business-Rules-Service-使用介绍

这是 Jerry 2021 年的第 44 篇文章,也是汪子熙公众号总共第 321 篇原创文章。 在 SAP ABAP On-Premises 产品工作过的 ABAP 开发人员,可能都接触或者据说过 Business Rule Framework(简称 BRF,前面还有升级版 BRF+)这个框架。 SAP BRF+ 次要蕴含实现存储性能的规定仓库(Rules Repository),以及依据用户输出,剖析并执行规定,返回给用户处理结果的规定处理器(Rules Processor)两局部。前台提供的是基于 ABAP Webdynpro 界面的规定编辑器,反对决策表,决策树和公式等多种形式的规定建模形式。规定仓库和规定处理器位于 ABAP 零碎后盾。 理解 SAP ABAP BRF+,有助于咱们学习其余的业务规定解决方案。比方 SAP Commerce Cloud,抉择的是反对 Java Rules Engine API 规范的开源业务规定引擎和企业框架 Drools. 无论是 SAP ABAP BRF+ 还是 Drools,只管其技术实现细节不同,但工作场景和实现的需要都统一: 业务规定制定者,在零碎里依据建模工具保护业务规定业务规定解决方案暴露出接口,消费者调用该接口,传入输出,失去业务规定处理器执行后返回的输入。本文简要介绍 SAP Business Technology Platform(下文简称 SAP BTP)上的 Business Rules Service. 登录 SAP BTP Cockpit,在 Service Marketplace 里找到 Business Rules Service,其形容信息强调,这是一个基于云的业务规定解决方案。 ...

June 22, 2021 · 3 min · jiezi

关于cloud:无法加载springcloudstarteralicloudoss

整合OSS增加pom依赖时呈现谬误: Cannot resolve com.alibaba.cloud:spring-cloud-starter-alicloud-oss:unknown 官网文档:https://github.com/alibaba/al... 依照官网文档给的写法会报错,用为找不到对应版本的依赖: <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>aliyun-oss-spring-boot-starter</artifactId></dependency>须要手动增加版本号,这样就OK了: <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alicloud-oss</artifactId> <version>2.2.0.RELEASE</version></dependency>

June 8, 2021 · 1 min · jiezi

关于cloud:CloudIDE插件开发实战教你如何调试代码

摘要:明天咱们来重点介绍下CloudIDE插件的调试技巧,在插件开发过程中调试作为重要的问题剖析和定位伎俩可能无效帮忙开发者晋升插件品质。明天文章中的样例工程咱们持续以上一篇《实战CloudIDE插件开发-疾速上手》中的我的项目为根底,深刻介绍插件的调试办法。可能有的开发者对于插件的前后端相干概念会有所纳闷,大家能够参考这篇插件开发指南具体理解插件开发过程中会用到的根底概念和开发技巧。 后端调试在插件的src/node/目录下寄存的是插件的后端代码,后端代码运行在IDE实例的nodejs环境中,插件我的项目在创立的时候曾经默认生成了一个后端文件backend.ts,对于轻量级的插件,只须要在该文件中增加本人想要实现的业务性能即可,该文件蕴含了三个默认的办法init()、run()、stop()。另外还默认增加了一个doSomething办法,这个办法仅仅是作为示例应用,开发者能够依据须要进行批改或删除。这里咱们简略介绍下init, run和stop办法,具体的解析能够参考插件开发指南。 init()函数作为该后端实例的初始化办法,能够在插件启动的时候进行一些初始化操作,写在该函数中的代码肯定会先于run和其余函数被调用,这里须要留神的是对于前端裸露给后端的函数不能再init函数中进行调用,也就是不能在init办法中执行this.plugin.call调用。run()函数作为后端实例的主逻辑函数,承当着业务性能入口的作用,在该函数中能够不便地调用CloudIDE的API,比方cloudide.window.showInformationMessage(hello world!); 也能够调用前端裸露进去的函数,也就是能够在该办法中执行this.plugin.call调用。stop()函数将会在插件被进行前被调用,如有须要能够进行一些资源清理的操作。接下来将分七步来介绍调试的过程,大家能够对照动图来看上面的文字说明: 打断点,咱们尝试在backend.ts的run()函数中打上一个断点。按F1或者点击查看->命令面板调出命令面板。输出Hosted Plugin进行搜寻,抉择Hosted Plugin: 调试实例。弹出的门路抉择对话框咱们放弃默认,因为咱们的我的项目根目录默认就是咱们须要调试的插件。期待调试实例启动,右下角弹出端口监听提醒,咱们点击确定。 在弹出的端口内部拜访权中给实例的监听端口增加内部拜访权,留神:这里的协定须要抉择https,增加实现之后如右图所示。 点击拜访就能够拜访咱们刚刚启动的调试实例,在弹出的调试实例中咱们期待插件被加载,而后切换回咱们的CloudIDE开发实例。断点被命中并暂停在断点处,此时能够不便地查看调用堆栈、变量或者增加监督表达式。同样,咱们也能够在其余的办法中打上断点,大家有趣味也能够通过断点的形式来验证下init()、run()以及stop()被执行的程序。 前端调试与插件的后端不同,前端的代码最终将被编译并运行于浏览器环境中,前端的代码寄存于src/browser目录中,插件我的项目在创立的时候会默认生成了两个前端源码文件frontend.ts和dynamic-webview.ts。这两个文件的内容与后端backend.ts的构造十分类似,只不过运行的环境不同而已,这里就不再反复对这两个文件中init()、run()、stop()办法进行介绍。因为前端运行再浏览器环境中,咱们的代码调试将借助于浏览器自带的调试性能来实现,咱们直奔主题,看看怎么样来调试前端代码。 前端代码调试将分为以下几个步骤,大家同样能够对照动图来看上面的文字说明: 明确须要调试的代码所在的函数,比方这次调试的前端函数叫myApi()。切换到调试实例,按F12调出开发者工具。在页面列表中咱们找到本人插件的首页,这里是index.html (小技巧:很多开发者都会应用默认的首页名称,为了不便查找本人的插件首页,能够将首页文件名进行批改)。接下来逐级向下开展到active-frame/{调试实例地址}/webview/dist/index.js。关上index.js文件。 按ctrl+f进行搜寻,在搜寻框中输出须要调试的函数名,这里是myApi。找到函数并在函数体内须要调试的地位打上断点。点击浏览器的刷新按钮从新加载该页面就能命中刚刚打的断点,进行前端的调试。 简略总结下,CloudIDE插件的调试其实分为前后端,后端的调试能够借助CloudIDE自身实现,而前端代码的调试则须要借助于浏览器的调试能力,在把握调试技能之后在后续的插件开发过程中对疑难问题的定位和解决将十分有帮忙。在后续的文章中将对插件的运行机制和API进行深刻介绍,有趣味的读者也能够先参考插件开发指南进行理解。 点击关注,第一工夫理解华为云陈腐技术~

December 8, 2020 · 1 min · jiezi

关于cloud:SAP-Cloud-for-Customer页面根据后台数据响应的刷新原理介绍

Recently I am working with partner and they are asking for the reason of one UI5 refresh behavior. I simply display the BO ID, Description, Create Date and NodeID for demonstration purpose. The event handler bound to the Click Me button: Observed behaviorSuppose I have two Service Request BO instance in the system: ID 333 with creation date 26.02.2014ID 1071 with creation date 06.09.2017By default BO detail data for ID 1071 is displayed: ...

August 30, 2020 · 3 min · jiezi

关于cloud:一个最简单的例子学习SAP-Cloud-for-Customer-HTML-mashup

My series of Cloud Application Studio BlogsHow to detect EditMode in an Embedded ComponentStep by step to enable your custom BO with attachment upload functionalityStep by step to create an Adobe Print form in Cloud application StudioHow to render PDF which displays picture from the image attachment of your custom BOHow to get current logged on business user’s employee information and assigned organization unit via ABSLHow to implement dynamic access control based on custom BO using OWLHow to make Code List Restriction work when control field and restricted field are not on the same BOHow to implement custom number range using custom business objectTwo approaches to create Code List in Cloud StudioCreate Dynamic Code List via Custom Business Object AssociationStep by step to develop Thing Type based navigation and BO Object based navigationPut Extension field into embedded component and make it visible in Standard UIOne possible cause that embedded component fails to display in UIStep by step to create HTML Mashup and make it visible in UIStep by step to enable Text Collection for your custom BOAutomatically send an Email notification to line manager via Workflow in Account applicationStep by step to create Object Value Selector in Cloud Application Studio(1) Switch on Admin mode of your solution, and create a port type package as below: ...

August 30, 2020 · 2 min · jiezi

CloudEvent-初探

CloudEventCloudEvents is a specification for describing event data in common formats to provide interoperability across services, platforms and systems. CloudEvent 重点在于跨平台, 跨服务, 跨系统的一个跨字. 重在适应性, 通用性.      该类用户认为, 世界上无处不在事件, 行为均可看作是事件驱动. 也认为这样消耗比是最低的(我的看法)因为事件->行为 这一个模式是典型的按需供应资源. CloudEvent 我认为意在跨不同的云, 不同的数据源, 比如你在 阿里云的数据应用和在 亚马逊的数据应用, 是不能互通的, 至少同一个软件不行. 任意数据的变动, CloudEvent 或者 CNCF 认为是一个 Occurrence. 不同的 Occurrence 触发的事件是各个云服务商, 各个软件, 各个协议所独有的. 这给云原生或者大混合云(我取的名字, 意为以混合云服务为主的云服务商经营的云集群)带来了不方便. 不方便之处在于, 开发者的任意一款产品, 是在单独的一片云上原生的. 我认为 CNCF 一直致力于制定一个标准解决这一个问题. 下图是 go-sdk 中 event 的定义. 我尤其注意到的是事件携带有错误域, 我认为这给了 Occurrence 方的适配层或者用户一个处理的机会. 但最重要的是, 事件发生的错误也是 CloudEvent 的一部分. ...

June 29, 2020 · 1 min · jiezi

如何在SAP云平台ABAP编程环境里把CDS-view暴露成OData服务

Jerry 2016年在学习SAP CDS view时,曾经写过一个CDS view的自学系列,其中有一篇提到了一个很方便的注解: @OData.publish: true 加上这个注解的CDS view,一旦激活后就会在ABAP Netweaver自动生成一个OData服务,在事务码/IWFND/MAINT_SERVICE里将其搜索出来并添加,就能够以OData服务的方式,消费这个view暴露出来的数据了。 当然@OData.publish这个注解为什么有这种神奇的魔力,在Jerry之前的博客里有详细介绍。 那么到了SAP云平台ABAP环境上,因为我们无法访问SAP GUI,所以要实现同样的效果,无法直接照搬上述步骤。幸运的是,在云上进行CDS view暴露的步骤依然简洁,整个过程5分钟就能搞定。 用ABAP Development Tools像登录On-Premises ABAP系统那样登录ABAP云环境,新建一个Service definition: 在Service的实现体里,使用关键字expose将ABAP环境里的标准view,I_Currency以Service的方式暴露出来。 这个Service需要以Service Binding的方式暴露成OData服务: 把第一步创建的Service分配给这个Service Binding: 注意下图右边的Service Details标签页里,此时是空的。点击Publish按钮: 发布成功后,我们看到了之前在Service实现里把I_Currency暴露成的名为Currency的实体: 对这个Currency Entity点右键,选择Open Fiori Elements App Preview,就能在预览模式下通过一个标准通用的Fiori Elements应用把当前系统上I_Currency里的数据显示出来: 点击这个Service URL超链接,也能直接打开对应OData服务的元数据(metadata)链接: 至此我们就可以用各种消费端来使用这个通过I_Currency暴露成的OData服务了,当然也可以开发一个SAP Fiori来消费,Jerry后续会介绍。 感谢阅读。 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

October 14, 2019 · 1 min · jiezi

部署在SAP-Cloud-Platform-CloudFoundry环境的应用如何消费SAP-Leonardo机器学习API

Jerry的前一篇文章 如何在Web应用里消费SAP Leonardo的机器学习API 里介绍的例子是Neo测试环境的Web应用消费sandbox版本的机器学习API,url如下: https://sandbox.api.sap.com/ml 本文介绍一个部署在SAP Cloud Platform CloudFoundry环境下的应用,如何消费SAP Leonardo上的机器学习API。 登录SAP Cloud Platform Cockpit,进入CloudFoundry环境的Service Marketplace,找到SAP Leonardo机器学习的服务,单击该服务的超链接进入明细页面: 创建一个新的服务实例: Service Plan就选默认的standard: 给这个服务实例取个名字: 单击这个创建好的服务实例,然后创建一个新的Service Key: 给Service Key也取个名字。 我们通过创建Service instance进而创建Service Key的目的,是为了得到下图的clientid和clientsecret。 而我们拿到clientid和clientsecret,是为了用它们换取OAuth2.0协议里的access token. 关于更多clientid和clientsecret基于OAuth2.0换取access token 的细节,请参考Jerry的文章:OAuth 2.0协议在SAP产品中的应用。 除了clientid和clientsecret外,我们还能在service key里得到当前这个SAP Cloud Platform CloudFoundry环境上所有可用的机器学习API的url,它们全部维护在节点serviceurls里: 注意观察,此时的IMAGE_CLASSIFICATION这个API 的url,路径已经从上一篇文章的https://sandbox.api.sap.com/ml,变成了包含CloudFoundry环境信息的: https://mlftrial-image-classi... 接下来通过clientid和client secret换取access token,使用下面这个链接里的应用获得access Token: https://generate_ml_token.cfa... 把这个Bearer开头的access Token记录下来。 之前创建service key时,我们已经从创建结果里获得了基于产品图片识别类别的API url: https://mlftrial-image-classi... 浏览器里访问这个url,得到一个采用Swagger(一个采用RESTFUL接口,基于YAML和JSON语言的API文档在线自动生成工具)实现的API控制台: 点击try out,从本地选择一张图片,我还是选择的这张图片: ...

July 14, 2019 · 1 min · jiezi

使用CDS-view开发SAP-Marketing-contact的facet追溯工具

这篇SAP社区博客里,我的一位同事介绍了SAP Marketing里contact facet数据模型的存储表:https://blogs.sap.com/2016/07... 主要是这两张表: CUAND_CE_IC_ROOT CUAND_CE_IC_FCET 现在我的需求是:对系统里Contact的Origin Data数据来源渠道个数从高到低的顺序进行排序: 解决方案:开发两个CDS view zcontact_origin@AbapCatalog.sqlViewName: 'SQL_VIEW_NAME'@AbapCatalog.compiler.compareFilter: true@AbapCatalog.preserveKey: true@AccessControl.authorizationCheck: #CHECK@EndUserText.label: 'Contact Origin tool'define view zcontact_origin as select from cuand_ce_ic_root as a inner join cuand_ce_ic_fcet as b on a.db_key = b.parent_key { key a.db_key, a.name_text, a.smtp_addr, b.db_key as children_key, b.id_origin} zcontact_count@AbapCatalog.sqlViewName: 'ZCONCOUNT'@AbapCatalog.compiler.compareFilter: true@AbapCatalog.preserveKey: true@AccessControl.authorizationCheck: #CHECK@EndUserText.label: 'count aggregation'define view ZCONTACT_COUNT as select from zcontact_origin { key zcontact_origin.db_key, zcontact_origin.smtp_addr, count(*) as facet_count} group by db_key, smtp_addr最后的效果: ...

July 14, 2019 · 1 min · jiezi

如何在阿里云上运行SAP-UI5应用

本来Jerry觉得这个知识点太简单了完全不值得写成微信公众号文章,但转念一想,可能网络上有一些刚刚初学UI5的朋友们可能会问到,所以还是写了。 今天一个成都同事问我这个问题,因为SAP WebIDE可以非常方便地将开发好的UI5应用一键部属到SAP的其他系统,比如On-Premises环境的SAP gateway系统;但对于SAP Cloud Platform之外的其他云平台,比如AWS或者阿里云,SAP官方文档讲得不多。 其实如果已经在WebIDE里完成了UI5应用的开发,要让它运行在其他IaaS云平台上比如AWS或者阿里云上,步骤也是比较简单的。 Jerry已经做好了一个简单的SAP UI5 Hello World应用,上传到了我的github上: https://github.com/i042416/we... 这个UI5应用的源代码,在该Github仓库的webapp文件夹下面: 这里面全是标准的UI5应用开发资源。 在这个项目的根目录即webapp文件夹的外层,多了两个文件:server.js和package.json, 分别是nodejs应用的入口文件和项目描述文件。 server.js的实现很简单,用nodejs的express module起一个server,把来自url "/ui5"的请求路由到文件夹webapp里,最后监听在环境变量PORT指定的端口号或者3000这个端口上。 最后登录阿里云,git clone把这个仓库克隆到阿里云上,npm install安装package.json文件里描述的依赖: 然后使用命令行node server.js启动服务器, 就可以通过<阿里云服务器的IP地址>:3000这个url访问这个UI5应用了。 如果想以守护进程的方式启动server, 也可以用pm2, 一个开源的nodejs进程管理工具。 用命令pm2 start server.js启动服务器即可, 这样即使阿里云服务器的SSH终端关闭,该UI5应用依然可以通过url <阿里云服务器的IP地址>:3000访问。 其实啰嗦了这么多,用一句话概括就是,在IaaS级别的云平台上启动Web服务器(nodejs express, Tomcat, Nginx等都行),运行在上面的UI5应用就能通过云平台被各种终端访问到了。 感谢阅读。 Jerry原创的关于SAP Fiori和UI5的更多文章 SAP Fiori应用的三种部署方式Jerry的Fiori原创文章合集SAP Fiori + Vue = ?Jerry的UI5框架代码自学教程Jerry的碎碎念:SAPUI5, Angular, React和Vue在Kubernetes上运行SAP UI5应用(上)在Kubernetes上运行SAP UI5应用(下)要获取更多Jerry的原创文章,请关注公众号"汪子熙":

July 14, 2019 · 1 min · jiezi

SAP-Marketing-Cloud的Contact导入配置和数据合并原理

SAP很多系统的主数据都支持从外部系统导入,SAP Marketing Cloud也是如此,contact主数据可以来自Hybris Commerce,CRM,ERP或者Twitter,Facebook等社交媒体。来自不同渠道的contact可能对应的是真实世界里同一个人,那么就存在一个过程,该过程的逻辑是将不同渠道的contact数据进行整合,拼凑出一个包含完整信息的contact主数据存储到Marketing Cloud系统里,这个拼凑的过程称之为合并(merge),拼凑后形成的完整Contact结构称为Golden record。 下面这张示意图里的蓝色圆环称为Main facet,代表每个contact数据在某个源系统上的ID,比如在ERP系统上的ID为123,在Twitter上的ID为456等等。而黄色圆环是contact在各自源系统里的属性,比如在Twitter网站上ID为456的一个contact,其name属性为jerrywang@sap。黄色圆环称之为additional facet. 通过在SAP Marketing Cloud里进行一系列配置,告诉系统,当检测到来自不同数据源的contact数据,存在至少一个相同属性的情况下,应该执行何种contact操作,也就是合并或者新建。 比如下图在ERP,Facebook和Web Shop上有三条contact数据,其Email地址的值都相同,那么进行数据导入时,基于预定义好的配置,Marketing Cloud认为这三条数据指向的是同一个人,所以最后merge出来生成唯一一条contact记录。 Marketing Cloud具体merge的过程,就是根据SAP Marketing Cloud系统里的customizing配置,将三条Email地址都相同的记录作为当前merge的输入,然后逐一将本记录内的属性“投影”到最终的Golden Record里。如果把Golden Record想象成最终完整的拼图,那么这个merge过程就有些类似于拼图操作——将散布在各个数据源中的零散信息合并成一个整体,存储在Marketing Cloud系统内以便进行后续处理。 Marketing Cloud里针对contact导入系统时的merge操作的相关customizing设置,在整个contact导入过程中起着至关重要的作用。 和SAP Cloud for Customer等很多云产品一样,SAP Marketing Cloud的customizing也是在浏览器里完成。 点击Fiori Launchpad里的Manage Your Solution这个tile, 进入Configure Your Solution,  根据关键字contact进行搜索,在搜索结果列表里找到Contacts and Profiles相关的配置: 其中第六步, OriginContactID-Configure这一步,就是合并时针对来自不同平台的contact数据,执行合并或新建操作的配置。 点击之后,能看到一个contact属性列表,从这些属性列表不难推断出SAP Marketing Cloud支持导入contact的数据源有S/4HANA,ERP,CRM,Hybris Commerce,SAP Cloud for Customer,Gigya,Qualtrics和社交媒体如Twitter,Facebook等等。 上图有两列,分别对应为每个属性指定One Per Contact和Shareable为true还是false的界面。前者顾名思义,如果设置为true,意味着一个contact在同一个数据源系统里只能拥有一个唯一值,比如一个人的护照号码,或者SAP系统里的Customer ID;反之像Email,座机号,传真号这种属性,一个contact在同一个数据源系统里如果允许存在多个值,则One Per Contact设置为false。而Shareable属性置为true,适合那些在同一个数据源系统里允许多个不同contact具有相同值的属性,比如一家人的contacts的座机号允许相同。 对每一个Contact属性,One Per Contact和Shareable的true/false状态排列组合共有四种,其中One Per Contact为true的两种情况,即使系统在检测到匹配的属性情况下,也可能会导致contact数据的创建,而不是merge,也就是下图中第二行和第四行标注了感叹号的情况。 ...

July 3, 2019 · 1 min · jiezi

一步步用ABAP-Development-Tools连接SAP云平台上的ABAP编程环境

使用ABAP Development Tools的项目创建向导: New->ABAP Cloud Project: Service Instance Connection,选择SAP Cloud Platform CloudFoundry environment: 选择Region,输入用户名密码,前提是你得在这个region下有一个global Account。 下图是我在欧洲法兰克福(Frankfurt)这个Region的Global Account: 这个Global Account所属的space下面我创建了一个ABAP系统实例,ID为ME1: 这个ABAP运行实例具有16GB运行内存,64GB的HANA内存。 再回到ABAP Development Tools, 在项目创建向导里使用Cockpit里维护的上述属性: 点Next,在ABAP Development Tools里会看到一个嵌入的登录窗口: 点Finish: Finish点了之后,在ABAP Development Tools左侧的项目列表里就能看见创建好的ABAP Cloud项目了,接下来在这个项目里编写ABAP代码进行开发的方式,和我们用ADT连接On-Premises系统基本一致。大家可以看到下图创建好的高亮的ABAP Cloud项目(系统ID为ME1), 和其他On-Premises上的ABAP项目外观上没有区别。 这两种ABAP项目的差异在于,ABAP Cloud项目里能够使用的ABAP语言特性,只是传统ABAP语言的一个子集,比如传统ABAP语言里和Dynpro相关的关键字,即只能工作在SAPGUI中的那些关键字,因为在Cloud环境下不再适用了,所以在ABAP Development Tools的ABAP Cloud项目里禁止使用。 至于上图ABAP Cloud项目里的Released Objects如何使用,等Jerry有时间再继续写。 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

July 3, 2019 · 1 min · jiezi

容器十年-一部软件交付编年史

作者| 张磊,阿里云容器平台高级技术专家,CNCF Ambassador (CNCF 官方大使),Kubernetes 项目资深成员与维护者,曾就职于 Hyper、微软研究院(MSR),现在负责 Kubernetes 技术及上下游相关工作。 2019年,全世界的开发人员都开始习惯用容器测试自己的软件,用容器做线上发布,开始对容器化的软件构建和交付流程习以为常。全世界的架构师们都在对“云原生”侃侃而谈,描绘多云时代的应用治理方式,不经意间就把 “sidecar” 这种容器组织方式当做了默认选项。在“云”已经成为了大众基础设施的今天,我们已经习惯了把“容器“当做现代软件基础设施的基本依赖。这就像我们每天打开 Eclipse 编写 Java 代码一样自然。 但往回倒数两年, 整个容器生态都还在围着 Docker 公司争得不可开交,看起来完全没有定数。当时的国内很多公有云厂商,甚至都没有正式的 Kubernetes 服务。在那个时候,要依托容器技术在云上托管完整的软件生命周期,可以说是相当前沿的探索。谁能想到短短两年之后,容器这个站在巨人肩膀上的设计,就真的成为技术人员日常工作的一部分呢? 伴随着容器技术普及到“千家万户”,我们在这两年期间所经历的,是现代软件交付形式的一次重要变革。 源起:属于 Jails 们的时代虚拟化容器技术(virtualized container)的历史,其实可以一直追溯上世纪 70 年代末。时间回到 1979 年,贝尔实验室( Bell Laboratories 正在为 Unix V7 (Version 7 Unix)操作系统的发布进行最后的开发和测试工作。 Ken Thompson(sitting) and Dennis Ritchie at PDP-11 ©wikipedia 在那个时候,Unix 操作系统还是贝尔实验室的内部项目,而运行 Unix 的机器则是长得像音响一样的、名叫 PDP 系列的巨型盒子。在那个“软件危机(The Software Crisis)”横行的末期,开发和维护 Unix 这样一套操作系统项目,即使对贝尔实验室来说也绝非易事。更何况,那里的程序员们还得一边开发 Unix ,一边开发 C 语言本身呢。 而在 Unix V7 的开发过程中,系统级别软件构建(Build)和测试(Test)的效率其实是其中一个最为棘手的难题。这里的原因也容易理解:当一个系统软件编译和安装完成后,整个测试环境其实就被“污染”了。如果要进行下一次构建、安装和测试,就必须重新搭建和配置整改测试环境。在有云计算能力的今天,我们或许可以通过虚拟机等方法来完整的复现一个集群。但在那个一块 64K 的内存条要卖 419 美元的年代,“快速销毁和重建基础设施”的想法还是有点“科幻”了。 ...

July 3, 2019 · 3 min · jiezi

SAP-Marketing-Cloud里的contact-main-facet是什么意思

界面如下: Basically, contact data for SAP Hybris Marketing can be loaded from various sources, such as an ERP system, a web shop, social media and many more.Contact数据源可以来自各个渠道,例如ERP系统,电商,社交媒体账号等等。每个渠道都可以成为Marketing Cloud系统里最终完整contact实例的一块拼图,这个完整的contact实例也称为Golden record。Each source may contribute to the building of the Golden Record, which represents the most valuable contact master data stored in one single record per contact.而数据源渠道自身也被称为Main facets,用于提供常规意义上的contact信息,以及额外信息,例如地址信息,电子邮箱地址,信用卡号,手机号等等。这些额外信息也称为additional facet。Therefore, the sources themselves are considered as Main Facets, which might provide general contact data, such as address data or data for customer-specific fields. A Main Facet might also have data, for example, a loyalty card number, an email address, a phone, a mobile or a fax number. Because of their identifyingnature, we consider these attributes as Additional Facets. ...

July 2, 2019 · 1 min · jiezi

一步步用ABAP-Development-Tools连接SAP云平台上的ABAP编程环境

使用ABAP Development Tools的项目创建向导: New->ABAP Cloud Project: Service Instance Connection,选择SAP Cloud Platform CloudFoundry environment: 选择Region,输入用户名密码,前提是你得在这个region下有一个global Account。 下图是我在欧洲法兰克福(Frankfurt)这个Region的Global Account: 这个Global Account所属的space下面我创建了一个ABAP系统实例,ID为ME1: 这个ABAP运行实例具有16GB运行内存,64GB的HANA内存。 再回到ABAP Development Tools, 在项目创建向导里使用Cockpit里维护的上述属性: 点Next,在ABAP Development Tools里会看到一个嵌入的登录窗口: 点Finish: Finish点了之后,在ABAP Development Tools左侧的项目列表里就能看见创建好的ABAP Cloud项目了,接下来在这个项目里编写ABAP代码进行开发的方式,和我们用ADT连接On-Premises系统基本一致。大家可以看到下图创建好的高亮的ABAP Cloud项目(系统ID为ME1), 和其他On-Premises上的ABAP项目外观上没有区别。 这两种ABAP项目的差异在于,ABAP Cloud项目里能够使用的ABAP语言特性,只是传统ABAP语言的一个子集,比如传统ABAP语言里和Dynpro相关的关键字,即只能工作在SAPGUI中的那些关键字,因为在Cloud环境下不再适用了,所以在ABAP Development Tools的ABAP Cloud项目里禁止使用。 至于上图ABAP Cloud项目里的Released Objects如何使用,等Jerry有时间再继续写。 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

June 28, 2019 · 1 min · jiezi

Marketing-Cloud-contact主数据的csv导入

使用这个mock数据生成器网站https://www.mockaroo.com/b679...,创建一个基于Marketing Cloud contact schema的csv文件。 如果偷懒的话,每个contact字段的值都可以选择随机生成。点Download Data下载到本地。 打开csv文件之后,还可以用文本编辑器对值进行微调。 进入Marketing Cloud,点Import进行导入: 在business administration这个catalog里的import monitor对导入过程进行监控: 导入成功: 导入的数据可以在Marketing Cloud里使用了: 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

June 23, 2019 · 1 min · jiezi

Marketing-Cloud的contact-merge机制

Marketing Cloud的contact支持多种多样的数据源,如下图所示: SAP Hybris CommerceSAP ERPSAP Cloud for CustomerSAP Gigyaexternal social media 在系统的Origin data标签页里能看到一个merge后的contact的所有数据源: 看一些例子。初次从Hybris commerce里导入,Marketing Cloud系统里不存在ID为4711,mobile为12345的contact,所以自动创建一条主数据。 第二次从SAP Cloud for Customer里导入,因为待导入的contact和系统里已经存在的一条记录的mobile ID相同,故Marketing Cloud认为这是同一个人,因此做属性的merge: merge之后,来自Cloud for Customer的city和country字段被合并进了系统。 从这里出发进行Marketing Cloud里contact merge相关的配置customizing: 这里可以指定进行merge检测时基于的字段,这些字段既有SAP Marketing Cloud的标准字段,也允许用户自定义新的字段。 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

June 23, 2019 · 1 min · jiezi

SAP-Cloud-Platform上Destination属性为odatagen的具体用途

今天工作发现,SAP Cloud Platform上创建Destination维护的WebIDEUsage属性很有讲究: 帮助文档:https://help.sap.com/viewer/8... 这个属性的枚举值: 看个例子。我维护的是odata_gen: 根据标准文档描述,拥有odata_abap属性的Destination指向的是一个gateway系统,将在SAP webIDE创建UI5应用的向导中的service catalog界面出现,如下图所示: 意思是终端用户可以通过Service Catalog界面,任意选择该Destination指向的gateway系统上激活的service。 odata_abap: 目标是个SAP gateway系统 而另一方面,如果把Destination的属性改成odata_gen: 此时该Destination不会出现在Service Catalog的下拉菜单里: 取而代之的是它会出现在service url里: 而我们必须手动维护某一个具体OData服务的地址:/sap/opu/odata/sap/CRM_OPPORTUNITY 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

June 23, 2019 · 1 min · jiezi

如何让某些用户对Marketing-Cloud的contact数据只能实施只读操作

打开maintain business role这个应用: 创建一个新的business role,然后添加下列这几个catalogs:SAP_CEC_BC_MKT_ADM_PC Marketing - Business AdministratorSAP_CEC_BC_MKT_DMB1_PC Marketing - Contacts and Profiles BaseSAP_CEC_BC_MKT_CFS1_PC Marketing - Contact ProfileSAP_CEC_BC_MKT_DST_PC Marketing - Data StewardshipSAP_CEC_BC_MKT_EXT_PC Extensibility and Adaptability - Marketing3 一个一个添加进去:SAP_CEC_BC_MKT_ADM_PC 此处把Write Access改成No Access,最后把这个business role分配给对应用户,该用户对于contact数据就只拥有读权限了。 要获取更多Jerry的原创文章,请关注公众号"汪子熙".

June 23, 2019 · 1 min · jiezi

基于SAML20的SAP云产品Identity-Authentication过程介绍

SAP官网的架构图https://cloudplatform.sap.com... 上图介绍了用户访问SAP云平台时经历的Authentication过程。本文使用的例子是用户访问SAP Marketing Cloud而非SAP云平台,但是原理一致。 步骤1:用户向Service provider发起服务请求。步骤2:Service provider把这个请求重定向到提供认证的租户上,在我这个例子是SAP ID service,即account.sap.com. 这里Marketing Cloud和SAP ID Service被配置为互相信任。 请求1响应头里的302重定向字段:https://let-me-in.hybris.com/...://hybris.com/sap/bc/ui5_ui5/ui2/ushell/shells/abap/FioriLaunchpad.html 被重定向到SAP云平台的account ID service(accounts.sap.com):https://accounts.sap.com/saml...:ydcHybris:spring:sp2&RelayState=https://hybris.com/sap/bc/ui5... 步骤3:IDP给用户发送一个html page,要求用户提供用户名和密码。 如果查看这个html的源代码,能发现除了用户名和密码两个输入字段外,还包含了一些隐含字段,如下图高亮所示,这些字段是IDP返回给用户时在服务器端生成的,用于步骤5的IDP服务器端认证处理: xsrfProtectionspIdspNameauthenticity_tokenidpSSOEndpoint步骤4:用户输入用户名和密码后,点击login按钮,这些信息通过HTML form发送到了SAP ID service的服务器端: sso请求的url:https://accounts.sap.com/saml... 第二个大写的SSO请求的url:https://let-me-in.demo.hybris... 步骤5:SAP ID service的服务器端完成验证,发送SAML assertions作为响应给用户。 这个SAML响应是XML格式的,结构如下: 步骤6也就是最后一步,拿到这个SAML assertion后,用户就能够访问service provider了。 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

June 22, 2019 · 1 min · jiezi

借助-Cloud-Toolkit-快速创建-Dubbo-工程

Cloud Toolkit 是一个 IDE 插件,帮助开发者更高效地开发、测试、诊断并部署应用。在最新版的插件中,提供了快速创建 Dubbo 工程的功能,下面就来快速体验下吧。 Dubbo 采用全 Spring 配置方式,透明化接入应用,对应用没有任何 API 侵入,只需用 Spring 加载 Dubbo 的配置即可,Dubbo 基于 Spring 的 Schema 扩展 进行加载。如果不想使用 Spring 配置,可以通过 API 的方式 进行调用。 功能预览 功能入口打开 IntelliJ IDEA,进入菜单:File - New - Project... 第一步:选择 JAVA SDK 版本 第二步:填写应用基本信息 包括选择 Dubbo 版本、Spring Boot 版本等。 第三步:确定创建 如下图所示,就完成了一个完整的 Dubbo 工程的创建了,此工程的结构和Apache Dubbo 官方样例工程完全一致。参考 Apache Dubbo 官方样例工程:https://dubbo.apache.org/zh-cn/docs/user/quick-start.html 立即点击下载 官网 https://toolkit.aliyun.com 亮点1:本地应用一键部署 Deploy to ECS开发者本地编写的应用程序,在图形化界面上进行配置,即可持续便利的部署到云端的 ECS 服务器上;在 Eclipse 中完成编码后,无须在 Maven 、Git 以及其他运维脚本和工具的之间切换,借助 Cloud Toolkit for Eclipse 插件,在 IDE 的图形界面上选择一个或若干个 ECS 实例,即可将应用程序部署至 ECS 指定目录Deploy to EDAS针对阿里云 EDAS 产品的开发者,我们也在插件上打通了本地应用程序和云端部署,在 Eclipse 中完成编码后,将 IDE 内的项目工程,关联上 EDAS 的应用,即可实现快速部署。Deploy to CS Kubernetes针对阿里云 容器服务 Kubernetes 产品的开发者,我们也在插件上打通了本地应用程序和云端Kubernetes部署,在 Eclipse 中完成编码后,将 IDE 内的项目工程,关联上 容器服务 Kubernetes 的部署,即可实现快速部署。亮点2:内置终端 Terminal ...

June 20, 2019 · 1 min · jiezi

Marketing-Cloud里取得系统contact数目的API

Marketing Cloud里的Contact标准tile(下图红色tile)上是没有当前系统contact数字显示的,请对比profile tile(下图黑色tile)。 客户有需求希望在Launchpad Contact tile上也显示这个数字,因此我新建了一个tile。 需要给这个tile配置一个OData API url: /sap/opu/odata/sap/CUAN_CONTACT_SRV/InteractionContacts/$count?$filter=YY1_FACEID_MPS%20ne%20%27%27postman里测试确保工作: 最终效果: 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

June 1, 2019 · 1 min · jiezi

SAP分析云及协同计划

大家好, 我是SAP成都研究院S/4HANA Sales 团队的软件工程师Derek。四年前我从SAP Consulting团队转到SAP Labs从事Sales Analytics相关应用的开发,在加入S/4HANA Sales 团队之前是BI咨询顾问,主要工作经历集中在BI(BW&BO), EIM, BPC, ECC, S/4 HAHA相关产品。 之前我所在团队同事Zhang Sean已经在他的文章 S/4HANA中的销售计划管理 里给大家分享过了S/4HANA的销售计划管理,今天我给大家带来的是S/4HANA分析云的协同计划。 前言 当今是数字经济的时代,数字经济就是决策经济。企业做出的决策越明智、越及时,企业的业务增长能力就越强。拖延是破坏者和被破坏者之间的区别,公司要么适应这个规则要么等待灭亡。 如果说数据是数字经济世界的燃料,那么分析就是引擎。研究表明,要使数据驱动的决策处于数字引领者的前沿,采用数据驱动思维的分析能力至关重要。 目前市场上的大多分析解决方案只能提供下图中的一部分功能。 商务智能(Business Intelligence)技术通常依赖于历史数据或已发生的事情,但与未来的计划和结果无关。这些分散的缺乏整合的方案很难帮助企业快速准确地做出决定并采取行动。而SAP分析云(SAP Analytics Cloud,以下简称SAC)能很好地解决这些问题。 作为基于SAP云平台构建的新一代SaaS,SAC可以在一个解决方案中为所有用户提供企业商务智能,预测,协同计划等功能。 什么是SAP分析云 SAC是商务智能和协同计划相结合的解决方案,通过预测分析和机器学习技术的强大功能为企业决策提供实时支持。无论是在客户前线还是在董事会,都能让企业实体洞察到新的见解并采取行动。SAC通过在一个产品中为用户提供所有分析功能来重新定义云分析(Cloud Analytics)。作为一个部署在SAP Cloud Platform上的SaaS解决方案,SAP负责完成硬件和软件的管理,以便客户可以专注于分析其业务。 SAP分析云主要功能 SAC让员工能够自由分析企业的业务,模拟并预测接下来会发生什么,设计协同计划并采取行动,实施决策以获得即时价值。业务成功需要完整的分析功能,如商务智能,计划和预测等来支持战略、运营和战术决策,而SAC则能够授权用户在需要实时分析业务的场景下进行情景洞察,以帮助其做出决策。 SAC解决方案为每个负责制定智能决策以提高其成果的用户提供分析。 什么是SAP分析云协同计划(SAC Planning) SAC的核心优势在于其计划功能,除了计划功能之外,SAC还包括大量分析和报告功能,以及易于专业人员和其他计划人员使用的集成预测功能。例如,用户可以在输入数据或更改值后自动预测。商业智能,协同计划,以及基于机器学习的预测分析是SAC的三大核心功能。很多朋友认为SAC只是SAP Business Objects Business Intelligence的云版本而已,其实不然——SAC除了商业智能外, 协同计划和预测分析才是其核心部分。本文将重点介绍SAC的财务计划和分析功能。在探讨SAC Planning前我们需要理解计划,预算,预测等术语: 计划:提供公司启动方向和财务目标的整体流程(如战略计划,长期计划,年度计划等)预算:提供计划的执行路径。计划提供了什么是可能,预算提供了基于被批准计划的预期(如销售/毛利预算,资本支出预算,人数预算,运营开支预算等)预测:使用实际业绩数据来预测业绩的剩余未知部分(如滚动预测)SAC Planning提供了如下主要功能:条件模拟,数据输入,复杂分配,分解及数据转播,协同计划及评论,基于驱动程序的计划,工作流,替代层次结构的支持,版本管理(乐观版本、悲观版本、私有版本),内置财务功能等。 1. SAC为计划人员提供了强大的功能 为了支持计划用户,SAC表中使用的表组件提供了数据的交互式可视化功能。在网格中,存在许多可用的Microsoft Excel快捷方式,凭借新的自定义行和列功能,计划人员可以使用常见的Microsoft Excel类公式轻松地将其他信息添加到网格中。自定义单元格还支持单元格图表,计划用户可以很快地创建出符合IBCS(International Bussiness Communication Standard, 国际商业标准图表)的差异报告。 2. 与SAP Analysis for Microsoft Office无缝集成 新版本的SAP Analysis for Microsoft Office可以直接消费SAC Planning模型, 计划用户可以通过其熟悉的Microsoft Excel环境连接到SAC进行工作。简化的Excel样式允许用户通过强大的排序/过滤功能轻松访问各种维度。图形化的拖拽结构管理,创建报表公式以聚合值或在摘要表中执行简单分析,报表公式可用于汇总来自多个来源的信息。 ...

June 1, 2019 · 1 min · jiezi

如何远程调试部署在CloudFoundry平台上的nodejs应用

网络上关于如何本地调试nodejs应用的教程已经很多了,工具有Chrome开发者工具,Visual Studio Code,和nodejs周边的一些小工具等等。 在实际情况中,我们可能遇到本地运行良好,但是部署到CloudFoundry生产环境后的情况,此时就需要直接调试在CloudFoundry处于运行状态的nodejs应用了。本文介绍详细步骤。 首先我们得有一个在CloudFoundry上正常工作的nodejs应用。为了演示起见,本文使用的应用为jerry-demo-server: 使用如下命令将cf ssh -N -T -L 9229:127.0.0.1:9229 jerry-demo-server 这个命令将CloudFoundry上远程应用的9229端口和本地9229端口上建立了一个SSH安全隧道。 接下来,我们在Chrome地址栏输入chrome://inspect, 即可看到运行在CloudFoundry上的应用已经可以本地调试了: 在Chrome开发者工具的源代码里设置断点: 然后在浏览器里再次输入应用的url,断点触发,就可以开始远程调试了: 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

June 1, 2019 · 1 min · jiezi

使用SSH命令行远程登录运行在CloudFoundry上的应用

当我试图用如下命令行采用SSH远程登录到运行在CloudFoundry环境下的应用时, cf ssh -N -T -L 9229:127.0.0.1:9229 jerry-demo-server遇到这个错误消息: ssh: unable to authenticate, attempted methods [none password], no supported methods remain https://stackoverflow.com/que... https://pvtl.force.com/s/arti... 使用命令行查看我的这个应用的ssh-enabled标志位: cf ssh-enabled jerry-demo-server发现处于disabled状态: 于是用命令行将这个标志位打开: cf enable-ssh jerry-demo-server cf ssh-enabled jerry-demo-server cf enable-ssh jerry-demo-server 之后重启应用: 问题解决。 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

June 1, 2019 · 1 min · jiezi

如何用Java代码在SAP-Marketing-Cloud里创建contact数据

我们可以使用SAP Marketing Cloud提供的Contact create OData API在第三方应用里创建Contact主数据. API地址:/sap/opu/odata/sap/CUAN_CONTACT_SRV/InteractionContacts 示例代码只有100多行: import java.io.IOException;import java.io.UnsupportedEncodingException;import java.net.URI;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.StatusLine;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.entity.StringEntity;import org.apache.http.impl.client.HttpClientBuilder;import sun.misc.BASE64Encoder;public class SimpleContactCreator { private ConfigUtil mConfigUtil = new ConfigUtil(); HttpClient m_httpClient; private String getBasicAuth(){ final String text = mConfigUtil.getConfig("user") + ":" + mConfigUtil.getConfig("password"); BASE64Encoder encoder = new BASE64Encoder(); String credentials = "basic " + encoder.encode(text.getBytes()); return credentials; } private HttpClient getHttpClient() { if (this.m_httpClient == null) { this.m_httpClient = HttpClientBuilder.create().build(); } return this.m_httpClient; } private String getCSRFToken(){ String url = mConfigUtil.getConfig("tokenurl"); System.out.println("fetch CSRF token via url: " + url); final HttpGet get = new HttpGet(url); get.setHeader("Authorization", getBasicAuth()); get.setHeader("Cache-Control", "no-cache"); get.setHeader("content-type", "application/json"); get.setHeader("Accept", "application/json"); get.setHeader("x-csrf-token", "fetch"); HttpResponse response; String token = null; try { response = getHttpClient().execute(get); StatusLine statusLine = response.getStatusLine(); int code = statusLine.getStatusCode(); System.out.println("Status code: " + code); System.out.println("reason: " + statusLine.getReasonPhrase()); token = response.getFirstHeader("x-csrf-token").getValue(); System.out.println("token: " + token); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException | UnsupportedOperationException e) { e.printStackTrace(); } return token; } public void run(String body){ String token = getCSRFToken(); createContact(token, body); } private void createContact(String token, String body){ final HttpPost post = new HttpPost( URI.create(mConfigUtil.getConfig("contactcreateurl"))); post.setHeader("Authorization", getBasicAuth()); post.setHeader("Content-Type", "application/json"); post.setHeader("X-CSRF-Token", token); HttpEntity entity = null; try { entity = new StringEntity(body); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } post.setEntity(entity); HttpResponse response = null; try { response = getHttpClient().execute(post); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } System.out.println("Response statusCode for Batch => " + response.getStatusLine().getStatusCode()); } public static void main(String[] args) { SimpleContactCreator tool = new SimpleContactCreator(); String body = "{\"IsConsumer\":true," + "\"Filter\":{\"MarketingArea\":\"CXXGLOBAL\"}," + "\"__metadata\":{\"type\":\"CUAN_CONTACT_SRV.InteractionContact\"}," + "\"FirstName\":\"SAP Diablo\",\"LastName\":\"SAP Wang\",\"Country\":\"CN\"," + "\"EMailAddress\":\"seya@sap.com\",\"YY1_WECHATID_MPS\":\"i042416\"," + "\"YY1_FACEID_MPS\":\"d042416\"}"; tool.run(body); }} ...

May 25, 2019 · 2 min · jiezi

如何在调用Marketing-Cloud-contact创建API时增加对扩展字段的支持

需求:扩展字段“微信ID”是我创建出来的extension field,我想用Marketing Cloud提供的contact creation API,在创建contact时也能支持这个扩展字段。换言之,我希望在调用contact create API时,给Extension field维护值,contact创建成功后,Extension field会被调用API时传入的值填充。 首先在Chrome开发者工具里找到这个字段的技术名称technical name:YY1_WECHATID_MPS 在Contact创建页面上把扩展字段配置出来, 创建一个新的contact实例, 给这个扩展字段维护一个值,比如i042416, 通过chrome开发者工具的network标签页观察创建时的payload: 然后在nodejs代码里依法将扩展字段的名称和值维护进去即可: 完整源代码:https://github.com/i042416/we...要获取更多Jerry的原创文章,请关注公众号"汪子熙":

May 25, 2019 · 1 min · jiezi

如何使用Marketing-Cloud的扩展字段作为搜索条件进行搜索

需求:我在Marketing Cloud的contact模型上用custom field这个应用创建了一个Extension field,名称为微信ID。 现在客户的需求是使用这个字段作为过滤条件进行搜索。 首先在界面上执行一次搜索,在Chrome开发者工具network标签里将这次搜索中前端发给后台的HTTP请求明细记录下来: 然后在postman里照样维护一份: payload:--batch_bd03-9977-8095Content-Type: application/httpContent-Transfer-Encoding: binaryGET InteractionContacts?sap-client=100&$skip=0&$top=15&$filter=YY1_WECHATID_MPS%20eq%20%27i042410%27&$select=ImageURL%2cName%2cContactLevelName%2cCountryName%2cCity%2cEMailAddress%2cPhoneNumber%2cMobilePhoneNumber%2cCorporateAccountName%2cInteractionContactUUID%2cRelationship%2cType&$inlinecount=allpages HTTP/1.1sap-cancel-on-close: trueCache-Control: max-age=360sap-contextid-accept: headerAccept: application/jsonAccept-Language: enDataServiceVersion: 2.0MaxDataServiceVersion: 2.0x-csrf-token: fsZ87xxAy55LLhk56CCjCw== --batch_bd03-9977-8095-- 测试结果如下: 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

May 25, 2019 · 1 min · jiezi

使用nodejs实现OData的batch操作在Marketing-Cloud里读取contact信息

我们先来看看Marketing Cloud系统里的contact信息:一共1218374条数据。 我们用如下的nodejs代码通过OData来获取这些数据: var request = require('request');var config = require("./mcConfig");var url = config.getContactBatchURL;var sBody = "--batch_c914-a60c-1877" + "\n" + "Content-Type: application/http" + "\n" + "Content-Transfer-Encoding: binary" + "\n" + "\n" + "GET InteractionContacts?sap-client=100&$skip=0&$top=2&$select=ImageURL%2cName%2cContactLevelName%2cCountryName%2cCity%2cEMailAddress%2cPhoneNumber%2cMobilePhoneNumber%2cCorporateAccountName%2cInteractionContactUUID%2cRelationship%2cType&$inlinecount=allpages HTTP/1.1" + "sap-cancel-on-close: true" + "\n" + "Cache-Control: max-age=360" + "\n" + "sap-contextid-accept: header" + "\n" + "Accept: application/json" + "\n" + "Accept-Language: en" + "\n" + "DataServiceVersion: 2.0" + "\n" + "MaxDataServiceVersion: 2.0" + "\n" + "\n" + "\n" + "--batch_c914-a60c-1877--";var getContactOptions = { url: url, method: "POST", json:false, headers: { "content-type": "multipart/mixed;boundary=batch_c914-a60c-1877", 'Authorization': 'Basic ' + new Buffer(config.user + ":" + config.password).toString('base64') }, body: sBody};function getContact() { return new Promise(function(resolve,reject){ var requestC = request.defaults({jar: true}); console.log("Step1: get contact via url: " + url ); requestC(getContactOptions,function(error,response,body){ if( error){ console.log("error occurred: " + error); reject(error); } console.log("response:" + body); var nStartIndex = body.indexOf("{"); var nLastIndex = body.lastIndexOf("}"); if( nStartIndex < 0 || nLastIndex < 0) return; var sPayload = body.substring(nStartIndex, ++nLastIndex); resolve(JSON.parse(sPayload)); }); });}function displayResult(oResult){ console.log(oResult);}getContact().then(displayResult);使用node命令直接执行这个.js文件: ...

May 25, 2019 · 1 min · jiezi

如何在Marketing-Cloud里创建extension-field扩展字段

首先在Marketing Cloud里找到创建扩展字段的tile入口,搜索关键字extension: 这会进入Fiori应用“Custom fields”,能看到系统里所有创建好的extension field。点击+加号按钮新建一个: 维护这个扩展字段的技术信息,比如标签,类型,长度等等。 创建好之后点击按钮Publish,确保字段处于publish状态。 接下来需要为特定的UI enable这个字段的显示。在标签页UIs and Reports里,在对应的UI记录后点击按钮"Enable Usage": 最后一步,在UI上这个扩展字段放出来。点击Adapt UI: 进入Contact UI,点击加号按钮: 选择刚才创建好的扩展字段: 保存并publish发布change,至此这个扩展字段创建成功。 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

May 25, 2019 · 1 min · jiezi

使用nodejs创建Marketing-Cloud的contact数据

源代码如下: var config = require("./mcConfig");var request = require('request');var url = config.tokenURL;console.log("user: " + config.user + " password: " + config.password); var getTokenOptions = { url: url, method: "GET", json:true, headers: { 'Authorization': 'Basic ' + new Buffer(config.user + ":" + config.password).toString('base64'), "content-type": "application/json", "x-csrf-token" :"fetch" }};function getToken() { return new Promise(function(resolve,reject){ var requestC = request.defaults({jar: true}); console.log("Step1: get csrf token via url: " + url ); requestC(getTokenOptions,function(error,response,body){ var csrfToken = response.headers['x-csrf-token']; if(!csrfToken){ reject({message:"token fetch error: " + error}); return; } console.log("Step1: csrf token got: " + csrfToken); resolve(csrfToken); }); });}function createContact(token){ return new Promise(function(resolve, reject){ var oPostData = {"CountryCode":"CN", "City":"Chengdu", "FirstName":"Jerry4", "LastName":"Wang2", "PostalCode":"610093", "RegionCode":"", "Street":"天府软件园", "HouseNumber":"天府软件园", "DateofBirth":null, "ContactPersonFacets":[ {"Id":"jerry1@sap.com", "IdOrigin":"EMAIL", "Obsolete":false, "Invalid":false}, {"Id":"", "IdOrigin":"PHONE", "Obsolete":false, "Invalid":false}, {"Id":"", "IdOrigin":"MOBILE", "Obsolete":false, "Invalid":false}, {"Id":"", "IdOrigin":"FAX", "Obsolete":false, "Invalid":false} ], "IsConsumer":true, "Filter":{ "MarketingAreaId":"CXXGLOBAL" } }; var requestC = request.defaults({jar: true}); var createOptions = { url: config.createContactURL, method: "POST", json:true, headers: { "content-type": "application/json", 'x-csrf-token': token }, body:oPostData }; requestC(createOptions,function(error,response,data){ if(error){ reject(error.message); }else { var oCreatedContact = data; console.log("created contact ID: " + oCreatedContact.d.ContactPersonId); resolve(data); } }); });}getToken().then(createContact).catch((error) =>{ console.log("error: " + error.message);});这里我把创建的contact的名称字段硬编码成Jerry4: ...

May 25, 2019 · 1 min · jiezi

使用postman创建Marketing-Cloud的Contact

首先在Marketing Cloud的UI上创建一个contact: 观察Chrome开发者工具network标签页里的HTTP请求: https://jerry.gcdemo.hybris.c... 这个请求用于读取CSRF token: 点击保存,会发送一个新的HTTP post请求: 请求url:https://jerry.hybris.com/sap/...再看下重要的请求头部字段: 把第一步获得的CSRF token填到Postman里的header字段里,如图: body: {"CountryCode":"CN","City":"Chengdu","FirstName":"Jerry1","LastName":"Wang1","PostalCode":"610093","RegionCode":"","Street":"天府软件园","HouseNumber":"天府软件园","DateofBirth":null,"ContactPersonFacets":[{"Id":"jerry1@sap.com","IdOrigin":"EMAIL","Obsolete":false,"Invalid":false},{"Id":"","IdOrigin":"PHONE","Obsolete":false,"Invalid":false},{"Id":"","IdOrigin":"MOBILE","Obsolete":false,"Invalid":false},{"Id":"","IdOrigin":"FAX","Obsolete":false,"Invalid":false}],"IsConsumer":true,"Filter":{"MarketingAreaId":"CXXGLOBAL"}} 状态码201,证明创建成功了: 可以在前端看到创建成功的contact: 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

May 25, 2019 · 1 min · jiezi

使用postman修改SAP-Marketing-Cloud-contact主数据

Marketing Cloud里的contact主数据,创建成功后也不是所有字段都能够被修改。在Personal data区域的字段是可以被修改的。 比如我在“客户属性”字段里维护了一些值: 然后点保存: 其中第二个batch操作是通过一个roundtrip读取contact模型下多个子节点的数据,和我们这个修改的场景没有关联。 使用postman进行修改: body字段维护以下内容:--batch_1f7d-bd35-caedContent-Type: multipart/mixed; boundary=changeset_8f9e-9a44-9f9e --changeset_8f9e-9a44-9f9eContent-Type: application/httpContent-Transfer-Encoding: binary MERGE Consumers('02000A21209F1EE99CDF1A1FC9AA8065')?sap-client=100 HTTP/1.1Cache-Control: max-age=360sap-contextid-accept: headerAccept: application/jsonAccept-Language: enDataServiceVersion: 2.0MaxDataServiceVersion: 2.0x-csrf-token: fQ2Pwfmf0K_LVYoKV9QYUw==Content-Type: application/jsonContent-Length: 215 {"__metadata":{"uri":"https://jerry.hybris.com/sap/opu/odata/sap/CUAN_CONTACT_SRV/Consumers('02000A21209F1EE99CDF1A1FC9AA8065')","type":"CUAN_CONTACT_SRV.Consumer"},"YY1_CustomerType_ENH":"Jerry测试2"}--changeset_8f9e-9a44-9f9e-- --batch_1f7d-bd35-caed-- 我想修改的字段的新的值为:Jerry测试2 执行postman后,发现值已经更新了,修改成功 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

May 25, 2019 · 1 min · jiezi

如何使用Chrome开发者工具找到Marketing-Cloud某个contact的guid

我们使用nodejs对contact进行修改时,需要指定待修改contact实例的guid。 这个guid属于technical属性,在Marketing Cloud UI上默认情况下不可见。如何找到这个属性值呢? 其实就在浏览器地址栏的url里: 当然在Chrome开发者工具的network标签页里也能找到这个guid: 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

May 25, 2019 · 1 min · jiezi

Marketing-Cloud-demo环境和API使用方法说明

version 1.0作者:Wang Jerry更多问题请联系我 demo 系统url:https:/jerry.hybris.com/sap/b... 用户名/密码:Jerry1/Diablo1登录成功之后,可以在菜单"快速启动"->"Manage Contacts"里找到Marketing Cloud contact管理应用。单击: 这里就能看到该系统里所有的contact列表了。左边的1218377是系统contact总个数,正下方Create就是新建按钮,可以通过这个按钮打开contact创建页面。右边的search bar就是一个Google风格的模糊搜索入口。 这个界面第一次使用的话需要注意一些小技巧。 上图高亮的四个控件实际上是四个过滤器,例如当前系统里并不存在状态为For Review的contact,数字为0,因此单击这个过滤器后: 表格会显示0条数据。这是用户期望的行为,因此大家如果看到表格是空的,不要觉得奇怪。 当单击某条contact数据的超链接后, 会跳转到contact明细页面. 下图url里高亮的guid就是这条contact在SAP数据库里的主键值。 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

May 25, 2019 · 1 min · jiezi

Cloud Toolkit 部署应用到阿里云轻量应用服务器

在之前的文章《在 Intellij IDEA 中部署 Java 应用到 阿里云 ECS》中讲解了如何将一个本地应用部署到阿里云 ECS 上去,有些读者反馈目前正在使用阿里云轻量应用服务器,咨询是否可以通过 Cloud Toolkit 插件将应用部署到这些服务器上去?最新版本的 Cloud Toolkit 已经发布,完全支持啦。由于阿里云 ECS 云助手只能支持 VPC 网络机器,因此,轻量应用服务器只能通过 Host 模式手动添加机器,采用标准 SSH 协议来进行部署添加服务器如上图所示,在菜单Tools - Alibaba Cloud - Alibaba Cloud View - Host中打开机器视图界面,如下图:点击右上角Add Host按钮,出现添加机器界面设置服务器的 SSH 账号部署在 IntelliJ IDEA 中,鼠标右键项目工程名,在出现的菜单中点击 Alibaba Cloud - Deploy to Host…,会出现如下部署窗口:在 Deploy to Host 对话框设置部署参数,然后单击 Deploy,即可执行初次部署。部署参数说明:Deploy File:部署文件包含两种方式。Maven Build:如果当前工程采用 Maven 构建,可以使用 Cloud Toolkit 直接构建并部署。Upload File:如果当前工程并非采用 Maven 构建,或者本地已经存在打包好的部署文件,可以选择并直接上传本地的部署文件。Target Deploy host:在下拉列表中选择Tag,然后选择要部署的服务器。Deploy Location :输入在 ECS 上部署路径,如 /root/tomcat/webapps。Commond:输入应用启动命令,如 sh /root/restart.sh。表示在完成应用包的部署后,需要执行的命令 —— 对于 Java 程序而言,通常是一句 Tomcat 的启动命令。本文作者:银时阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

April 3, 2019 · 1 min · jiezi

在 IntelliJ IDEA 中部署应用到服务器

在之前的文章《在 Intellij IDEA 中部署 Java 应用到 阿里云 ECS》中讲解了如何将一个本地应用部署到阿里云 ECS 上去,有些读者反馈目前还有一些测试机器是在经典网络,甚至是在本地机房中,咨询是否可以通过 Cloud Toolkit 插件将应用部署到这些服务器上去?最新版本的 Cloud Toolkit 已经发布,完全支持啦。本地开发无论是编写云端运行的,还是编写本地运行的 Java 应用程序,代码编写本身并没有特别大的变化,因此本文采用一个及其基础的样例《在 Web 页面打印 HelloWorld 的 Java Servlet 》为例,做参考。public class IndexServlet extends HttpServlet { private static final long serialVersionUID = -112210702214857712L; @Override public void doGet( HttpServletRequest req, HttpServletResponse resp ) throws ServletException, IOException { PrintWriter writer = resp.getWriter(); //Demo:通过 Cloud Toolkit ,高效的将本地应用程序代码修改,部署到云上。 writer.write(“Deploy from alibaba cloud toolkit. 2018-10-24”); return; } @Override protected void doPost( HttpServletRequest req, HttpServletResponse resp ) throws ServletException, IOException { return; }}源代码下载上述代码就是一个标准的 Java 工程,用于在 Web 页面上打印一串“Hello World”的文案。安装插件阿里云提供了基于 Intellij IDEA 的插件,以方便开发人员能够高效的将本地 IDE 中编写的应用程序,极速部署到服务器中去。插件主页:https://www.aliyun.com/product/cloudtoolkit阿里云的这个 IntelliJ IDEA 插件的安装过程,和普通的插件大同小异,这里不再赘述,读者请自行安装。添加服务器如上图所示,在菜单 Tools - Alibaba Cloud - Alibaba Cloud View - Host中打开机器视图界面,如下图:点击右上角Add Host按钮,出现添加机器界面部署在 IntelliJ IDEA 中,鼠标右键项目工程名,在出现的菜单中点击 Alibaba Cloud - Deploy to Host…,会出现如下部署窗口:在 Deploy to Host 对话框设置部署参数,然后单击 Deploy,即可执行初次部署。部署参数说明:Deploy File:部署文件包含两种方式。Maven Build:如果当前工程采用 Maven 构建,可以使用 Cloud Toolkit 直接构建并部署。Upload File:如果当前工程并非采用 Maven 构建,或者本地已经存在打包好的部署文件,可以选择并直接上传本地的部署文件。Target Deploy host:在下拉列表中选择Tag,然后选择要部署的服务器。Deploy Location :输入在 ECS 上部署路径,如 /root/tomcat/webapps。Commond:输入应用启动命令,如 sh /root/restart.sh。表示在完成应用包的部署后,需要执行的命令 —— 对于 Java 程序而言,通常是一句 Tomcat 的启动命令。本文作者:银时阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

April 2, 2019 · 1 min · jiezi

对话Ruby创始人松本行弘、阿里高级技术专家朴灵!

4月25日,云栖社区联合阿里云国际站,特别邀请了Ruby创始人Matz(松本行弘)、阿里云高级技术专家朴灵,来为开发者们分享干货。在本次活动上可以了解到Ruby语言最新的动态,Ruby和新语言golang在性能方面的差别。听听Matz畅谈他对云原生发展的看法,了解下他最近的动向。可以听到阿里云高级技术专家朴灵分享阿里云在开发语言上的动向,以及对于开发者的支持。马上免费报名围观:https://yq.aliyun.com/live/920?utm_content=g_1000050058活动议程:讲师介绍及演讲内容:讲师:松本行弘(MatsumotoYukihiro)1965年生。日本鸟取县米子市出身。毕业于筑波大学第三学群情报学类。Ruby程序设计语言的创始人。在“株式会社网络应用通信研究所”担任特别研究员,“一般财团法人Ruby ”担任理事长等多种职务。中学二年级时,在父亲的口袋型电脑 Sharp PC-1210 上以 Basic 写了第一个程式。 1984 年进入筑波大学第三学群资讯(情报)学类。大学其中两年休学,从事基督教传教工作。 大学时在程式语言研究室,1990 年毕业。1993年以来,一直从事Ruby的设计与开发。 1997 年开始,在「株式会社 Network 应用通信研究所」担任特别研究员,专注开发 Ruby。著书:「物件导向Script语言Ruby」(与石冢圭树共同著作),「RubyDesktopReference」,「软体工匠(ソフトウェアの匠)」等。 自称「语言otaku」(语言宅男)。演讲内容:For Matsumoto san’s topic:Introduce the most recent Ruby progress and roadmap, especially on comparison of new language like Go-lang especially performanceBest practise/approach to ruby with cloud native trend讲师:朴灵(田永强)阿里云高级技术专家,负责阿里云多语言SDKs&Tools工作。“深入浅出Node.js”作者,曾经是一个Node.js贡献者 。GitHub ID:JacksonTian田永强,文艺型码农,就职于阿里云基础产品事业部,Node.js布道者,写了多篇文章介绍Node.js的细节。活跃于CNode社区,是线下会议NodeParty的组织者和JSConf China(沪JS和京JS)的组织者之一。热爱开源,多个Node.js模块的作者。叩首问路,码梦为生。演讲内容:阿里巴巴的技术栈ruby sdk 的现状 和未来的计划阿里巴巴在serverless和cloud 的实践马上免费报名围观:https://yq.aliyun.com/live/920?utm_content=g_1000050058本文作者:山哥在这里阅读原文本文为云栖社区原创内容,未经允许不得转载。

April 2, 2019 · 1 min · jiezi

Syncthing vs Resilio Sync vs Nextcloud 文件同步服务评测

首先,这是我一直同时在用的 3 个开源同步服务。那为什么我要同时用着多个同步服务呢?主要是因为它们各有优势,有一些无可替代的功能。Resilio Sync 高级版提供的 可选择性同步,让我用 0KB 的占用空间,可以得到所有文件的目录和名称。在我需要的时候,又能以极快的速度下载到本地。这是个我使用极少的功能,但是却是使用中最为爽快的一个功能。分享和下载的时候,我都毫无负担,因为它们都不存在于本地,我只用下载自己想要的文件。Nextcloud 提供的文件 分享 可以让你有更多的选择以及权限控制,只用一条 url 链接,你就可以简单的分享给需要的人,而且还能提供文件操作动态,你可以知道文件在什么时候做了哪些变动,这对你希望监控文件动态的时候非常好用。并且它还提供许多不同类型的 App 拓展,其中包括 Rss程序、Keepass管理程序、音乐播放、视频播放 等诸多功能。Syncthing 这是我 个人文件同步 的主力服务,我用它进行跨设备同步和备份。它是我的 Inbox 文件夹,收集着每台设备上的数据,我用它来进行 数据、库、配置 等文件的同步。它的优点也非常简单,安装简单,网络要求低,提供完善的版本控制。我只需要后台开启,配置好,就无需再担心。当然,我并不单单只依赖上面 3 个同步服务(当然rsync、webdav、ftp我也用,但这不在讨论范围内。),我还搭配电脑的备份服务进行备份。家庭文件服务器还会有快照计划,重要文件也会定时冷备份。这样,我才能任性的对待数据,并再也不用担心它们会消失不见了。: )下面,我们进入正题,对比一下 3 款同步服务的优缺点吧。1. 平台覆盖平台SyncthingResilio SyncNextcloudiOS✘✔︎✔︎Android✔︎✔︎✔︎macOS✔︎✔︎✔︎Windows✔︎✔︎✔︎Linux✔︎✔︎✔︎Linux Arm✔︎✔︎✔︎Docker x86✔︎✔︎✔︎Docker Arm✘✘✔︎Nas System✔︎✔︎✘PS: 主要统计的是官方支持的平台。第三方方案,不计入统计。这里比较遗憾的是 Syncthing 并没有 iOS 客户端,曾经有一款但是现在已经下架了,我手机端主要用 Nextcloud 偶尔用 Resilio Sync(毕竟只同步大文件用)。docker arm 不支持的服务需要自行构建(第三方也可),通常支持 linux arm 的都支持 docker arm,但是官方只构建了 x86 版本。Nextcloud 的 Nas 版本很可能是有的,但是 Nextcloud 官方没介绍,NAS 系统 官方库一般也有下载,毕竟这个服务很普遍了。2. 功能对比功能SyncthingResilio SyncNextcloud版本控制阶段性版本控制回收站限客户端网络环境1. 同步无限制2. 中区中转服务器稀少1. 同步无限制2. 设备发现需国外环境1. 同步无限制2. 应用下载需国外环境3. 部分应用依赖国外服务同步速度1. 内网满带宽2. 外网依赖中转服务器带宽1. 内网满带宽2. 外网依赖同步设备带宽总和1. 内网满带宽2. 外网依赖部署服务器带宽WebDav✘✘✔︎选择同步✘✔︎(高级版)✘文件加密✘✔︎(加密文件夹)✔︎(需设置)同步加密✔︎✔︎✔︎(需启用https)部署难度低低高文件分享✔︎(只能整库分享)✔︎(只能整库分享)✔︎权限管理✔︎✔︎✔︎2.1 网络问题这里重点讨论一下主要影响大家使用的网络问题。2.1.1 Syncthing 的同步速度为什么那么慢?先说结论,原因是由于对 Syncthing 开放且距离你最近的 中继服务器 过少并且速度较慢导致的。PS: https://relays.syncthing.net/ 这里可以看到开放的 中继服务器 列表。(个人使用的中继服务器可以不开放)最开始用的时候,我并没有觉得这个问题影响使用,因为数据量不大(都是配置文件),也就没有在意。自从 Resilio Sync 因为众所周知的问题挂了以后,我把大量同步任务也迁移到了 Syncthing,其中就包括了 虚拟机、多媒体文件、下载的系统文件、备份文件 等大文件数据。但这就要了命了,几十 kb 的速度同步至少按周来算,而且是不关机的那种。这时候,我就想了 2 个办法先缓缓。通过复制/同步到目标机器的方式,把所有文件传输过去。(这种方式不治本,因为虚拟机变化产生的文件很大,如果不经常变动,你可以采用此方法。)修改 文件拉取顺序 为 小文件优先。在文件夹 选项->高级->文件拉取顺序 中修改。——————– (想治本的同学看这里)我是善良友好的分割线 ——————–当然以上方法都是不解决根本问题的。真正解决问题的办法是,自建中继服务器(划重点)。如何构建 Syncthing Relay Server。(官方英文文档)如何设置 Relaying。(官方英文文档)我在测试过的的docker镜像 t4skforce/syncthing-relay。(构建源码可参考)碍于篇幅,这里不能教大家如何去部署。先提供一些资料给大家参考。 : )2.1.2 Resilio Sync 为什么无法找到设备?先说结论,原因是 Resilio Sync 的 trackers and relays 服务器无法访问。解决办法也很简单,让无法访问的地址走代理就可以了。获取配置文件 https://config.resilio.com/sync.conf参考图:碍于篇幅,细节就略略略了。 : )Nextcloud 为什么无法访问应用页面下载应用?先说结论,原因是因为应用商店无法访问。你可以自行去 GitHub 下载 App 项目。并解压到 NEXTCLOUD-PATH/apps 目录下,按照项目教程进行部署。解决部署服务器无法访问 Nextcloud App Servier 无法访问的问题。碍于篇幅,略略略。 : )2.2 版本控制既然和数据有关,那最害怕的是什么?那当然就是数据 同步异常、数据丢失、数据误删、意外导致数据丢失 等数据消失不见的严重问题了。——————– (结论看这里)我是善良友好的分割线 ——————–这里不讲如何保障数据,直接说结论:以上软件所提供的版本控制,都无法完全保证数据同步过程中不丢失。所以不要认为有了版本控制,数据就可以随意处理了。有时候你想找回某个数据还真不一定找得到。(自行搭配快照、副本、备份。)——————– (评测看这里)我是善良友好的分割线 ——————–Syncthing 提供的 版本控制 非常多,可以适应多种场景下使用。其中 阶段版本控制 提供了 小时 级别的历史记录,最大程度的保障数据安全,并且提供了历史记录查看器,可以很方便的查看历史记录,并恢复。基本上,它可以适应所有个人同步需求,并且同步过程中对数据也相对安全。参考图:Resilio Sync 并不提供版本控制功能,只有最简单的回收站机制。甚至你也不清楚有没有放入回收站。所以它只适合 分享型、大文件型、变动少、文件相对而言不那么重要、目录层次少结构不复杂 等使用环境。我基本上,都是用来放大文件和多媒体文件。Nextcloud 提供文件变化版本控制,但仅限于使用其客户端的方式。通过 WebDav 等访问的方式,是 没有版本控制 的,由于其使用数据库来记录所有文件,所以文件数量和结构,考验着你的数据库服务器。并且其 http 传输原理导致默认对 文件大小 有所限制。当然以上问题,都能通过其他方法来解决,但是我仍然 不推荐用来作为主要的同步服务。但是其丰富的拓展性,以及详尽的文件记录,非常适合 分享 和 多人协作,适合对外提供服务,可以弥补 Syncthing 这类个人同步服务的短板,也就是协作和分享。3. 结语这 3 款开源同步服务,在同步速度上,都是可以满速运行的,同步速度上体验没多大区别。但是由于各自服务的机制不同,需要一定动手能力,才能达到最佳效果。以上只是对这 3 款开源服务的一些细节做了一些对比。如果大家有比较关心的其他细节,再做补充。Bye. : ) ...

March 28, 2019 · 1 min · jiezi

阿里巴巴的微服务开源之路

侠之大者,为国为民。在金庸小说中,郭靖和黄蓉是“侠之大者,为国为民”的典范,他们以布衣之身帮助宋军守护襄阳十余年。技术的世界里,并无大小之分。但当一群程序员由服务公司内部转变为社会的程序员,将技术以开源的方式与社区的开发者一同协作、改进和使用时,他们便被赋予了更大的责任和期待。阿里云智能中间件的程序员们正和社区的开发者们一起,用键盘敲下国内微服务开源项目的过去和未来。国内首个非 Hadoop 生态体系的 Apache 社区顶级项目2016年的那届双11,RocketMQ 团队首次将低延迟存储解决方案应用于双11的支撑,经受住了流量的大考,整个大促期间,99.996%的延迟落在了10ms以内,完成了保障交易稳定的既定目标。对于读写比例几乎均衡的分布式消息引擎来说,这一技术上的突破,即便是放在全球范围内,也绝对是值得称赞的。另一边,在历时3个月的开源重塑后,RocketMQ 团队启动了向 Apache 软件基金会的捐赠之路,但迈出这一步并不容易。“当时国内的开源氛围还没有现在那么活跃,开源之后,很多设计文档、代码质量,以及社区建设还不够理想。我们一直期待,国内的开源项目和开源社区也可以在世界的开源舞台上发挥让人瞩目的价值,希望更多“中国智造”的开源项目成为世界级的开源项目。”阿里云智能高级技术专家冯嘉回忆道。经过近一年的努力,在2017年9月25日,Apache软件基金会官方宣布,阿里巴巴捐赠给 Apache 社区的开源项目 RocketMQ 从 Apache社区正式毕业,成为 Apache 顶级项目(TLP),这是国内首个非 Hadoop 生态体系的 Apache 社区顶级项目。值得一提的是,根据项目毕业前的统计,RocketMQ 有百分八十的新特性与生态集成来自于社区的贡献。毕业一年多后,RocketMQ 已经覆盖互联网金融等领域60%以上的消息场景,并被应用到金融、电力、物流、游戏、电子商务、共享出行等十几个行业。然而,随着云计算、大数据、人工智能等技术在全球范围的深入推进,催生出了如IoT、区块链、AI、边缘计算等新的应用场景,架构上如何进一步演进以更好的适应新的场景,服务好下一个十年,这是即将到来的 RocketMQ 5.0 要解决的问题。消息领域的里程碑事件RocketMQ 从 Apache 社区正式毕业的同时,消息领域出现了另一件里程碑事件,分布式消息领域的国际标准 OpenMessaging 开源项目正式入驻Linux基金会,这是国内首个在全球范围发起的分布式计算领域的国际标准。消息通信已经成为现代数据驱动架构的关键环节,但在全球范围内,消息领域仍然存在两大问题:一是,缺乏供应商中立的行业标准,导致各种消息中间件的高复杂性和不兼容性,相应地造成了公司的产品低效、混乱和供应商锁定等问题。二是,目前已有的方案框架并不能很好地适配云架构,即非云原生架构,因此无法有效地对大数据、流计算和物联网等新兴业务需求提供技术支持。这也是 RocketMQ 开源过程中,开发者和合作伙伴经常会提到的问题:“在消息领域,市场上出现了各类不同的开源解决方案,这导致了用户更高的接入和维护成本,为了确保各个消息引擎间能正常通信,还要投入大量的精力去做兼容。”这时候,建立一套供应商中立,和语言无关的消息领域的事实标准,成为各社区成员共同的诉求。此后,阿里巴巴发起 OpenMessaging 项目,并邀请了雅虎、滴滴出行、Streamlio 共同参与,一年后,参与OpenMessaging 开源标准社区的企业达20家之多,包括阿里巴巴、Datapipeline、滴滴出行、浩鲸科技、京东商城、科大讯飞、青云QingCloud、Streamlio、VIPKID、微众银行、Yahoo、中国移动苏州研发中心等(按首字母排序),此外,还获得了 Apache RocketMQ、Apache Pulsar 等顶级消息开源厂商的支持。相比于开源一个分布式消息项目,一套开源标准能被各家厂商所接受,对整个国内开源领域而言,是更具有里程碑意义的事件。从微服务框架到微服务生态Dubbo 是阿里巴巴于2012年开源的分布式服务治理框架,是国内影响力最大、使用最广泛的开源服务框架之一。在2016年、2017、2018年开源中国发起的最受欢迎的中国开源软件评选中,连续三年进入 Top10 名单。2019年2月 Dubbo 发布了2.7.0,这一版本将用于 Apache 基金会的正式毕业。(已进入 Near Graduation 阶段)从 Apache 孵化器毕业,除了有个名誉,对项目之后的维护、发展有什么影响?“从孵化器毕业是一种荣誉,但这并不是结束,而是另一种开始。这有点像求学,毕业并不意味着学习上的中断,而是发挥更大社会价值的开始。毕业也更像是一个成人礼,意味着Dubbo 团队已经符合Apache对一个成熟开源项目的要求,并开始具备独立发展的能力。”阿里云智能高级技术专家北纬在接受媒体采访时回答道。截至目前,Dubbo 已收获 2.5w+ star,在 GitHub 所有 Java 项目中排名前十,并有越来也多的企业用户选择 Dubbo 作为自己的微服务治理框架。但是,随着微服务化的逐渐深入,Dubbo 提供的能力逐渐无法满足微服务各个方面的需求。阿里云智能技术专家望陶在一次直播中分享道:“Dubbo 是一个微服务框架,帮助开发者快速构建高性能的微服务应用。但在 API Gateway,熔断限流,分布式监控,分布式事务等方面,缺乏一套比较完整的围绕 Dubbo 的解决方案,基本上是各个公司自研,或者需要调研外面开源的各种框架进行调研选型,花费了比较大的时间和精力在这上面,却无法形成一套体系化的方案。”因此,我们做了进一步的演进,即从微服务框架演进到微服务生态。通过和成熟的开源方案做集成,形成一个完整的微服务生态,组成 Dubbo Ecosystem,开发者无需为现有的系统做出过多的修改,就能快速开发微服务应用。Dubbo Ecosystem 的概念得以提出,离不开 2018 年夏天开源的两大微服务组件。技术人的仲夏之夜2018年夏天,国内开源领域,迎来了两位新成员。作为微服务和云原生生态下的两款重要开源组件,Nacos 主打云原生应用中的动态服务发现、配置和服务管理,Sentinel 则是聚焦在限流和降级两个方面。Nacos 和 Sentinel 均是在阿里近10年的核心业务场景下沉淀所产生的,他们的开源是对微服务和元原生领域开源技术方案的有效补充,同时也非常强调融入开源生态,除了兼容 Dubbo,也支持 SpringCloud 和 Kubenetes 等生态,以增强自身的生命力。“阿里巴巴早在 2007 年进行从 IOE 集中式应用架构升级为互联网分布式服务化架构的时候,就意识到在分布式环境中,诸如分布式服务治理,数据源容灾切换、异地多活、预案和限流规则等场景下的配置变更难题,因为在一个大型的分布式系统中,你没有办法把整个分布式系统停下来,去做一个软件、硬件或者系统的升级。”阿里云智能高级技术专家坤宇在 QCon 的现场分享道。相比其他服务配置中心开源方案,Nacos 的起步虽然晚了点,但除了配置中心,他还提供了动态服务发现、服务共享与管理的功能,在大规模场景下具备更优秀的性能,在易用性上更便捷,分布式部署上更灵活。Nacos 支持多种启动模式,用户可以根据业务场景自由选择,将各个功能模块,如注册中心和配置中心,分开部署或者合并部署,从而能够完整支持小型创业公司成长到大型企业,微服务全生命周期的演进。截止到目前,已经有40多家企业将 Nacos 部署到生产环境中,例如 虎牙直播 就是最早一批将 Nacos 大规模引入到生产环境的典型用户。“虎牙关注 Nacos 是从v0.2 开始的,我们也参与了社区的建设,可以说是比较早期的企业用户。引入Nacos前,我们也对比了Spring Cloud Config Server、ZooKeeper 和 ectd ,总体评估下来,基于我们微服务体系现状以及业务场景,决定使用 Nacos 作为服务化改造中服务注册和服务发现的方案。使用过程中,我们发现,随着社区版本的不断更新和虎牙的深入实践,Nacos 的优势远比调研过程中发现的多。”虎牙基础保障部中间件团队负责人张波在一次开发者活动上分享道。巧的是,一边是 Nacos宣布开源,并被列入 CNCF 云原生全景图,另一边是 Spring Cloud 生态下的服务注册和发现组件 Netflix Eureka 宣布停止开源投入,勇敢者的游戏充满了变数,但在 Nacos 团队看来,这场游戏自己可以走到最后,因为我们并不是一个人在战斗,Nacos 只是阿里众多开源项目中的一员,随后还会有更多的开源项目反哺给社区,形成生态,例如轻量级限流降级组件 Sentinel。2018年7月29日,AliwareOpen Source•深圳站现场,只能容纳400人的场地,来了700多位开发者。阿里云智能高级技术专家子矜在现场宣布了轻量级限流降级组件 Sentinel 的开源。Sentinel 经历了10年双11的考验,覆盖了阿里的所有核心场景,也因此积累了大量的流量归整场景以及生产实践。Sentinel 的出现,离不开阿里历届高可用架构团队的共同努力。“在双11备战中,容量规划是最重要也是最具挑战的环节之一。从第一年开始,双11的0点时刻就代表了我们的历史最高业务访问量,它通常是日常流量的几十倍甚至上百倍。因此,如何让一个技术和业务持续复杂的分布式站点去更平稳支撑好这突如其来的流量冲击,是我们这10年来一直在解的题。”阿里云智能高可用架构团队资深技术专家游骥在一次双11备战结束后分享道。这10年,容量规划经历了人工估算、线下压测、线上压测、全链路压测、全链路压测和隔离环境、弹性伸缩相结合的5个阶段。2013年双11结束后,全链路压测的诞生解决了容量的确定性问题。作为一项划时代的技术,全链路压测的实现,对整个集团而言,都是一件里程碑事件。![2014年,高可用架构团队获得集团 CTO 大奖](https://upload-images.jianshu…随后,基于全链路压测为核心,打造了一系列容量规划相关的配套生态,提升能力的同时,降低了整个环节的成本、提升效率。随着容量规划技术的不断演进,2018年起,高可用架构团队希望可以把这些年在生成环境下的实践,贡献给社区,之后便有了 Sentinel 的开源。Sentinel 开源后仅两个月,便被列入云原生全景图谱,位于编排和管理模块象限中,同时被列入云原生全景图谱的还有提供应用架构自动探测、故障注入式高可用能力演练和一键应用限流降级等功能的应用高可用服务 AHAS。近期,Sentinel 贡献的spring-cloud-circuitbreaker-sentinel模块正式被社区合并至Spring Cloud Circuit Breaker,由此,Sentinel 也加入了 Spring Cloud Circuit Breaker 俱乐部,成为 Spring Cloud 官方的主流推荐选择之一。Spring Cloud 官方推荐的微服务方案不止 Sentinel 一个,还有 Spring Cloud Alibaba.2018年,中国的 Java 圈发生了一件大事。Spring Cloud 联合创始人 Spencer Gibb 在 Spring 官网的博客页面宣布:阿里巴巴开源 Spring Cloud Alibaba,并发布了首个预览版本。随后,Spring Cloud 官方 Twitter 也发布了此消息。可能是受到 Spring Cloud Netflix 减少开源投入的影响,Spring Cloud Alibaba 开源后的热度超出了阿里巴巴高级技术专家姬望的预期。在接受开源中国采访的过程中,姬望认为“Spring Cloud Alibaba 是中国 Java 开发者的福音,弥补了 Spring Cloud 原生实现在大规模集群场景上的局限性。Spring Cloud 规范的实现目前有很多,比如 Netflix 有自己的一整套体系,Consul 支持服务注册和配置管理,ZooKeeper 支持服务注册等。但每套实现或多或少都有各自的优缺点,或许大多数 Spring Cloud 用户很难体会到 Netflix OSS 等实现的局限性,无论是服务发现、分布式配置,还是服务调用和熔断都不太适合大规模集群场景,比如我们内部也遇到 Eureka 性能问题。因此,我们将自身的超大规模集群经验与强大的 SpringCloud 生态整合,实现强强联合,希望能对业界会产生一些积极的化学变化。”夏天过后,开源的热度仍在延续效率的好处在于,我们可以把自己的注意力和时间聚焦在更需要创造力的事情上,做更有成就感的事情。对于工作在工程领域的开发者们而言,他们的效率意识更强。2018年9月,阿里将内部广泛使用的 Java 线上诊断工具进行开源,取名 Arthas (阿尔萨斯)。也许是击中了开发者线上排查问题的痛点,Arthas 在距离开源后的第一个 Release 版发布仅 147 天,就获得了超过 1w 的 star 数,并有40多位 Contributors 参与开源贡献。从中,我们不仅看到 Arthas 在开发者群体中的受欢迎程度,也发现越来越多的国内开发者开始擅于使用开源技术加速业务发展,更是不禁畅想起将来会有更多国内的优质开源项目获得全球开发者的关注和喜爱。技术领域,一切 里程碑 的达成,都源于一份技术情怀。阿里云智能技术专家断岭回忆到:“Arthas 在阿里巴巴内部起源于2015年,当时微服务方兴未艾,我们团队一方面专注 Spring Boot 的落地,提高开发效率。另外一方面,希望可以提高技术团队线上排查问题的能力和效率。当时,我们经过选型讨论,选择基于 Greys (Greys 是阿里巴巴杜琨@oldmanpushcart 开发的),一款 Java 开源在线问题诊断工具来开发,以提供更好的应用诊断体验。”我们在用户体验上做了大量的改进:彩色UI、Web Console 和内网一键诊断等。慢慢的,Arthas 成为阿里巴巴很多技术同事线上诊断问题的必备工具。尽管 Arthas 在阿里内部广受好评,但只是一个自用的工具。取之开源,用之开源,因此我们在2018年9月28日,正式开源了 Arthas,希望可以帮助 Java 开发人员提升诊断效率。随着越来越多的开发者开始使用 Arthas,众多开发者效率工具将 Arthas 内置到自己的产品中,丰富了 Arthas 的接入和打开方式,例如 IDE 插件 Cloud Toolkit。时间来到2019年。阿里云智能高级开发工程师煊檍在内网分享到:分布式事式问题一直是应用开发过程中的技术痒点。不敢说是痛点,因为长久以来,大家普遍对分布式事务问题的应对策略还是:能不用就不用,尽量绕开。但在微服务架构普遍落地的今天,分布式事务问题越来越绕不开,解决方案不是没有,但要么性能差,要么侵入性高,不容易落地。总之,是有点“不爽”。而这种“不爽”集中反映在了分布式事务开源中间件 Fescar 上。当阿里云智能高级开发工程师清铭在2019年1月 RocketMQ Meetup 上宣布分布式事务中间件 Fescar 正式开源后的一周内,Fescar 便收获了3000+ star,社区讨论的 issue 达58个。随后,Fescar 项目组整理并回答了开发者们集中关心的13个问题,例如 Fescar 的诞生背景、适用场景,和其他开源分布式事务方案之间的差别等。阿里巴巴中间件团队于2014年发布 TXC(Taobao Transaction Constructor),开始为集团内应用提供分布式事务服务。2016年,TXC 经过产品化改造,以 GTS(Global TransactionService)的身份上线阿里云,成为当时业界唯一一款云上分布式事务产品,以阿里云公有云和专有云解决方案的形式,交付给众多外部客户,并得到了客户的一致认可。2019 年,基于 TXC 和 GTS 的技术积累,中间件团队发起了开源项目 Fescar(Fast & EaSy Commit And Rollback, FESCAR),和社区一起共建分布式事务解决方案。TXC/GTS/Fescar 一脉相承,为解决微服务架构下的分布式事务问题交出了一份与众不同的答卷。而Fescar 的愿景是让分布式事务的使用像本地事务的使用一样简单和高效。最终的目标是希望可以让 Fescar 适用于所有的分布式事务场景。阿里巴巴的开源之路仍在延续。恰逢其时,阿里云峰会·北京的开发者专场现场,阿里云智能资深技术专家李三红宣布,阿里开源 Open JDK 长期支持版本 Alibaba Dragonwell,作为 JCP 最高执行委员会唯一的中国企业,将更主动的参与到 Java 生态的维护工作中。Dragonwell 意为龙井,象征着中国的茶文化。本文作者:中间件小哥阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

March 25, 2019 · 2 min · jiezi

阿里巴巴微服务开源项目盘点(持续更新)

大前端、微服务、数据库、更多精彩,尽在开发者分会场【Apache Dubbo】Apache Dubbo 是一款高性能、轻量级的开源Java RPC框架,是国内影响力最大、使用最广泛的开源服务框架之一,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。在2016年、2017、2018年开源中国发起的最受欢迎的中国开源软件评选中,连续三年进入Top10名单。2019年2月Dubbo发布了2.7.0,这一版本将用于Apache 基金会的正式毕业。项目地址:https://github.com/apache/incubator-dubbo最新动态:探秘 Dubbo 的度量统计基础设施 - Dubbo MetricsDubbo 生态添新兵,Dubbo Admin 发布 v0.1谁正在用:https://github.com/apache/incubator-dubbo/issues/1012媒体报道:Dubbo作者亲述:那些辉煌、沉寂与重生的故事【Apache RocketMQ】Apache RocketMQ 是一款分布式消息引擎,具备「低延迟」、「高性能」、「高可靠性」等特点,可满足兆级容量和可扩展性的需求。它是国内首个非 Hadoop 生态体系的Apache 社区顶级项目,根据项目毕业前的统计,RocketMQ有百分八十的新特性与生态集成来自于社区的贡献。项目地址:https://github.com/apache/rocketmq最新动态:Apache RocketMQ 发布 v4.4.0,新添权限控制和消息轨迹特性谁正在用:RocketMQ 在平安银行的实践和应用滴滴出行基于RocketMQ构建企业级消息队列服务的实践【OpenMessaging】OpenMessaging开源项目于2017年正式入驻Linux基金会,是国内首个在全球范围发起的分布式计算领域的国际标准。OpenMessaging开源标准社区的企业达10家之多,包括阿里巴巴、Datapipeline、滴滴出行、浩鲸科技、京东商城、青云QingCloud、Streamlio、微众银行、Yahoo、中国移动苏州研发中心(按首字母排序),此外,还获得了RocketMQ、RabbitMQ和Pulsar 3个顶级消息开源厂商的支持。项目地址:https://github.com/openmessaging/openmessaging-java首个由国内发起的分布式消息领域的国际标准OpenMessaging一周年回顾【Nacos】Nacos 是一个更易于帮助构建云原生应用的动态服务发现、配置和服务管理平台,提供「注册中心」、「配置中心」和「动态DNS服务」三大功能。项目地址:https://github.com/alibaba/nacos谁正在用:https://github.com/alibaba/nacos/issues/273虎牙直播在微服务改造方面的实践和总结最新动态:Nacos Committers 团队首亮相,发布 0.9.0 版本背后的故事最佳实践阿里巴巴基于 Nacos 实现环境隔离的实践如何打通CMDB,实现就近访问【Sentinel】Sentinel 承接阿里巴巴近10年双十一大促流量的核心场景,以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。其提供丰富的应用场景支持、完备的监控能力、易用的拓展点。项目地址:https://github.com/alibaba/sentinel最新动态:https://dwz.cn/faH9eKHH背后的故事媒体专访:限流熔断技术选型:从Hystrix到Sentinel最佳实践快速体验 Sentinel 集群限流功能,只需简单几步【Arthas】Arthas 是一款 Java 线上诊断工具,可有效解决开发过程中遇到的各类诊断难题。2018年9月,阿里将内部广泛使用的java线上诊断工具进行开源,取名arthas(阿尔萨斯)。也许是击中了开发者线上排查问题的痛点,Arthas在距离开源后的第一个Release 版发布仅 147 天,就获得了超过1w的star数,并有40多位contributors参与开源贡献。项目地址:https://github.com/alibaba/arthas最新动态:新的开始 | Arthas GitHub Star 破万后的回顾和展望【Spring Cloud Alibaba】Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案,提供包括「服务限流降级」、「服务注册与发现」、「分布式配置管理」和「阿里云对象存储」等主要功能。项目地址:https://github.com/spring-cloud-incubator/spring-cloud-alibaba最新动态:Spring Cloud Alibaba发布第二个版本,Spring 发来贺电媒体报道:Spring Cloud Alibaba,中国 Javaer 的福音,为微服务续上 18 年【Fescar】Fescar 是阿里巴巴2019年1月开源的一套分布式事务中间件,Fescar 的愿景是让分布式事务的使用像现在本地事务的使用一样简单、高效,最终的目标是希望可以适用于所有的分布式事务场景。项目地址:https://github.com/alibaba/Fescar• 最佳实践集成源码深度剖析:Fescar x Spring Cloud分布式事务中间件 Fescar—RM 模块源码解读*阿里热门开源项目↓↓↓↓↓海量资源点击领取更有kindle、技术图书抽奖活动,百分百中奖本文作者:中间件小哥阅读原文本文为云栖社区原创内容,未经允许不得转载。

March 19, 2019 · 1 min · jiezi

Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel

摘要: 本文对Hystrix、Resilience4j、Sentinel进行对比,并探讨如何使用一行代码这种极简的方式,将Hystrix迁移到Sentinel。 Hystrix 自从前段时间 宣布停止维护之后,社区推荐了 resilience4j。自 Spring Cloud 官方宣布 Spring Cloud Netflix 进入维护状态后,我们开始制作《Spring Cloud Alibaba迁移指南》系列文章,向开发者提供更多的技术选型方案,并降低迁移过程中的技术难度。第一篇,我们对Hystrix、Resilience4j 和 Sentinel 三个开源项目进行对比,并探讨如何使用一行代码这种极简的方式,将Hystrix迁移到Sentinel。Hystrix 自从前段时间 宣布停止维护之后,社区推荐了 resilience4j。这 3 款产品各有优劣势,具体的功能差异参考下表(该表来源 Sentinel Wiki): SentinelHystrixresilience4j隔离策略信号量隔离(并发线程数限流)线程池隔离/信号量隔离信号量隔离熔断降级策略基于响应时间、异常比率、异常数基于异常比率基于异常比率、响应时间实时统计实现滑动窗口(LeapArray)滑动窗口(基于 RxJava)Ring Bit Buffer动态规则配置支持多种数据源支持多种数据源有限支持扩展性多个扩展点插件的形式接口的形式基于注解的支持支持支持支持限流基于 QPS,支持基于调用关系的限流有限的支持Rate Limiter流量整形支持预热模式、匀速器模式、预热排队模式不支持简单的 Rate Limiter 模式系统自适应保护支持不支持不支持控制台提供开箱即用的控制台,可配置规则、查看秒级监控、机器发现等简单的监控查看不提供控制台,可对接其它监控系统目前 Sentinel 在 Spring Cloud Alibaba 项目中已经适配了 Spring Cloud 体系,可以用来完全替代 Hystrix 的功能了。Spring Cloud Alibaba Sentinel 功能介绍Spring Cloud Alibaba Sentinel 主要是为了整合 Sentinel 和 Spring Boot/Cloud 技术栈。目前完成了如下功能:自动适配 Servlet 容器。只需要配置 url-pattern(默认拦截所有请求),即可对拦截的这些 url 进行限流降级操作整合了 RestTemplate,使用 RestTemplate 进行操作的时候会被限流降级整合了 Feign,兼容了原先的 Hystrix 支持 Feign 的编程模型数据源可配置化,只需在配置文件中配置数据源信息,即可动态加载规则Endpoint 暴露各种元数据,比如配置信息,规则数据HealthIndicator 检查 Sentinel 健康状态 (整合中)支持 Spring Cloud Gateway 和 Zuul (整合中)Spring Cloud Alibaba Sentinel 代替 Hystrix想要使用 Spring Cloud Alibaba Sentinel,需要加上依赖信息:<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-alibaba-sentinel</artifactId> <version>0.2.1.RELEASE</version></dependency>0代码修改兼容 Feign加上 Feign 的依赖:<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>${latest.version}</version></dependency>把 hystrix 的配置改成 sentinel 的即可使用 Sentinel 的限流降级功能:# feign.hystrix.enabled: truefeign.sentinel.enabled: true@FeignClient(name = “service-provider”)public interface EchoService { @RequestMapping(value = “/echo/{str}”, method = RequestMethod.GET) String echo(@PathVariable(“str”) String str); @RequestMapping(value = “/echo/save”, method = RequestMethod.POST) String save(Foo foo);}对于这个 EchoService,echo 方法对应的资源名是 GET:http://service-provider/echo/{str}, save 方法对应的资源名是 POST:http://service-provider/echo/save。只需配置这些规则,限流降级操作即可立即生效。一行代码支持 RestTemplateSentinel 还跟 Spring 生态的 RestTemplate 做了整合,可以对 RestTemplate 请求过程进行限流和降级操作,只需要在构造 RestTemplate 的时候加上 @SentinelRestTemplate 注解即可:@Bean@SentinelRestTemplatepublic RestTemplate restTemplate() { return new RestTemplate();}@SentinelRestTemplate 注解还暴露出了对应的属性可进行限流降级后的自定义错误,默认的行为是返回 “RestTemplate request block by sentinel” 信息。关于 @SentinelRestTemplate 的详细信息可以参考 Wiki。本文作者:中间件小哥阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

February 26, 2019 · 1 min · jiezi

SAP CX Upscale Commerce : SAP全新推出的电商云平台

大家好,我是Andy Chen,是SAP成都研究院年轻的SAP CX Upscale Commerce (后面将会以Upscale简称)开发团队的一名产品经理。CX的全称是Customer Experience。今天很高兴能够从一个产品经理的视角,给大家初步介绍一下这个SAP全新推出的面向中端市场的电商云平台。SAP CX Upscale Commerce是SAP专为零售商,B2C品牌商,CPG(快速消费品)和Direct-to-Consumer(直接面向消费者)行业而设计的下一代中端市场电商SaaS云平台。当前目标市场是美国(未来会逐步推向全球其他区域),目标客户主要包含以下特征:目标公司的软件采购和实施预算低于25万美元总收入(total revenues)低于10亿美元的General Business公司大型公司(包括SAP Enterprise Commerce Platform和SAP Commerce Cloud客户)寻求快速部署上线某些子品牌的快闪店(popo-upstore),小型的online或者in-store应用商店。在选择Upscale方案之前,这些公司通常会选择部署在其他电商平台上,比如Shopify Plus或Magento2018年10月,SAP的两位大佬, CX总裁Alex Atzberge以及SAP Upscale Commerce的高级副总裁Charles Nicholls,在巴塞罗那CX Live会议上宣布 SAP CX Upscale Commerce上线。2019年1月,SAP Upscale Commerce被评选为SAP Labs China 2018最佳产品之一,本人也很荣幸代表成都Upscale团队上台领取该奖项。Upscale研发部门分布在全球多个城市,波士顿主要负责前端应用研发,成都、蒙特利尔、慕尼黑和伦敦主要负责后端微服务交付。接下来开始我们分三个大的章节进行的产品介绍,首先介绍目前美国零售行业数字化转型的挑战,接下来是Upscale产品概念与部分特征,最后介绍如何通过Upscale在30分钟内快速部署一个iOS移动原生电商应用。如果大家有任何关于Upscale产品以及技术架构的问题,可以留言讨论。零售行业数字化转型面临的挑战(以美国为例)1. 电商移动用户体验的提升势在必行根据comScore关于移动端的统计报告,尽管占据了全网约70%的流量,但是只有20%的交易发生在移动端。这份报告的详细地址:https://www.comscore.com/Insi…市场主流的在线商店应用都是为PC桌面为出发点设计的,而移动设备应用只是PC端购物体验的延伸和扩展,用户体验没有针对移动应用进行深度定制,体验较差。2. 品牌就是体验用户体验越来越成为用户是否下单的关键要素,个性化服务体验是其中非常关键的因素之一。大规模的个性化功能实现是非常挑战和困难的:今天大多数终端个性化呈现都是商家手动配置的。弊端非常明显 – 人工工作量大、效果差、伪个性化、无法及时响应用户需求。3. Channel-less vs Cross Channel消费者希望在线上、线下渠道都可以购买该品牌的同一个商品,并且能够享受高度一致的用户体验和服务。为了给消费者提供一致性的良好体验,构建强大的分布式订单管理系统是许多品牌的首要任务。4. 敏捷性品牌商和零售商需要能够快速投放商品进入市场试错。新产品如何才能快速同步线上线下推向市场,并且响应市场需求变化?传统电商方案的平台搭建是一项艰巨的任务,需要大量的自定义代码,花费数月时间(甚至更长)和巨大的财务支出来实施。即便如此,有时也很难满足业务快速部署和调整的需求。面对以上挑战,我们需要一个全新的零售策略和支持这个策略的电商云解决方案 - SAP Upscale!SAP Upscale和传统本地部署的电商解决方案相比,有哪些优势?1. Upscale极大地简化了传统电商的数字化转型之路,开启了基于速度和敏捷的新时代。从商家tenant的创建到上线,只需要几天到几周的配置时间。2. Upscale专为移动消费者量身定做,包含移动端原生iOS、Android应用和PWA应用(Progressive Web App, 渐进性网页应用, 一种新的网页开发技术)。Upscale模糊了渠道之间的界限,使线上或者门店购物变得轻松有趣。3. Upscale内嵌的AI功能可以自动帮助商家为每个用户提供个性化服务,真正做到“千人千面”。4. 通过提供优秀的用户体验和个性化、线上线下一致性服务,商家将会从中得到最大化的收入和利润。快速部署 & 灵活响应市场动态Upscale深深刻着零售DNA的烙印,团队主要成员拥有数十年的零售行业领域知识的深厚沉淀。通过将传统的零售产品(Product)、品类(Category)管理经验和深度学习、人工智能的高效结合,Upscale模糊了传统意义上的三个独立学科:商品推销(Merchandising),个性化(Personalization)和分布式订单管理(Distributed Order Management)之间的界限。通过实时记录和分析用户在App上的每次点击、浏览、收藏等事件,结合历史销售订单、商品数据为每个客户提供最佳购物体验,同时为每个商家自动优化销售利润和收入。另外与大多数传统商务平台不同,Upscale使用最先进的微服务构建,一切都是API优先。商家可以根据自己业务和数字化转型的需求,灵活订阅和部署需要的前端应用和后端服务。在获得灵活快速的市场响应能力的同时,TCO(总体拥有成本)将会明显下降。The MobigramMobigrams是基于AI的1对1个性化商店应用。我们的目标是:1. 为每一个终端用户提供自动化的个性化服务,真正做到“千人千面”;2. 为每一个零售商或者品牌商自动化地优化收入和利润。每个消费者打开App都有自己独特的Mobigram,在消费者整个浏览商品和下单购物的过程中,App会通过后端AI实时计算的结果,为每个用户动态组装个性化的产品集合、品类、内容等模块。AI实时计算考虑的变量包括但不限于零售商想要销售的产品,产品库存位置,库存可用性等。使用AI和深度学习技术来平衡零售商的需求(出售库存,利润率,产品周转速度和曝光度)与客户的体验(访问速度,便利性,产品相关性,购物愿望),从而推动能为零售商或品牌商带来最大利润的客户体验。目前Upscale在3个领域已经上线的AI功能:Continuity CommerceSAP Upscale Commerce具有内置的AI预测订单连续性引擎,可自动甄别潜在可能从单次商品购买转换为连续性订单的客户。比如,用户以相对固定的周期购买某一品牌洗发露,那么系统可以识别此类购物行为。Upscale会向此类客户自动发送邀请,用户只需要在邀请里面点击一下购买,那么就可以立刻加入Continuity Program。商家将会在未来按照用户喜好的周期,定期的自动递送该商品给客户)。 对于客户而言,这意味着他/她们“永远不会买不到”喜欢的产品,也不会因为疏忽而遗忘购买某些商品。在这个过程中,用户自然也成为了该品牌最忠实的会员。对于商家而言,科学和准确的预测潜在购买需求有了有效的输入, 从而可以进一步研究和实现库存自动管理优化。延伸阅读:Getting Started with Continuity Ecommerce, Part 1: Approaches, Expectationshttps://www.practicalecommerc…30分钟快速搭建一个SAP Upscale移动原生iOS应用本章节将会为大家简单介绍如何在30分钟快速搭建一个移动原生iOS应用。1. Upscale tenant订阅SAP Upscale为商家提供一键on-boarding tenant的工具,只需要提供tenant的名称、subDomain信息以及需要创建tenant的系统环境,后台就会为用户订阅专属的tenant。2. 移动零售应用配置完成了tenant的订阅,商家即可配置自己的电商移动原生应用。SAP Upscale Commerce为商家提供了工作台作为配置的界面,几乎所有跟搭建一个电商网店的相关工作都可以在这个界面完成,其中:Configuration该部分包括一个电商应用所需的最基本配置,比如库存(仓库或者门店)、收款、税务、发货、用户账号管理、客户服务、订单管理(取消、退货)等。产品、产品与品类的关联关系,库存初始化信息等相关工作我们都是通过后台作业来执行。商家准备好产品CSV文件,可以配置周期性或者一次性作业来导入主数据。Upscale提供非常灵活的字段匹配、自定义属性的功能来帮助客户完成主数据集成。另外一个基本配置是App,商家可以在这里配置原生App(iOS,Android)以及PWA等应用,并且可以按照商家的策略,关联同样或者不一样的用户体验配置。Inventory作为Channel-less的电商解决方案,线上线下库存透明化是基础。在该配置目录下,商家可以看到全局库存、单品库存以及库存调拨等功能。EditionEdition是一组对象组合,包括产品品类(Category)、单品(product)以及AI自动推荐的Trend category。这些对象在一段时间内可用并在特定渠道上供消费者购买,例如2017年秋季Edition。商家可以灵活的配置多个Editions,并按照自身策略激活发布其中一个,关联到一个渠道然后开放给消费者。Experience用于定义一个App的布局、模块和模板。Upscale提供基于模板的一键生成功能,商家只需要按照自己业务需求一键生成默认的experience,所见即所得。然后根据自己品牌的风格,变更配色、logo等主题,即可关联edition来搭建原生应用。3. 全渠道用户体验完成以上配置后,商家即可部署App到应用商店供用户或者门店使用。全渠道的用户体验让客户能够在任何地方购物,并且真正得到全渠道个性化体验。下图是通过Xcode 模拟iPhone应用的一个截图:我们可以看到,每个客户拥有自己量身定制的个性化界面,系统会动态清除客户不喜欢的内容和产品,改变商品推销的内容和方式,引导客户进入跟自身最贴切并且最容易下单购买的类别。用户得到最佳体验的同时,Upscale也能最大限度地提高零售商的收入和利润。Upscale支持的应用平台有:Mobile App – iOS & AndroidMobile Web (PWA)Tablet (PWA)Desktop (PWA)Kiosk & In Store通过本文对SAP Upscale Commerce的基本介绍,相信大家应该对于这款SAP全新的SaaS电商云解决方案有了初步的了解。限于篇幅,如果有任何问题和更多的兴趣,欢迎讨论,感谢阅读。要获取更多Jerry的原创文章,请关注公众号"汪子熙": ...

February 24, 2019 · 1 min · jiezi

理解IaaS, PaaS, SaaS等云模型 (Cloud Models)

参考:SaaS vs PaaS vs IaaS: What’s The Difference and How To Choose参考:怎么理解 IaaS、SaaS 和 PaaS 的区别?知乎如何快速记忆区分这几个名字?秘诀:只要记住几个首字母即可:包括I,P,S. 其中I-Infrastructure; P-Platform; S-Service. 后面的话都是统一的aaS,即"as a service"。后面这个不重要,换成"as a product", “as a f__”, “business"什么的,都无所谓。为什么要提到记忆问题?因为如果不先在脑子里区分这几个单词,那么即使看过类各自代表的意义,第二天也会忘的一干二净。记住了名字后,我们先要知道这几个东西是在说什么。IaaS, PaaS, Saas, 都是Cloud Models,即云端项目的模型。如果你要组成一个在线运行的云项目,必须具备很多组件,如硬件的CPU、硬盘,软件的OS系统,HTTP服务器,数据,应用程序等等。根据app需求,它们的搭配运作肯定是你指定的,也就是“固定”的。但问题是,各个组件谁来提供?谁来管理?根据各个组件的提供和管理者的不同,就划分出了不同的Cloud Models。简单来说:On Premises: 全部自己管。自己买电脑主机,集群,自己装系统装软件,自己更新运维所有Bug。IaaS: 我们就称它为硬件服务。商家负责所有硬件部分,你负责所有软件部分。你只需要按期给钱,剩下硬件问题如硬盘坏了风扇不转了,都不需要你管。PaaS: 我们就称它为平台服务。商家负责绝大部分,你只需要写app的代码和管理自己的数据库。其它比如OS系统漏洞补丁,网线断了,主机散热什么的,都不需要你管。你只需要按月给钱就行了。SaaS: 我们就称它为全套服务。这下好了,连代码都不需要自己写,数据也不用自己找,商家全给足了!你只需要配置下名字,改个Logo,选自己喜欢的功能就够了。其它软件硬件维护更新找Bug,全都不是自己事。比如在线财务报表软件,比如Wordpress博客。这些很好理解。真正用起来,就针对不同的项目不同的细节了,这里不多说。下面就说说各自的特点。各个云模型特点IaaS (硬件服务)相当于让你租硬件。优点:轻松扩容用户可以完全控制和定制硬件设施案例:一般是VPS云服务器提供商。DigitalOcean, Linode, Rackspace, Amazon Web Services (AWS), Cisco Metapod, Microsoft Azure, Google Compute Engine (GCE)PaaS (平台服务)相当于让你租硬件和系统级软件。优点:高可用,轻松扩容轻松移植大量减少代码量用户可以专心构建自己的业务应用,不用被杂事干扰案例:一般是具体的云服务提供商。AWS Elastic Beanstalk, Windows Azure, Heroku, Force.com, Google App Engine, Apache Stratos, OpenShiftSaaS (全套服务)相当于让你租软件硬件全团队服务,你只是个给钱的土豪甲方。优点:自己什么都不用管理维护全网可以访问可以集中管理案例:一般是完整的云应用。Google Apps, Dropbox, Salesforce, Cisco WebEx, Concur, GoToMeeting ...

January 31, 2019 · 1 min · jiezi

使用简单的Java代码在SAP C4C里创建销售订单

需要创建的销售订单的明细通过硬编码指定:比如销售订单的描述为Jerry Test 2019-1-23 16:05PM执行之后,看到Status Code 201,说明创建成功:到UI上能看到成功创建的销售订单:实现代码:package odata;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.net.URI;import org.apache.http.HttpEntity;import org.apache.http.HttpHost;import org.apache.http.HttpResponse;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.HttpClient;import org.apache.http.client.config.RequestConfig;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.entity.StringEntity;import org.apache.http.impl.client.HttpClientBuilder;public class SimpleOrderCreator { private final String SERVICEURL = “https://my5000jerry.c4c.saphybriscloud.cn/sap/c4c/odata/cust/v1/zjerrysalesorder/CustomerQuoteCollection"; HttpClient m_httpClient; private HttpClient getHttpClient() { if (this.m_httpClient == null) { this.m_httpClient = HttpClientBuilder.create().build(); } return this.m_httpClient; } private String getCSRFToken(){ final HttpGet get = new HttpGet(SERVICEURL); get.setHeader(“Authorization”, “Basic 0FOR0pFUlJZMTpTYXB0ZXN0MQ==”); get.setHeader(“x-csrf-token”, “fetch”); HttpHost proxy = new HttpHost(“proxy.sha.sap.corp”, 8080, “http”); RequestConfig config = RequestConfig.custom().setProxy(proxy).build(); get.setConfig(config); HttpResponse response; String token = null; try { response = getHttpClient().execute(get); /Header[] header = response.getAllHeaders(); for( int i =0; i < header.length; i++){ System.out.println(“Header: " + header[i].getValue()); }/ token = response.getFirstHeader(“x-csrf-token”).getValue(); System.out.println(“token: " + token); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException | UnsupportedOperationException e) { e.printStackTrace(); } return token; } private void createSO(String token,String body) { final HttpPost post = new HttpPost( URI.create(SERVICEURL)); post.setHeader(“Authorization”, “Basic 0FOR0pFUlJZMTpTYXB0ZXN0MQ==”); post.setHeader(“Content-Type”, “application/json”); post.setHeader(“X-CSRF-Token”, token); HttpEntity entity = null; try { entity = new StringEntity(body); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } post.setEntity(entity); HttpResponse response = null; try { response = getHttpClient().execute(post); } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(“Response statusCode for Batch => " + response.getStatusLine().getStatusCode()); } public static void main(String[] args) { SimpleOrderCreator tool = new SimpleOrderCreator(); String token = tool.getCSRFToken(); String body = “{” + “"Name": "Jerry Test 2019-1-23 16:05PM",” + “"TypeCode": "2059",” + “"BuyerID":"ee",” + “"PartyID":"60102", " + “"CustomerQuoteText":[{” + “"Text": "test comment by Jerry Wang", " + “"TypeCode": "10024"” + “}],” + “"CustomerQuoteItem":[{ " + “"ProductID": "1042416"” + “}],” + “"CustomerQuoteItemProposal":[{” + “"ProductUUID": "00163E72-09C6-1EE8-BBDC-AC5F0CB0D795",” + “"Quantity": "1",” + “"unitCode": "EA"” + “}]” + “}”; tool.createSO(token, body); }}要获取更多Jerry的原创文章,请关注公众号"汪子熙”: ...

January 31, 2019 · 2 min · jiezi

在共享网盘关闭之前搭建自己的私有云—Nextcloud (图文教程)

背景:360网盘在16年停止个人服务,百度云严重限速,很多资源被和谐,将小电影替换成8秒教育片。还有一些隐私安全问题,个人比较关注。一直以来都不相信国内的那些云服务提供商,尤其是李彦宏说“愿用隐私换方便和效率”后。中国人不是对隐私不敏感,而是在这个局域网里没办法。由此搭建个人云盘的想法产生。在查阅了一些资料后最终选用Nextcloud 程序来搭建私有云。NextCloud是一款私有网盘存储,可用于个人和团队协作多台共享,完全开源并且免费,用户能够完全掌控自己的数据。搭建方法有两种,可以一键安装,比较省事。也可以手动安装,根据个人情况选择。一键部署NextcloudVultr 是支持Nextcloud一键安装的1. 创建vps参考:最新Vultr注册及vps购买(图文教程)!!!Server Location:选择机房 洛杉矶、纽约、新加坡等自选;Server Type :选择系统 默认centosApplication :选择Nextcloud;Server Size: $5/mo包含25G SSD硬盘,$10/mo是40G,按需选择。其他选项默认。点击右下角“ Deploy Now ”开始创建,等待服务器创建完成。点击详情页面下方会列出Nextcloud的登录信息:登录地址、用户名、密码。记下来。此时Nextcloud 就搭建完了。2. 使用Nextcloud在浏览器输入登录地址,填写账户名和密码登陆后是一个欢迎页面,Nextcloud 可以在浏览器中使用,也可以安装客户端,支持Win、Mac、Android、iOS、Linux 全平台。点击web访问,来到主页,附带了几个示例文档、图片、视频和PDF,点击即可在线查看/播放。共享设置右上角有设置、应用和用户管理等选项。设置:账户管理、安全、隐私、分享设置等; 应用:插件商店,包括日程表、To-List、Office、思维导图、流程图、阅读器、云笔记……各种插件一应俱全; 用户:添加/管理多用户,家庭成员或公司多人使用。手动搭建NextcloudNextcloud 运行是需要服务器环境支持的,所以要先安装运行环境。上面的一键安装只是服务器在创建过程中自动安装了运行环境,而有些服务器商官方是不支持一键安装Nextcloud的。这里我选用的是LNMP 组合即:(Linux+Nginx+MySql+Php),小白可以使用宝塔面板来安装环境,可视化操作更容易些。参考:宝塔面板一键安装教程!!!1. 创建 VPS机房自选;系统 CentOS 7×64;配置内存建议最少 1G。2. 安装网站环境使用宝塔面板安装 LNMP 网站环境,PHP 选择 7.0 版本。安装完成点击设置,安装扩展,把这几个扩展安装好3. 安装 Nextcloud点击网站——添加站点有域名的填域名,没有域名就直接填你服务器的 IP就行,然后把数据库信息记录下来到 Nextcloud 官网下载安装包打开宝塔点击文件来到刚才创建的站点目录把默认的四个文件全部删除,点击上传,添加文件上传下载好的安装包解压安装包打开解压完的目录,全选文件剪切,再返回网站根目录粘贴把所有文件粘贴到网站根目录后基本上就完了访问你的域名或者 IP 把创建站点时记录的数据库信息对应填入,连接数据库后云盘就搭建成功了…博客:Mr96.me——玖六先生的自留地

January 26, 2019 · 1 min · jiezi

企业领导人给云原生工具寻宝者的专业提示

作者:R.D. Danes本文是作为Orate项目的一部分编写和制作的,该项目帮助组织讲述技术故事云原生生态系统如此繁盛地增长,企业是否幸运?一整套精心打造的工具正在朝他们扩展。实现基础架构和应用程序现代化的手段触手可及。问题?他们迷失在一堆可能适用于某些组织的工具中,而不是他们自己的。在上个月在华盛顿州西雅图举行的KubeCon + CloudNativeCon北美2018年会议上,企业领导人聚集在一起分享从这一系列中挑选最佳工具的技巧。有一个题为“避免云原生态景观中的杂草”的小组讨论,聚集了四位在企业IT战壕中辛勤工作的专业人士。主持人Priyanka Sharma是GitLab负责联盟的主管,也是OpenTracing项目的贡献者,她从小组成员的头脑中寻找云原生工具的技巧。他们在采购、尝试、返回和交换工具方面分享了现实世界的成功和失败。为什么云原生?对于涉及云原生的IT团队而言,两个坚实的规则在讨论中脱颖而出:1)预先进行彻底的研究,并且2)毫不犹豫地放弃一个没有成功的选择。在开始囤积工具以解决所有应用程序性能问题之前,请确保对可能性进行实际检查,CVS Health的PaaS和配置管理IT主管Melissa Chapman提供建议。“如果你有一段糟糕的代码或一个糟糕的应用程序,而你认为一个工具会修复它,你就错了。”她说。企业需要将自己的最终目标放在首位。为什么云原生?他们想加快应用程序开发和部署吗?给他们的开发者更多的空间来冲动创新?提高DevOps团队的敏捷性?他们是否真正了解云原生技术如何帮助他们实现这些目标?“工具是达到目的的手段,”T-Mobile平台架构总监Brendan Aye说。“你不会看到华尔街日报关于一些公司推出伟大工具的文章。”随着围绕新技术的所有宣传,人们很容易忘记它只在改善业务成果方面才有用。一个企业的奇迹可能会在另一个企业中失败。它可能与旧技术不兼容,或者工作人员可能缺乏使用它所需的技能。也就是说,选择有用的工具,并不完全取决于试验和错误。公司当然可以定义目标,并建立工具必须满足的标准,然后才进行测试。介绍非官方的AEIOU云原生标准组织谁记得学习元音?Delta Air Lines的高级系统工程师Jasmine James和她的同事重新调整了旧的“AEIOU”歌曲。他们把它变成了一个缩写,并用它来确定云原生工具的大小。 它是这样的:适用性(Applicability)、企业就绪(Enterprise-Ready)、集成(Integration)、开销(Overhead)和效用(Usefulness)。Jasmine说,最重要的因素是效用。即使其他企业在使用工具方面取得了很大的成功,Delta也不会抓住它,直到确定它可以从中获取一些效能。“我们希望确保你能够以正确的方式实际地使用它们。”用例治疗转化焦虑症根据一些明确定义的用例,最容易确定效用。企业知道问题,知道过去没有用的东西,以及最终可以解决的问题。Lyft软件工程师兼CNCF项目Envoy的创建者Matt Klein表示,以渐进方法采用云原生技术和现代化应用程序要比沸腾海洋(boiling the ocean)更加明智。“我真正推荐给每个人的旅程,是真正考虑面临的问题,并尝试逐步进行。就像,没有Big Bang解决方案,”他说。“采用单一技术不会在一夜之间改变业务,但单一工具可以大大改善一个用例或应用程序。像这样的一系列简单步骤最终可能会导致业务转型。”尝试,失败,继续尝试如果工具不起作用怎么办?如果这是一场彻底的灾难怎么办?容易,扔掉它,并尝试新的东西。“任何一个用例都有几十种工具,”Aye说。“也许CNCF的项目Prometheus 1.0在你的公司中失败了,但Prometheus 2.0可能会提供第一个版本所缺少的一切”。Melissa同意快速迭代是找到最适合云原生工具的皇家之路。CVS希望将其收据数字化,以便客户可以在智能手机上查看它们。它尝试了云原生技术,失败了,继续尝试,并最终成功。“我们从一些我们认为会帮助我们的工具开始,但没有效用,”她说。“所以我们很快就转移了,但最终变得非常棒。”要集成,还是不集成?当一家公司最终找到适合它的工具时,很快就会意识到有太多的工具需要管理。然后怎样呢?它应该选择将功能集中在一起的工具吗?“也许不是”,Brendan说。“我不想点名供应商,但是现在有一些日志工具开始集成指标,和一些指标工具开始集成日志记录,我觉得这是一个好方法对两边做坏事。”最好的点解决方案通常比平庸的混合方案更可取。云原生生态系统需要集成工具,以便在不削弱其功能的情况下进行更容易的管理。我们将可以在5月CNCF再次在西班牙巴塞罗那召开的KubeCon + CloudNativeCon EU 2019(CFP提案征集截止日期为太平洋标准时间2019年1月18日)看到多大进展。2019年KubeCon + CloudNativeCon中国论坛提案征集(CFP)现已开放KubeCon + CloudNativeCon 论坛让用户、开发人员、从业人员汇聚一堂,面对面进行交流合作。与会人员有 Kubernetes、Prometheus 及其他云原生计算基金会 (CNCF) 主办项目的领导,和我们一同探讨云原生生态系统发展方向。2019年中国开源峰会提案征集(CFP)现已开放在中国开源峰会上,与会者将共同合作及共享信息,了解最新和最有趣的开源技术,包括 Linux、容器、云技术、网络、微服务等;并获得如何在开源社区中导向和引领的信息。大会日期:提案征集截止日期:太平洋标准时间 2 月 15 日,星期五,晚上 11:59提案征集通知日期:2019 年 4 月 1 日会议日程通告日期:2019 年 4 月 3 日幻灯片提交截止日期:6 月 17 日,星期一会议活动举办日期:2019 年 6 月 24 至 26 日2019年KubeCon + CloudNativeCon + Open Source Summit China赞助方案出炉啦

January 18, 2019 · 1 min · jiezi

浅谈SAP Cloud for Sales 自动化

在Jerry还在本科进行计算机理论知识学习时,我曾经把软件开发里的质量工程师(Quality Engineer)理解成是每天只是简单地做着运行开发人员编写好的软件,如果发现问题,通知开发人员去修改这种机械的体力活。后来进入SAP后,观察团队里的质量工程师每天做的事情,才知道我当初简直是很傻很天真。我的两位同事,姚瑶和郑晓霞,之前已经就她们在SAP质量工程师这个岗位上工作的一些体会做了分享:SAP成都研究院姚瑶:软件质量保证工作的变迁SAP成都研究院郑晓霞:Shift Left Testing和软件质量保证的一些思考今天,由Jerry的另一位同事,Tang Minna继续给大家带来SAP标准产品质量控制方面的分享。*大家好, 我是唐敏(Minna Tang),目前是SAP成都研究院C4S(Cloud for Service)团队的质量工程师。除了本职工作以外,我喜欢烹饪苏菜——少了川菜的热烈与厚重,却多了一份自然与纯真;喜欢在图书馆里拜读名人传记——看尽红尘故事之后,静静地感受时光的流逝;闲暇时也喜欢尤克里里——跟随跳动的音符,感受人生的起起落落。今天我想基于目前C4S产品的现状和自身的技术背景,简单聊聊自动化这个动人心魄、让人又爱又恨的话题。相信任何一个软件开发团队的每位成员,听到“自动化”一词,都会抱有热烈的期待。对于老板来说,这个词意味着成本的下降及更高的ROI(Return On Investment,投资回报率);从开发工程师的角度,自动化有助于更早地检测到代码变更对原有功能的影响;测试工程师当然是全力支持自动化的,因为省心和省力;产品经理自然也不会拒绝自动化,因为它能够带来更高效的交付和更快速的迭代。然而,我们身边也不乏自动化实施失败的团队。2013年在我前一家工作的公司里,我曾参与某核心系统项目的开发工作,这个业务系统从需求到完整上线共耗时一年半,核心功能的开发更是耗时大半年之久。面对如此庞大的业务测试成本和强需求,PMO(Project Manage Office)在项目开发之初就启动了自动化测试需求,然而在业务功能不稳定,产品需求、开发与测试基本属于赶工状态的情况下,与人工回归相比,自动化所带来的收益基本微乎其微。所以选择适当的自动化时机和策略,是自动化成功与否的重要因素之一。众所周知,SAP众多产品都在使用自研的ABAP进行开发。当我加入SAP后,我了解到这些运行在ABAP Netweaver之上的产品,均有完备的自动化测试。对于ABAP后台功能代码,主要是开发人员为核心功能编写完备的,覆盖率高的单元测试,然后用事务码SUT调度成后台作业定期执行,如果自动化测试执行时发现故障,会自动发邮件通知相关人员。前台UI代码,无论是原生的Fiori应用还是CRM Web Client UI这种加了一层皮肤的类Fiori应用,都能通过Selenium来进行UI的自动化测试。当然,SAP成都研究院也在进行众多基于微服务架构的云产品开发,主要使用Java编程,那么自动化测试的实现也更加容易,Spring系列框架里有大量成熟和流行的自动化测试套件可供使用。从迭代发布的角度讲,C4S产品的发布周期为一个季度一次,每个季度中有三个周期:前两个周期主要完成新功能开发,第三个周期需要团队成员既完成新功能测试,也需要回归系统原有功能。与此同时,每个季度中还有5次补丁的发布,每一次都需要完成原有业务的回归测试。夹在产品新特性测试和回归测试之间的,是一望无际的工作量和对高效率、高质量测试的需求。我为所在团队负责的功能制定的自动化的策略是: 接口 + UI自动化覆盖。也许您会问,作为一个请求的最前端,既然UI的测试都能覆盖了,那自动化测试为什么还需要接口的覆盖?工作量是否存在重复?从功能的角度来讲,确实有些重复。但从收益的角度来讲,对接口的自动化测试进行投入,收益远超成本。1. 对于任意一个系统,接口的稳定性在整个系统中的重要地位不言而喻。相对于后置的E2E(端到端)测试,接口测试能够从基础层减小变更对整个应用及下游业务调用方的影响范围。2. 同时,接口的测试也能为UI自动化实施提供基础数据。UI自动化为了完成某个场景的测试,通常会有很多前置业务数据的依赖。这些UI自动化需要的测试数据如何生成?有同事建议可以提前手工造数据。如果自动化测试的数据都要依靠手工来维护,在我看来,这个自动化不要也罢。通常,在接口测试完成之后会将已测试通过的接口封装成工具类,供后续UI自动化的工程化调用,这样既减少了UI自动化的数据依赖,对接口测试通过率也提出了更高的要求。所以一般的接口工程必须100%通过,才能完成触发后续UI自动化的作用去执行功能测试。3. 为性能测试准备打下坚实的基础。通常准备性能测试之前,接口测试的响应时间会成为反馈接口性能的重要依据。我们在制定接口性能的SLA(Service-Level Agreement)时,其基本数据来源就是接口测试。而很多互联网公司,相对于端到端的响应时间,他们更注重接口的响应时间,因为接口更底层。尤其针对多层接口依赖的系统,每年 618,双11之前的线上大促压测,接口全链路测试必定是重中之重。我在C4S推荐使用的接口测试框架为Spring + Maven + Testng,语言为Java, 被测对象为C4S oData服务提供的HTTP API。其中Spring框架主要负责通过注解方式完成对象注入,Maven负责工程结构和Jar包管理,Testng负责具体的测试工作。对于不熟悉Java的朋友来说,借助现有工具诸如Postman也能很好地胜任这项工作。1. 工程结构及说明接口主体工程以Maven规范工程为模板,所有的代码和相关资源文件均放置在src/test目录下。工程模块主要分为4部分:测试代码、枚举对象、工具类及相关资源文件。测试代码:这是测试代码的主要存放目录。 通常根据业务的不同,我们将每一个接口的测试案例按照业务测试和参数测试分别编写。所谓业务测试,是指测试案例中涉及业务规则的部分。比如,某接口中存在一个channel(渠道)字段。业务规则定义:当channel为all时,创建全渠道使用的数据;当channel为特定值时,创建的数据只能适用于特定的场景。则业务测试的案例有2个:o Channel = allo Channel = 特定数据参数测试:主要测试接口参数字段是否为必填项。比如,某接口中存在一个channel为必填字段且必须为指定枚举类型字符串,当传入接口为null或blank或非枚举值时,框架返回HTTP 400参数错误,同时提示错误信息。此时参数测试案例有3个:o Channel = nullo Channel = “”(blank)o Channel = “XXXX”(XXXX为非枚举值)枚举对象:此部分是将业务中经常用到的固定参数使用枚举的方式列出,方便整个工程使用。见下图中httpEnum文件夹中的类。工具类:包括基本工具类和业务工具类部分。业务工具类是将特定接口进行封装,方便下游接口调用使用。资源文件:包括Spring相关配置,properties文件以及参数测试中的数据来源文件等。2. 案例编写此处以实现oData的SocialMediaActivity 接口的自动化测试为例来进行说明。我们借用颜值大师——李晓刚老师画的图来大致了解SociaMediaActivity在C4S微信集成架构中的作用:由上图所知,C4S通过暴露SocialMediaActivity接口来方便Agent调用。在C4S和Social Media集成的相关场景中,用户可以通过关注微信公众号来绑定一个特定的BusinessPartner(以下简称BP), 从而达到通过用户在系统中自定义的微信Channel来直接与C4C服务模块中的工作人员直接交互的目的。而Activity是针对指定的BP所进行的活动,例如创建ticket,点赞,回复等。故而完整的业务流程如下:获取系统token获取已关联的BP信息创建ticket信息评论/点赞/回复操作 数据清理BeforeClass: 执行获取token的准备工作。BeforeMethod: 创建/获取已关联的BP信息。Test: 特定业务的测试案例。本处对Activity的层级和操作内容进行检查,因此有2个测试方法。AfterMethod:清理已创建的Activity。此处需要重点说明是,为避免后台错误数据对应用正常使用的影响,每一次执行都需要对增量数据进行清除处理,保持环境干净整洁。AfterClass: 清理创建的BP信息。3. CI(Continuous Integration, 持续集成)基于Maven工程的集成,本例中使用Jenkins进行示例,与此同时项目工程中需要使用surefire-plugin(一个用来执行测试用例的Maven插件)来配置相关的测试案例范围。在pom.xml中配置testng.xml文件:testng.xml文件内容示例:使用Maven的好处再次体现,只需要简单配置即可使用:在Jenkins中加入testng report plugin展示,然后build即可。虽然我更擅长使用基于Java的Selenium这个UI自动化框架,也明白接口测试完成之后,对UI自动化的巨大帮助,但由于C4S在印度和美国团队内都使用现有的成型产品SAHI,所以这里我只介绍SAHI在C4S的应用。SAHI是Tyto Software旗下的一个基于业务的Web应用自动化测试工具, 通过注入 JavaScript来访问 Web 页面中的元素。相对于Selenium等自动化测试工具,SAHI在动态 ID元素查找和隐式页面等待处理等方面具有一定的优势。感兴趣的同事可前往官网进行尝试。1. 工程结构及说明此处以Social 案例为例:DD_CSV: 案例运行的的数据来源Function_Library: 该目录中存放已封装的基本共用函数,如登录、登出、工作中心访问、表格访问等。更加细致的封装则是将页面元素抽象到Library中的IDS下,便于统一管理, 如下图:SCRIPTS:特定的UI测试案例。SUITE:测试案例运行的范围。2. 案例编写此处以RUI项目中SingleTab功能为例进行说明。MultiTab和SingleTab功能是指在C4S产品中,当用户在全屏模式下打开某一个或多个工作视图时,系统会将多个工作视图以Tab的形式显示在工作区中;但是当用户修改浏览器大小到一定尺寸后,工作区中将只显示活动的那个Tab。 MultiTab显示时,有活动与非活动Tab之分,同时要适配多个Tab的鼠标操作切换和通过功能菜单的切换。如下图所示:SingleTab显示:只显示当前活动的Tab,在显示数据和形式上与MultiTab有差别,同时也要适配通过功能菜单的Tab切换。与此同时,该特性需要测试系统在不同的主题、字体大小下此特性也能正常工作。因此测试案例的流程如下(可参考代码注释部分): (1) 重置相关特性:浏览器大小,主题,字体大小,视图类型,页面默认过滤器(2) 访问特定的工作视图并显示特定数据,验证全屏模式下活动状态的/非活动状态的MultiTab的显示和Tab上数据的正确性(3) 缩小浏览器大小:验证Tab上数据正确性修改系统主题,验证SingleTab的显示修改字体大小,验证SingleTab显示3. CI集成基于Jenkins的强大的插件功能,C4S通过将Jenkins与GTP(内部缺陷管理平台)的集成完成CI调度和运行。UI自动化的CI集成,使得C4S产品的回归测试的效率大大提升。以今年8月份发布的版本为例,手工回归的测试案例目前已接近7000个。如前文所述,诸多的测试案例在每个迭代中持续的回归测试,则是一项耗时又耗力的工程。而且这仅仅只针对回归测试所执行的案例。从手工回归测试案例的数量不难看出,快速反馈系统功能状态机制在持续交付链中的重要性。而在对接口进行全覆盖测试之后,对UI自动化覆盖回归测试主流程的需求也愈加强烈。在C4S,我们借助Jenkins 并行测试完成UI自动化,并使用邮件通知测试结果。在节省人工回归成本的同时,使得产品管理团队能够在短时间内快速、全面了解系统功能的运行情况,并给与团队成员质量的信心。与此同时,在出现模块功能失效甚至是系统宕机时,这种快速反馈链的建立为开发人员尽早尽快修复问题争取了时间,减少了后续修复的时间成本。就目前的测试覆盖需求而言,由内到外的接口覆盖及端到端的UI覆盖,在满足底层稳定可靠的同时,也保证前端功能的可用性。对于SAP质量工程师而言,工作内容远非测试工作这一项内容,从团队成员质量意识的提升到单元测试覆盖及检查;从测试工作到团队质量反馈,都是SAP质量工程师在每日工作中需要去花心思琢磨的。而从团队利益着手,考虑每一项质量活动的价值和意义,对质量工程师来说是一项全局观的考验,也是一场质量与效率的平衡。以上就是我今天关于C4S自动化的分享,如有疑问或进一步探讨,欢迎联系我们,感谢阅读。相关阅读SAP成都研究院姚瑶:软件质量保证工作的变迁SAP成都研究院郑晓霞:Shift Left Testing和软件质量保证的一些思考要获取更多Jerry的原创文章,请关注公众号"汪子熙": ...

January 15, 2019 · 1 min · jiezi

KubeCon西雅图:2018年以顶尖的云原生社区活动来结束!

作者:Natasha Woods随着KubeCon西雅图的闭幕,这是我们迄今为止最丰富的节目中所有云原生优点的快照。 门票售罄的KubeCon + CloudNativeCon北美2018是在过去的CNCF活动中拥有最多的出席和等待名单,来自世界各地的8000多名贡献者、最终用户、供应商和开发者,在华盛顿州西雅图聚会超过三天,以进一步推动教育和采用云原生计算,并围绕这个快速发展的生态系统分享见解。现场有8,000人参加,另有2,000人在等待名单上体验重大的FOMO,他们观看直播主题演讲并阅读Twitter推文,KubeCon西雅图出席人数比去年在奥斯汀举办的KubeCon活动增加了83%。在与会者人数增加的同时,伟大的“开发者会议”体验保持不变!看到这个社区的发展速度真的令人兴奋。 如果你错过了展会上的巨大职位公告板 - 市场正在招聘!KubeCon西雅图的女性在为期三天的主题演讲中,女性是前沿和中心,我们听到了从KubeCon联合主席Liz Rice关于CNCF社区更新,及我们的一些项目维护人员 - 包括Microsoft的Michelle Noorali关于Helm更新;Lyft的Matt Klein关于Envoy更新;以及Google的Aparna Sinha有关Kubernetes增长概述。所有主题演讲中有40%来自女性,云原生女士们正在登台演出!KubeCon联合主席Janet Kuo解释Kubernetes的“无聊”是一件好事,Liz Rice以她在Aqua Security的角色在另一个主题演讲中强调安全的重要性,她说,“CNCF不会在这里抛出眩光事件,但是为了帮助我们作为一个社区进行协调,并确保我们有适当的治理,并使得更难将权限交给一些随机的人,这一点很重要,因为越来越多的公司依赖开源技术。良好的治理是如何作为一个社区,使我们可以从安全攻击中拯救自己。”在压轴的主题演讲,Kelsey Hightower在他的无服务器主题演讲向惊人真实隐藏低调的女性,他的母亲和Motown Diana Ross女王,发出了呐喊。最终用户主题演讲和会议担当技术领导角色的杰出女性也出现在重要的“如何在企业中获得成效”的主题演讲和会议中。Airbnb软件工程师Melanie Cebula发现了使开箱即用的Kubernetes对开发者不那么友好的一些关键问题。她还根据Airbnb的经验,制定了解决这些问题的10项策略,使1000名工程师能够大规模开发数百个Kubernetes服务。Uber的Celina Ward和Matt Schallert分享了他们为独特的状态工作量创建operator的经验。 他们讨论了思想的重大转变,并为观众提供了一个框架,用于使用Kubernetes原语来表达他们的有状态的工作量,以及在不过度设计解决方案的情况下,编写创新抽象概念的建议。Capital One宣布他们对社区的更多承诺,通过升级并成为CNCF金牌终端用户会员!其他最终用户分组会议和展位展品包括:Home Depot、Nordstrom、Lyft、Buffer、密歇根大学、诺基亚、T-Mobile、三星SDS、雅虎日本公司、BlackRock、AT&T、今日美国网络、Two Sigma等等!建立一个强大而多样化的社区!在一方面,KubeCon西雅图有这么多女性演讲者是一个巨大的进步;另一方面,也有许多活动汇集了云原生社区的多样性,包括速度网络联系和指导、多样化午餐、通过Meetup和KubeCon参与者奖学金建立社区的会议。CNCF的多元化计划为来自传统上代表性不足,和/或边缘化群体的147名受助人,提供奖学金,以参加KubeCon西雅图!西雅图的30万美元投资 - 在会议中投资在多元化最多 - 来自由CNCF的大部分捐款,以及奖学金赞助商Aspen Mesh、MongoDB、Twistlock、Two Sigma和VMware。包括西雅图在内,CNCF在过去两年中提供了超过485个多样性奖学金参加KubeCon。CNCF也与Kubernetes辅导计划合作,为学员在KubeCon提供交流机会。KubeCon西雅图有66名导师和180多名学员参加了这个计划。奖励辛勤工作和奉献精神:连续第三年的CNCF社区奖,由VMware赞助,突出了所有CNCF项目中最活跃的大使和最优秀的贡献者。Top Cloud Native Committer - 在一个或多个CNCF项目中拥有令人难以置信的技术技能和显着技术成就的个人。2018年的得奖者是Jordan Liggitt。Top Cloud Native Ambassador - 具有令人难以置信的社区导向技能,专注于传播信息并与整个Cloud Native社区或特定项目共享知识的个人。2018年的得奖者是Michael Hausenblas。对于任何开源项目,都不可能忽视那些花费无数小时的时间来完成平常任务的人。这就是Chris Aniszczyk带回Chop Wood/Carry Water(伐木/挑水)奖项的原因。今年的奖项表彰了Davanum Srinivas、Dianne Mueller、Christoph Blecker、Nikhita Raghunath、Paris Pittman、Richard Hartmann、Tim Pepper、April Kyle Nassi、Jorge Castro、Babak “Bobby” Salamat、Reinhard Nagele、Zach Arnold、Kris Nova和Stephen Augustus的努力不懈。同场活动在会议的第0天(12月10日)举行了27场同场活动。有许多伟大的技术和社区建设会议,包括Linkerd在生产环境的101,Kubernetes贡献者峰会和第一个EnvoyCon!CNCF项目现况和由来许多CNCF项目都有公告、精彩的分组会议、快闪演讲、社区建设与维护者会面的机会,以及技术深入了解。Phippy加入CNCF家族!2016年,Deis(现在是微软的一部分)平台架构师Matt Butcher正在寻找一种方法,向技术和非技术人员解释Kubernetes。 受到女儿的多产毛绒动物系列的启发,他提出了“Kubernetes儿童图鉴指南”的想法。因此,诞生了Phippy,黄色长颈鹿和PHP应用程序,以及她的朋友。在会议第一天的主题演讲中,Matt和合著者Karen Chu宣布微软向CNCF捐赠了Phippy,并在现场阅读Phippy Goes to the Zoo:Kubernetes故事,作为Kubernetes儿童插画指南提供了官方续集。作为微软捐赠书籍和角色的一部分,CNCF已根据知识共享署名许可(CC-BY)许可所有这些材料,这意味着您可以出于任何目的重新混合、转换和构建材料,甚至商业用途。CNCF第3个快乐生日可能很难相信,我们所有的扩张性增长 - 今年CNCF成员数增加了110%,新增了169家成员 - 但CNCF仍然年轻。我们在本周与云原生社区庆祝了我们的第三个生日!MoPOP、Chihuly Gardens和Space Needle的所有参加者聚会在所有参与者聚会上,会议参观者体验了 Museum of Pop Culture(MoPOP)的魅力,Chihuly Garden and Glass的美丽以及Space Needle的景色。主题演讲和会记录现已推出所有演示文稿和视频均可供观看:会议的主题演讲和会议演示的幻灯片可从时间表中获得:会议详细信息包括演示文稿的链接和YouTube上的视频Youtube播放列表中的主题演讲和所有其他会议在Flickr上查找照片!谢谢你们!记下日期!立即注册参加KubeCon + CloudNativeCon 2019欧洲,计划于5月20日至23日在西班牙巴塞罗那的Fira Barcelona举行。 CFP现已开放,于2019年1月18日关闭。KubeCon + CloudNativeCon 2019中国,定于6月27日至28日在上海世博展览馆举行。 CFP将于本月晚些时候开放,于2019年2月1日关闭。KubeCon + CloudNativeCon 2019北美,定于11月19日至21日在加利福尼亚州圣地亚哥的圣地亚哥会议中心举行。CFP将于2019年5月6日开放,于2019年7月12日关闭。 ...

December 17, 2018 · 1 min · jiezi

Spring Cloud Config 规范

Spring Cloud Config 规范首先Spring Cloud 是基于 Spring 来扩展的,Spring 本身就提供当创建一个Bean时可从Environment 中将一些属性值通过@Value的形式注入到业务代码中的能力。那Spring Cloud Config 要解决的问题就是:如何将配置加载到 Environment 。配置变更时,如何控制 Bean 是否需要 create,重新触发一次 Bean 的初始化,才能将 @Value 注解指定的字段从 Environment 中重新注入。配置变更时,如何控制新的配置会更新到 Environment 中,才能保证配置变更时可注入最新的值。要解决以上三个问题:Spring Cloud Config 规范中刚好定义了核心的三个接口:PropertySourceLocator:抽象出这个接口,就是让用户可定制化的将一些配置加载到 Environment。这部分的配置获取遵循了 Spring Cloud Config 的理念,即希望能从外部储存介质中来 loacte。RefreshScope: Spring Cloud 定义这个注解,是扩展了 Spring 原有的 Scope 类型。用来标识当前这个 Bean 是一个refresh 类型的 Scope。其主要作用就是可以控制 Bean 的整个生命周期。ContextRefresher:抽象出这个 Class,是让用户自己按需来刷新上下文(比如当有配置刷新时,希望可以刷新上下文,将最新的配置更新到 Environment,重新创建 Bean 时,就可以从 Environment 中注入最新的配置)。Spring Cloud Config 原理Spring Cloud Config 的启动过程1、如何将配置加载到Environment:PropertySourceLocator在整个 Spring Boot 启动的生命周期过程中,有一个阶段是 prepare environment。在这个阶段,会publish 一个 ApplicationEnvironmentPreparedEvent,通知所有对这个事件感兴趣的 Listener,提供对 Environment 做更多的定制化的操作。Spring Cloud 定义了一个BootstrapApplicationListener,在 BootstrapApplicationListener 的处理过程中有一步非常关键的操作如下所示:private ConfigurableApplicationContext bootstrapServiceContext( ConfigurableEnvironment environment, final SpringApplication application, String configName) { //省略 ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); // Use names and ensure unique to protect against duplicates List<String> names = new ArrayList<>(SpringFactoriesLoader .loadFactoryNames(BootstrapConfiguration.class, classLoader)); //省略 }这是 Spring 的工厂加载机制,可通过在 META-INF/spring.factories 文件中配置一些程序中预定义的一些扩展点。比如 Spring Cloud 这里的实现,可以看到 BootstrapConfiguration 不是一个具体的接口,而是一个注解。通过这种方式配置的扩展点好处是不局限于某一种接口的实现,而是同一类别的实现。可以查看 spring-cloud-context 包中的 spring.factories 文件关于BootstrapConfiguration的配置,有一个比较核心入口的配置就是:org.springframework.cloud.bootstrap.BootstrapConfiguration=\org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration可以发现 PropertySourceBootstrapConfiguration 实现了 ApplicationContextInitializer 接口,其目的就是在应用程序上下文初始化的时候做一些额外的操作。在 Bootstrap 阶段,会通过 Spring Ioc 的整个生命周期来初始化所有通过key为_org.springframework.cloud.bootstrap.BootstrapConfiguration_ 在 spring.factories 中配置的 Bean。Spring Cloud Alibaba Nacos Config 的实现就是通过该key来自定义一些在Bootstrap 阶段需要初始化的一些Bean。在该模块的 spring.factories 配置文件中可以看到如下配置:org.springframework.cloud.bootstrap.BootstrapConfiguration=\org.springframework.cloud.alibaba.nacos.NacosConfigBootstrapConfiguration在 Bootstrap 阶段初始化的过程中,会获取所有 ApplicationContextInitializer 类型的 Bean,并设置回SpringApplication主流程当中。如下 BootstrapApplicationListener 类中的部分代码所示:private void apply(ConfigurableApplicationContext context, SpringApplication application, ConfigurableEnvironment environment) { @SuppressWarnings(“rawtypes”) //这里的 context 是一个 bootstrap 级别的 ApplicationContext,这里已经含有了在 bootstrap阶段所有需要初始化的 Bean。 //因此可以获取 ApplicationContextInitializer.class 类型的所有实例 List<ApplicationContextInitializer> initializers = getOrderedBeansOfType(context, ApplicationContextInitializer.class); //设置回 SpringApplication 主流程当中 application.addInitializers(initializers .toArray(new ApplicationContextInitializer[initializers.size()])); //省略…}这样一来,就可以通过在 SpringApplication 的主流程中来回调这些ApplicationContextInitializer 的实例,做一些初始化的操作。如下 SpringApplication 类中的部分代码所示:private void prepareContext(ConfigurableApplicationContext context, ConfigurableEnvironment environment, SpringApplicationRunListeners listeners, ApplicationArguments applicationArguments, Banner printedBanner) { context.setEnvironment(environment); postProcessApplicationContext(context); //回调在BootstrapApplicationListener中设置的ApplicationContextInitializer实例 applyInitializers(context); listeners.contextPrepared(context); //省略…}protected void applyInitializers(ConfigurableApplicationContext context) { for (ApplicationContextInitializer initializer : getInitializers()) { Class<?> requiredType = GenericTypeResolver.resolveTypeArgument( initializer.getClass(), ApplicationContextInitializer.class); Assert.isInstanceOf(requiredType, context, “Unable to call initializer.”); initializer.initialize(context); }}在 applyInitializers 方法中,会触发 PropertySourceBootstrapConfiguration 中的 initialize 方法。如下所示:@Overridepublic void initialize(ConfigurableApplicationContext applicationContext) { CompositePropertySource composite = new CompositePropertySource( BOOTSTRAP_PROPERTY_SOURCE_NAME); AnnotationAwareOrderComparator.sort(this.propertySourceLocators); boolean empty = true; ConfigurableEnvironment environment = applicationContext.getEnvironment(); for (PropertySourceLocator locator : this.propertySourceLocators) { PropertySource<?> source = null; //回调所有实现PropertySourceLocator接口实例的locate方法, source = locator.locate(environment); if (source == null) { continue; } composite.addPropertySource(source); empty = false; } if (!empty) { //从当前Enviroment中获取 propertySources MutablePropertySources propertySources = environment.getPropertySources(); //省略… //将composite中的PropertySource添加到当前应用上下文的propertySources中 insertPropertySources(propertySources, composite); //省略… }在这个方法中会回调所有实现 PropertySourceLocator 接口实例的locate方法,locate 方法返回一个 PropertySource 的实例,统一add到CompositePropertySource实例中。如果 composite 中有新加的PropertySource,最后将composite中的PropertySource添加到当前应用上下文的propertySources中。Spring Cloud Alibaba Nacos Config 在 Bootstrap 阶段通过Java配置的方式初始化了一个 NacosPropertySourceLocator 类型的Bean。从而在 locate 方法中将存放在Nacos中的配置信息读取出来,将读取结果存放到 PropertySource 的实例中返回。具体如何从Nacos中读取配置信息可参考 NacosPropertySourceLocator 类的实现。Spring Cloud Config 正是提供了PropertySourceLocator接口,来提供应用外部化配置可动态加载的能力。Spring Ioc 容器在初始化 Bean 的时候,如果发现 Bean 的字段上含有 @Value 的注解,就会从 Enviroment 中的PropertySources 来获取其值,完成属性的注入。Spring Cloud Config 外部化配置可动态刷新感知到外部化配置的变更这部分代码的操作是需要用户来完成的。Spring Cloud Config 只提供了具备外部化配置可动态刷新的能力,并不具备自动感知外部化配置发生变更的能力。比如如果你的配置是基于Mysql来实现的,那么在代码里面肯定要有能力感知到配置发生变化了,然后再显示的调用 ContextRefresher 的 refresh方法,从而完成外部化配置的动态刷新(只会刷新使用RefreshScope注解的Bean)。例如在 Spring Cloud Alibaba Nacos Config 的实现过程中,Nacos 提供了对dataid 变更的Listener 回调。在对每个dataid 注册好了相应的Listener之后,如果Nacos内部通过长轮询的方式感知到数据的变更,就会回调相应的Listener,在 Listener 的实现过程中,就是通过调用 ContextRefresher 的 refresh方法完成配置的动态刷新。具体可参考 NacosContextRefresher 类的实现。Sring Cloud Config的动态配置刷新原理图如下所示:ContextRefresher的refresh的方法主要做了两件事:触发PropertySourceLocator的locator方法,需要加载最新的值,并替换 Environment 中旧值Bean中的引用配置值需要重新注入一遍。重新注入的流程是在Bean初始化时做的操作,那也就是需要将refresh scope中的Bean 缓存失效,当再次从refresh scope中获取这个Bean时,发现取不到,就会重新触发一次Bean的初始化过程。这两个操作所对应的代码如下所示:public synchronized Set refresh() { Map<String, Object> before = extract( this.context.getEnvironment().getPropertySources()); //1、加载最新的值,并替换Envrioment中旧值 addConfigFilesToEnvironment(); Set<String> keys = changes(before, extract(this.context.getEnvironment().getPropertySources())).keySet(); this.context.publishEvent(new EnvironmentChangeEvent(context, keys)); //2、将refresh scope中的Bean 缓存失效: 清空 this.scope.refreshAll(); return keys;}addConfigFilesToEnvironment 方法中发生替换的代码如下所示:ConfigurableApplicationContext addConfigFilesToEnvironment() { ConfigurableApplicationContext capture = null; try { //省略… //1、这里会重新触发PropertySourceLoactor的locate的方法,获取最新的外部化配置 capture = (SpringApplicationBuilder)builder.run(); MutablePropertySources target = this.context.getEnvironment() .getPropertySources(); String targetName = null; for (PropertySource<?> source : environment.getPropertySources()) { String name = source.getName(); //省略.. //只有不是标准的 Source 才可替换 if (!this.standardSources.contains(name)) { if (target.contains(name)) { //开始用新的PropertySource替换旧值 target.replace(name, source); } // } } } // return capture;}this.scope.refreshAll() 清空缓存的操作代码如下所示:@Override public void destroy() { List<Throwable> errors = new ArrayList<Throwable>(); //清空Refresh Scope 中的缓存 Collection<BeanLifecycleWrapper> wrappers = this.cache.clear(); //省略… }为了验证每次配置刷新时,Bean 是新创建的,特意写了一个Demo 验证了下,如下所示:Acm Properties: beijing-region//刷新前Object Instance is :com.alibaba.demo.normal.ConfigProperties@1be96342018-11-01 19:16:32.535 INFO 27254 — [gPullingdefault] startup date [Thu Nov 01 19:16:32 CST 2018]; root of context hierarchyAcm Properties: qingdao-region//刷新后Object Instance is :com.alibaba.demo.normal.ConfigProperties@2c6965e0Spring Cloud Config 扩展Scope的核心类:RefreshScope可以看到上面的代码中有 this.scope.refreshAll(),其中的scope就是RefreshScope。是用来存放scope类型为refresh类型的Bean(即使用RefreshScope注解标识的Bean),也就是说当一个Bean既不是singleton也不是prototype时,就会从自定义的Scope中去获取(Spring 允许自定义Scope),然后调用Scope的get方法来获取一个实例,Spring Cloud 正是扩展了Scope,从而控制了整个 Bean 的生命周期。当配置需要动态刷新的时候, 调用this.scope.refreshAll()这个方法,就会将整个RefreshScope的缓存清空,完成配置可动态刷新的可能。更多关于Scope的分析请参考 这里后续关于ContextRefresh 和 RefreshScope的初始化配置是在RefreshAutoConfiguration类中完成的。而RefreshAutoConfiguration类初始化的入口是在spring-cloud-context中的META-INF/spring.factories中配置的。从而完成整个和动态刷新相关的Bean的初始化操作。本文作者:中间件小哥阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

December 17, 2018 · 3 min · jiezi