• 关于

    主流数据仓库

    的搜索结果

回答

概述 本实践通过模拟搭建电商网站 Demo,演示如何使用阿里云日志服务接入电商系统 Web 服务器的接入日志,并在函数计算中编写 ETL 托管程序,对日志服务中数据进行处理,然后通过日志服务的仪表盘进行可视化展示。ETL 托管程序通过日志服务触发器以秒级准实时的频率被调用。 应用场景 数据加工场景:实时消费日志服务写入的日志 数据投递场景:从数据源抽取(Extract)出所需的数据,经过数据加工(Transform),最终按照预先定义好的数据仓库模型,将数据加载(Load)到数据仓库中去。 方案介绍 通过日志服务 + 函数计算 ETL,快速完成日志采集、加工、查询、分析和展示。 etl 日志服务+函数计算 ETL 的优势 一站式采集、存储、加工、分析和展示 全托管日志加工任务,按时间周期进行触发执行,自动重试 日志库资源按Shard水平扩展,满足大数据需求 基于函数计算提供数据加工、弹性资源、按需付费以及自定义代码逻辑 持续增加内置函数模板,降低主流需求下的函数开发代价 方案详情: 使用函数计算对日志服务中的数据进行 ETL 数据处理

1934890530796658 2020-03-27 17:15:25 0 浏览量 回答数 0

回答

数据挖掘从业人员工作分析:数据挖掘从业人员的愿景:数据挖掘就业的途径从我看来有以下几种,(注意:本文所说的数据挖掘不包括数据仓库或数据库管理员的角色)。 A:做科研(在高校、科研单位以及大型,主要研究算法、应用等) B:算法工程师(在做数据挖掘及其相关程序算法的实现等)C:数据分析师(在存在海量数据的企事业单位做咨询、分析等) 数据挖掘从业人员切入点:根据上面的从业方向来说说需要掌握的技能。A:做科研:这里的科研相对来说比较概括,属于技术型的相对高级级别,需要对开发、数据分析的必备基础知识。 B:算法工程师:主要是实现数据挖掘现有的算法和研发新的算法以及根据实际需要结合核心算法做一些程序开发实现工作。要想扮演好这个角色,你不但需要熟悉至少一门编程语言如(C,C++,Java,Delphi等)和数据库原理和操作,对数据挖掘基础课程有所了解,读过《数据挖掘概念与技术》(韩家炜著)、《人工智能及其应用》。有一点了解以后,如果对程序比较熟悉的话并且时间允许,可以寻找一些开源的数据挖掘研究分析,也可以参考如《数据挖掘:实用机器学习技术及Java实现》等一些教程。 C:数据分析师:需要有深厚的数理统计基础,可以不知道人工智能和计算机编程等相关技术,但是需要熟练使用主流的数据挖掘(或统计分析)工具。从这个方面切入数据挖掘领域的话你需要学习《数理统计》、《概率论》、《统计学习基础:数据挖掘、推理与预测》、《金融数据挖掘》,《业务建模与数据挖掘》、《数据挖掘实践 》等,当然也少不了你使用的工具的对应说明书了,如SPSS、SAS等厂商的《SAS数据挖掘与分析》、《数据挖掘Clementine应用实务》、《EXCEL 2007数据挖掘完全手册》等,如果多看一些如《数据挖掘原理》 等书籍那就更好了。</ol>

玄学酱 2019-12-02 01:21:50 0 浏览量 回答数 0

回答

数据中台,解决数据“存”、“通”、“用”难题让一切业务数据化,一切数据业务化具体而说,数据中台并不是一个跨时代的全新理念,就好比笔者当年学习SOA一样,发现其实质还是组件化,模块化,是设计模式与业务端的应用。数据中台建设的基础还是数据仓库和数据中心,并且在数仓模型的设计上也是一脉传承,之所以我们现在处处推崇数据中台建设及应用,一个是因为数据中台确实有过人之处,另一个是这套模型在阿里体现了巨大的应用价值。首先先总结一下数据中台策略中的几个过人之处。第一:数据汇聚,承上启下。数据中台策略的基本理念是,将所有的数据汇聚到数据中台,以后的每个数据应用(无论是指标和分析类的,还是画像类和大数据类的)统统从数据中台获取数据,如果数据中台没有,那么数据中台就负责把数据找来,如果数据中台找不来,就说明当前真没有这个数据,数据应用也就无从展开。按照这种模式,如果企业中数据应用数量大于3-5个,那么数据中台将整体上节约30%的成本,随着数据应用的增长,这样节约的成本还会更大。传统的数据仓库和数据中心,如果做得比较好,设计到位的话,也会做完整的数据模型设计,但是往往偏重于设计和技术,在执行的过程中,很难保障数据的全,也很难保证数据应用不跨过数据中心,重新做数据的话,那么后期数据则会比较混乱。相对而言,数据中台策略中更加强调数据的“全”以及数据中台组织与数据应用组织之间的协作关系,从设计、组织、建设、流程角度保障了模式的落地。袋鼠云数据中台策略第二:纵观大局,推动全局数据业务在企业中应当是一个完整业务,是一个亟需提高定位的业务,是企业的战略业务。所以数据中台策略应当对应企业的数据战略,并提供更有力的支撑,而不是仅仅停留在把数据找到,把数据清洗,把数据算出来。所以,构建数据中台建设,需要详实了解企业的数据情况,数据需求以及构建数据业务的推动蓝图。上述内容应当通过相互衔接的七个数据服务进行完整的构建以及推动袋鼠云数据中台七大数据服务数据资源规划及获取盘点数据资源、规划数据资源、获取数据资源,并将所有数据资源进行完整呈现;数据质量分析及提升从基础数据、业务数据、大数据视角综合分析当前的数据质量问题;基于中台策略的数据整体建模与数据资产管理企业可根据数据资源规划报告指导后续数据治理和数据资产管理平台的建设,最终服务于企业数据应用场景。实体画像及标签引擎对用户、产品、客商、营销各主题域进行标签提取,将其特征数字化,为后续进行精准 营销和用户画像提供必要条件。数据指标体系梳理及计算(BI)构建企业标签体系,着重分析当前需要但是无法获取到的指标,描述使用不便的指标,分析问题原因,绘制数据供应链条;数据应用规划及实现(DI)基于当前外部数据、IOT数据、非结构和半结构化数据进行大数据应用的规划,并论证实现过程和进行成本评估。一旦评估通过可以帮助企业进行大数据应用的完整开发和落地。数据可视化大屏数据可视化大屏,讲述数据背后的价值。在最短的时间内用最具冲击力的视觉语言,将企业最重要的数据/信息传递给最重要的人。袋鼠云数据中台七大数据服务通过上述服务内容,希望将企业数据资源情况完整展现,数据问题展现,数据资产情况展现,数据需求展现(传统数据分析方面、大数据应用方面)从而绘制一张完整的数据供应链地图,最终利用这张地图,辅助数据业务推进。第三:技术升级、应用便捷大数据平台在很长一段时间,甚至直至现在都还是以开源产品为主流的状况,开源产品使用费力,配置繁琐,导致大数据开发门槛高,数据应用受到严重阻碍,甚至在很多地方一直把大数据技术平台和传统的数仓做区别对待,认为大数据产品的特点是流式计算和处理非结构化数据。其实大数据产品如果能够降低使用门槛的话,会迅速替代传统数仓的技术产品。传统数仓无论在海量数据处理能力,节点扩展能力,实时计算能力,软件购买和维护成本等诸多方面都无法与当前的大数据平台进行抗衡。目前业内比较典型的就是阿里云数加平台,数加平台基本让数据开发者能够像使用传统数据库一样的使用大数据平台了,所有操作方式都是通过可视化界面进行,大部分的开发都是通过SQL语句来实现。当笔者使用数加产品时,总是回想起第一次使用java IDE(JBuild、Eclipse) 产品时的感受。袋鼠云数据中台产品(数栈)客观的说则是一款轻量化的,可私有部署的类数加产品,用以解决基于私有云的大数据平台的管理和开发问题。数据中台产品在与数加产品功能对比上不分伯仲,同时又基于私有云大数据应用的特点定制开发了诸多功能以及数据治理模块用以推动企业整体数据化进程。袋鼠云数栈产品体系袋鼠云数栈产品一览袋鼠云数栈产品一览袋鼠云数据中台建设与策略已经脱离了一个单纯的产品概念范畴,更多的是关注于企业的整体数据化建设工作,希望通过数栈产品和七大数据服务贴身参与用户全方位与全过程的数据化建设。同时我们期待这样的数据化建设应当是高效率,高应用价值和低成本的。

hiekay 2019-12-02 01:41:35 0 浏览量 回答数 0

万券齐发助力企业上云,爆款产品低至2.2折起!

限量神券最高减1000,抢完即止!云服务器ECS新用户首购低至0.95折!

问题

【大数据实践】日交易笔百万级Ping++的大数据平台架构解析

福利达人 2019-12-01 21:17:02 2801 浏览量 回答数 0

回答

本文主要为您介绍容器服务 ACK 的常见应用场景。 DevOps 持续交付 最优化的持续交付流程 配合 Jenkins 帮您自动完成从代码提交到应用部署的 DevOps 完整流程,确保只有通过自动测试的代码才能交付和部署,高效替代业内部署复杂、迭代缓慢的传统方式。 能够实现: DevOps 自动化 实现从代码变更到代码构建、镜像构建和应用部署的全流程自动化。 环境一致性 容器技术让您交付的不仅是代码,还有基于不可变架构的运行环境。 持续反馈 每次集成或交付,都会第一时间将结果实时反馈。 推荐搭配使用: 云服务器 ECS + 容器服务 DevOps 基于云原生技术的机器学习 专注机器学习本身,快速实现从 0 到 1 帮助数据工程师在异构计算资源集群上轻松开发、部署机器学习应用,跟踪试验和训练、发布模型,自动集成多种数据部署在分布式存储系统,加速训练数据读写,无需关心繁琐部署运维,专注核心业务,快速从 0 到 1。 能够实现: 支持生态 内置对 TensorFlow、Caffe、 MXNet、Pytorch 等主流深度学习计算框架支持和优化。 快速弹性 一键部署机器学习开发、训练、推理服务,秒级启动和弹性伸缩。 简单可控 轻松创建、管理大规模 GPU 计算集群,并且可以监控 GPU 利用率等核心指标。 深度整合 无缝接入阿里云存储、日志监控和安全基础架构能力。 推荐搭配使用: 云服务器 ECS/GPU 服务器 EGS/高性能计算服务 (Alibaba Cloud HPC)+ 容器服务 + 对象存储 OSS/文件存储 NAS/CPFS 容器服务 微服务架构 实现敏捷开发和部署落地,加速企业业务迭代 企业生产环境中,通过合理微服务拆分,将每个微服务应用存储在阿里云镜像仓库帮您管理。您只需迭代每个微服务应用,由阿里云提供调度、编排、部署和灰度发布能力。 能够实现: 负载均衡和服务发现 支持 4 层和 7 层的请求转发和后端绑定。 丰富的调度和异常恢复策略 支持服务级别的亲和性调度,支持跨可用区的高可用和灾难恢复。 微服务监控和弹性伸缩 支持微服务和容器级别的监控,支持微服务的自动伸缩。 推荐搭配使用: 云服务器 ECS + 云数据库 RDS 版 + 对象存储 OSS + 容器服务 负载均衡 混合云架构 统一运维多个云端资源 在容器服务控制台上同时管理云上云下的资源,不需在多种云管理控制台中反复切换。基于容器基础设施无关的特性,使用同一套镜像和编排同时在云上云下部署应用。 能够实现: 在云上伸缩应用 业务高峰期,在云端快速扩容,把一些业务流量引到云端。 云上容灾 业务系统同时部署到云上和云下,云下提供服务,云上容灾。 云下开发测试 云下开发测试后的应用无缝发布到云上。 推荐搭配使用: 云服务器 ECS + 专有网络 VPC + 高速通道(Express Connect) 容器服务 弹性伸缩架构 根据业务流量自动对业务扩容/缩容 容器服务可以根据业务流量自动对业务扩容/缩容,不需要人工干预,避免流量激增扩容不及时导致系统挂掉,以及平时大量闲置资源造成浪费。 能够实现: 快速响应 业务流量达到扩容指标,秒级触发容器扩容操作。 全自动 整个扩容/缩容过程完全自动化,无需人工干预。 低成本 流量降低自动缩容,避免资源浪费。 推荐搭配使用: 云服务器 ECS + 云监控 云监控

1934890530796658 2020-03-26 11:24:27 0 浏览量 回答数 0

问题

【精品问答】Java技术1000问(1)

问问小秘 2019-12-01 21:57:43 39926 浏览量 回答数 17

问题

3G网络的移动ERP产

hua2012h 2019-12-01 20:15:07 7789 浏览量 回答数 1

回答

浅谈Flutter框架原理及其生态圈 Flutter的锋芒 跨平台高性能的渲染引擎逐渐成为移动端、大前端领域的一个热点,作为其中的明星框架Flutter,经过近几年来的迅速发展,由极大的可能成为下一代跨端终端解决方案。自从2017 年 5 月,谷歌公司发布的了 Alpha 版本的 Flutter; 2018 年底 Flutter Live 发布的 1.0 版本;2019年7月发布1.5版本,截止今日(2020年2月)已经发布了v1.14.6 Beta版本。 在Flutter诞生之前,已经有许多跨平台UI框架的方案如Cordova、ReactNative、weex、uni-app、Hippy等,常见的需要处理兼容的终端平台也包括android、ios、web、Iot等,但是在大前端的浪潮下,对于企业和开发者来说开发效率和使用体验都十分重要,传统的做法莫过于分不同的团队开发不同的终端项目,如果还要继续向其他平台,拓展的话,我们需要付出的成本和时间将成倍增长。正因为如此,在这样的背景下,Flutter等跨端框架的兴起,从本质上讲,帮助开发者增加业务代码的复用率,减少因为要适配多个平台带来的工作量,从而降低开发成本、提高开发效率。 纵观已有的跨端方案,可以分为三类:Web 容器、泛 Web 容器、自绘引擎框架。 基于web容器即基于浏览器的跨平台也做得越来越好,自然管线也越来越短,与native的一些技术手段来实现性能上的相互补充。比如Egret、Cocos、Laya这些游戏引擎,它们在跨平台方面的做法多以Typescript编写,在iOS和安卓平台的各种浏览器中轻松的运行HTML5游戏,并在不同平台浏览器里提供近乎一致的用户体验,比如Egret还会提供高效的 JS-C Binding 编译机制,以满足游戏编译为原生格式的需求,不过大多数HTML游戏引擎也属于web容器这个范畴内。web容器框架也有一个明显的致命(在对体验&性能有较高要求的情况下)的缺点,那就是WebView的渲染效率和JavaScript执行性能太差。再加上Android各个系统版本和设备厂商的定制,很难保证所在所有设备上都能提供一致的体验。 泛 Web 容器框架比如ReactNative和Weex,即上层通过面向前端友好的UI,下层通过native的渲染形式,虽然同样使用类HTML+JS的UI构建逻辑,但是最终会生成对应的自定义原生控件,以充分利用原生控件相对于WebView的较高的绘制效率,同时H5与native相互补充来达到更好的用户体验,这也是一种很好的解决方案。缺陷也很明显,随着系统版本变化和API的变化,开发者可能也需要处理不同平台的差异,甚至有些特性只能在部分平台上实现,这样框架的跨平台特性就会大打折扣。 自绘引擎框架这里专指Flutter框架,从底层就承担跨端的任务和渲染方式,从目前来看,从技术的实现和方案的成熟度、产品的性能方面比较,Flutter有很大可能成为下一代主流跨平台框架。 Flutter与其他跨端框架的不同点之一就是自带渲染引擎,Flutter渲染引擎依靠跨平台的Skia图形库来实现,Skia引擎会将使用Dart语言构建的抽象的视图结构数据加工成GPU数据,交由 OpenGL 最终提供给 GPU 渲染,至此完成渲染闭环,因此可以在最大程度上保证一款应用在不同平台、不同设备上的体验一致性。 而开发语言选用的是同时支持 JIT和 AOT的 Dart语言,Dart本身提供了三种运行方式,应对web环境,用Dart2js编译成JavaScript代码,运行在常规浏览器中;使用DartVM直接在命令行中运行Dart代码;AOT方式编译成机器码,例如Flutter App框架。而且Dart 避免了抢占式调度和共享内存,可以在没有锁的情况下进行对象分配和垃圾回收,在性能方面表现相当不错,不仅保证了开发效率,代码性能和用户体验也更卓越。因此,Flutter在各类跨平台移动开发方案中脱颖而出。同时在去年2019的Google IO大会上,备受关注的Fuchsia系统虽然并没有发布,但是宣布了 Flutter除了支持开发 Android 和 iOS 程序之外,现在还支持开发Web程序了,在 I/O 大会上,谷歌发布了 Web 版 Flutter 的首个技术预览版,宣布 Flutter 将为包括 Google Home Hub 在内的 Google Smart Display 平台提供技术支持,并迈出利用 Chrome 操作系统支持桌面级应用的第一步。 很多JS开发者会思考Google Flutter团队至于为啥选择Dart而不是JS,其实Google 公司给出的原因很简单也很直接:Dart 语言开发组就在隔壁,对于 Flutter 需要的一些语言新特性,能够快速在语法层面落地实现;而如果选择了 JavaScript,就必须经过各种委员会(TC39等)和浏览器提供商漫长的决议。 Flutter绘制原理 在计算机系统中,图像的显示需要 CPU、GPU 和显示器一起配合完成:CPU 负责图像数据计算,GPU 负责图像数据渲染,而显示器则负责最终图像显示。 CPU 把计算好的、需要显示的内容交给 GPU,由 GPU 完成渲染后放入帧缓冲区,随后视频控制器根据垂直同步信号(VSync)以每秒 60 次的速度,从帧缓冲区读取帧数据交由显示器完成图像显示。 操作系统在呈现图像时遵循了这种机制,而 Flutter 作为跨平台开发框架也采用了这种底层方案。下面有一张更为详尽的示意图来解释 Flutter 的绘制原理。可以看到,Flutter 关注如何尽可能快地在两个硬件时钟的 VSync 信号之间计算并合成视图数据,然后通过 Skia 交给 GPU 渲染:UI 线程使用 Dart 来构建视图结构数据,这些数据会在 GPU 线程进行图层合成,随后交给 Skia 引擎加工成 GPU 数据,而这些数据会通过 OpenGL 最终提供给 GPU 渲染。 Skia原理 Skia 是一款用由C++ 开发的2D 图像绘制引擎。在2005 年被 Google 公司收购后被广泛应用在 Android和其他等核心产品上,Skia 目前是Android 官方的图像渲染引擎,因此 Flutter Android SDK 无需内嵌 Skia 引擎就可以获得天然的 Skia 支持;而对于 iOS 平台来说,由于 Skia 是跨平台的,因此它作为 Flutter iOS 渲染引擎被嵌入到 Flutter 的 iOS SDK 中,替代了 iOS 闭源的 Core Graphics/Core Animation/Core Text,这也正是 Flutter iOS SDK 打包的 App 包体积比 Android 要大一些的原因。 底层渲染能力统一了,上层开发接口和功能体验也就随即统一了,开发者再也不用操心平台相关的渲染特性了。也就是说,Skia 保证了同一套代码调用在 Android 和 iOS 平台上的渲染效果是完全一致的。 Flutter架构 Framework底层是Flutter引擎,引擎主要负责图形绘制(Skia)、文字排版(libtxt)和提供Dart运行时,引擎全部使用C++实现,Framework层使我们可以用Dart语言调用引擎的强大能力。Flutter 架构采用分层设计,从下到上分为三层,依次为:Embedder、Engine、Framework。 Embedder 是操作系统适配层,实现了渲染 Surface 设置,线程设置,以及平台插件等平台相关特性的适配。从这里我们可以看到,Flutter 平台相关特性并不多,这就使得从框架层面保持跨端一致性的成本相对较低。 Engine 层主要包含 Skia、Dart 和 Text,实现了 Flutter 的渲染引擎、文字排版、事件处理和 Dart 运行时等功能。Skia 和 Text 为上层接口提供了调用底层渲染和排版的能力,Dart 则为 Flutter 提供了运行时调用 Dart 和渲染引擎的能力。而 Engine 层的作用,则是将它们组合起来,从它们生成的数据中实现视图渲染。 Framework 层则是一个用 Dart 实现的 UI SDK,包含了动画、图形绘制和手势识别等功能。为了在绘制控件等固定样式的图形时提供更直观、更方便的接口,Flutter 还基于这些基础能力,根据 Material 和 Cupertino 两种视觉设计风格封装了一套 UI 组件库,开发者可以直接使用这些组件库。 Flutter运行流程 页面中的各界面元素(Widget)以树的形式组织,即控件树。Flutter 通过控件树中的每个控件创建不同类型的渲染对象,组成渲染对象树。在Flutter界面渲染过程分为三个阶段:布局、绘制、合成,布局和绘制在Flutter框架中完成,合成则交由引擎负责。 Flutter 采用深度优先机制遍历渲染对象树,决定渲染对象树中各渲染对象在屏幕上的位置和尺寸。在布局过程中,渲染对象树中的每个渲染对象都会接收父对象的布局约束参数,决定自己的大小,然后父对象按照控件逻辑决定各个子对象的位置,最终完成布局过程。这里只需要注意一点,无论布局还是绘制,都是父子间的遍历关系:父Widget的布局需要依赖子Widget的布局结果;而绘制则反过来(子Widget需要盖在父Widget上),布局是后续遍历,绘制是前序遍历,他们都是深度优先遍历。 Flutter生命周期 可以看到,Flutter中State 的生命周期可以分为 3 个阶段:创建(插入视图树)、更新(在视图树中存在)、销毁(从视图树中移除)。接下来,我们一起看看每一个阶段的具体流程。 第一步创建 State 初始化时会依次执行 :构造方法 -> initState -> didChangeDependencies -> build,随后完成页面渲染。构造方法是 State 生命周期的起点,Flutter 会通过调用StatefulWidget.createState() 来创建一个 State。我们可以通过构造方法,来接收父 Widget 传递的初始化 UI 配置数据。这些配置数据,决定了 Widget 最初的呈现效果。 initState,会在 State 对象被插入视图树的时候调用。这个函数在 State 的生命周期中只会被调用一次,所以我们可以在这里做一些初始化工作,比如为状态变量设定默认值。 didChangeDependencies 则用来专门处理 State 对象依赖关系变化,会在 initState() 调用结束后,被 Flutter 调用。 build,作用是构建视图。经过以上步骤,Framework 认为 State 已经准备好了,于是调用 build。我们需要在这个函数中,根据父 Widget 传递过来的初始化配置数据,以及 State 的当前状态,创建一个 Widget 然后返回。 第二步更新 Widget 的状态更新,主要由个方法触发:setState、didchangeDependencies、didUpdateWidget。 setState:我们最熟悉的方法之一。当状态数据发生变化时,我们总是通过调用这个方法告诉 Flutter:“我这儿的数据变啦,请使用更新后的数据重建 UI!” didChangeDependencies:State 对象的依赖关系发生变化后,Flutter 会回调这个方法,随后触发组件构建。哪些情况下 State 对象的依赖关系会发生变化呢?典型的场景是,系统语言 Locale 或应用主题改变时,系统会通知 State 执行 didChangeDependencies 回调方法。 didUpdateWidget:当 Widget 的配置发生变化时,比如,父 Widget 触发重建(即父 Widget 的状态发生变化时),热重载时,系统会调用这个函数。一旦这三个方法被调用,Flutter 随后就会销毁老 Widget,并调用 build 方法重建 Widget。 第三步销毁 比如组件被移除,或是页面销毁的时候,系统会调用 deactivate 和 dispose 这两个方法,来移除或销毁组件。 Flutter生态圈及其常用框架 一项技术一个框架是否流行,最直观的体现就是它的生态圈是否活跃,下面列举了一些Flutter开发中常用的库工具。 参考文献 1、[Flutter原理与实践](https://tech.meituan.com/2018/08/09/waimai-flutter-practice.html) 少杰 2、[Flutter框架技术概览](https://flutter.dev/docs/resources/technical-overview) 3、[Flutter中文官网](https://pub.dartlang.org/flutter/) 4、[Flutter插件仓库](https://pub.dev/flutter/packages)

罗思雨 2020-02-27 11:47:50 0 浏览量 回答数 0

回答

Web应用托管服务Web+具有广泛的应用场景,既可以部署普通Web应用、小程序移动应用和开源应用,又可以与其他阿里云服务集成提供丰富的应用托管方案。 普通Web应用 Web+支持多种Web应用部署方式。可以是极简配置的单机部署,适用于小规模的测试场景;也可以是复杂配置的分布式部署,适合大规模的生产场景。 单机部署模式下,反向代理、用户的应用程序和数据库等均部署在一台主机上,最大限度的解决资源和成本问题。 分布式部署模式下,用户的应用可以使用弹性能力方便的进行横向扩展,再通过SLB对请求进行负载均衡;数据库将被部署到RDS上,以保证服务的高性能和高可用;最后应用所使用的静态资源将通过CDN服务进行分发,以加快资源的访问速度。 普通Web应用 灵活的应用部署方式 用户应用在不同的部署环境上可能有不同的配置要求,开发和测试环境对系统性能和可用性的要求较低,可以使用更简单的单机部署来节约成本;而预发和线上环境则会按照服务能力要求进行分布式部署。Web+可以灵活支持这两种场景下的部署方式。 自动化的全托管环境 用户无需关心底层基础设施的管理与配置,系统会按照用户提交的配置请求对系统资源和软件环境进行自动管理。包括但不限于购买、变配、扩缩容和释放等。 深度整合阿里云的各项服务 依托于阿里云提供的各项基础设施服务(如ECS、RDS、OSS、SLB、云监控和CDN等),用户能够通过Web+快速搭建一套具有云原生能力的Web应用系统。 推荐产品:ECS、OSS、RDS、SLB、CDN 小程序移动应用 Web+支持部署小程序移动应用。小程序移动应用的前后端是严格分离的,前端程序运行在宿主应用中,后端程序运行在云厂商提供的基础设施服务之上。使用Web+可以轻松运维小程序移动应用的后端部分。在组织内部,通过共享配置模板或将配置模板提交到代码仓库进行版本管理,团队内部成员可以使用这些配置模板快速创建一个相同配置的部署环境。 小程序移动应用 使用多语言开发后端应用 Web+提供的多语言支持能力可以让用户使用多种主流的开发语言开发小程序后端应用,包括但不限于Java、Python、Node.js、PHP、Ruby和Go,同时用户还可以使用Docker镜像或插件扩展自己的运行时环境。 基础设施即代码(Infrastructure as Code) Web+开放格式的资源描述文件(Wpfile)可以随应用代码一起管理和分发,通过命令行工具或控制台,任何有权限获取该文件的用户都可以通过其创建一套相同配置的部署环境。 部署环境按需创建 开发和测试过程中的部署环境通常非常不稳定,出现问题后将相关服务推倒重来可能是最经济的解决办法。使用Web+用户可以随时重建部署环境,或创建新的部署环境,而且在非频繁使用期可以随时释放并销毁资源,以节约资源占用成本。 推荐产品:ECS、OSS、RDS、SLB、日志服务 开源应用 在开发过程中,通过命令行工具与CI/CD系统集成,开发者可以快速构建、测试、验收并发布开源软件。在发布过程中,通过分发资源描述文件(Wpfile),维护者可以帮助用户进行系统配置和初始化工作。由于运行应用所需的运行时环境各不相同,在Web+插件体系的支撑下,开源应用将可以按需依赖任何第三方组件,而无需等待Web+产品对此进行官方支持。 开源应用 从研发到交付的全流程整合 无论是从代码到产出交付物,还是从交付物到最终可运行的系统,Web+都可以在其中帮助开发人员、测试人员、发布人员和最终用户解决环境的部署问题。 更灵活的组件依赖 开源应用维护者可以通过Web+提供的插件能力,扩展应用所需的资源和运行时环境。这些扩展插件可以是私有的,也可以作为新的开源项目贡献给社区。 打造开源应用支持生态 在Web+官方、开源应用维护者和整个社区的共同参与下,Web+致力于打造一个快速体验开源应用的开放生态环境。 推荐产品:ECS、OSS、RDS、SLB、云效

1934890530796658 2020-03-23 13:42:36 0 浏览量 回答数 0

回答

在函数计算服务使用 Java 编程,需要定义一个 Java 函数作为入口。Java 运行环境根据是否支持 HTTP 触发器分为 普通函数入口 和 HTTP 触发器函数入口 两种函数入口,为函数设置 HTTP 触发器后的函数入口形式会不同,这是为了方便处理发来的 HTTP request 请求并允许用户返回自定义 HTTP header。其中 普通函数入口 又分为 处理函数入口 和 initializer入口。 本文对 普通函数入口 和 HTTP 触发器函数入口 进行详细介绍: 普通函数入口 处理函数入口 StreamRequestHandler PojoRequestHandler initializer 入口 HTTP 触发器函数入口 Java 代码打包 普通函数入口 处理函数入口 用户在使用 Java 编程时,必须要实现函数计算提供的接口类,对于普通函数入口目前有 2 个预定义接口可选择: StreamRequestHandler以流的方式接受调用输入event和返回执行结果,用户需要从inputStream中读取调用函数时的输入,处理完成后把函数执行结果写入到outputStream中来返回。 PojoRequestHandler通过泛型的方式,用户可以自定义输入和输出的类型,但是它们必须是POJO类型。 StreamRequestHandler 一个最简单的处理函数定义如下: package example; import com.aliyun.fc.runtime.Context; import com.aliyun.fc.runtime.StreamRequestHandler; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class HelloFC implements StreamRequestHandler { @Override public void handleRequest( InputStream inputStream, OutputStream outputStream, Context context) throws IOException { outputStream.write(new String("hello world").getBytes()); } } 1. 包名/类名 包名和类名可以是任意的,但是需要与创建函数时的 “Handler” 字段相对应:上面的例子包名是 “example”,类名是 “HelloFC”,那么创建函数时指定的 Handler 为 example.HelloFC::handleRequest,”Handler” 的格式为 {package}.{class}::{method}。 实现的接口 用户的代码中必须要实现函数计算预定义的接口。上面的例子中实现了StreamRequestHandler,其中的 inputStream 参数是调用函数时传入的数据,outputStream 用于返回函数的执行结果。 context参数 context 参数中包含一些函数的运行时信息(例如 request id/临时 AK 等)。其类型是 com.aliyun.fc.runtime.Context。 返回值 实现StreamRequestHandler接口的函数通过outputStream参数返回执行结果 引入接口库 其中用到的com.aliyun.fc.runtime这个包的依赖可以通过下面的 pom.xml 引用: com.aliyun.fc.runtime fc-java-core 1.3.0 通过 maven 仓库 可以获取fc-java-core最新的版本号。 在创建函数之前,用户需要将代码及其依赖的 fc-java-core 打包成 jar。关于如何打包,请参见 Java 代码打包。 打包成 jar 后就可以使用 Fun 或者控制台上传代码,以 Fun 为例: 在项目根目录创建一个 template.yml 的文件: ROSTemplateFormatVersion: '2015-09-01' Transform: 'Aliyun::Serverless-2018-04-03' Resources: FunDemo: Type: 'Aliyun::Serverless::Service' javademo: Type: 'Aliyun::Serverless::Function' Properties: Handler: example.HelloFC::handleRequest Runtime: java8 CodeUri: './example.jar' 这个 template.yml 的含义如下:声明一个名为 FunDemo 的 服务,并在这个服务下,再声明一个名为 javademo 的 函数,配置函数入口为 example.HelloFC::handleRequest,以及函数的 runtime 为 java8。并且,我们指定了 CodeUri 为 ./example.jar。在部署时,Fun 会将 CodeUri 指定的目录或文件打包上传。更多的配置规则 请参考。 示例代码包是示例中的 hello world 代码打包成的 jar 包,您可以直接使用 示例代码包 进行测试。 使用 Fun 部署: fun deploy 执行成功时,会看到相关日志: using region: cn-hangzhou using accountId: ***********3557 using accessKeyId: ***********r3Ra using timeout: 300 Waiting for service FunDemo to be deployed... Waiting for function javademo to be deployed... Waiting for packaging function javademo code... package function javademo code done function javademo deploy success service FunDemo deploy success 然后就可以登录控制台查看或直接调用了。 PojoRequestHandler 一个最简单的处理函数定义如下: // HelloFC.java package example; import com.aliyun.fc.runtime.Context; import com.aliyun.fc.runtime.PojoRequestHandler; public class HelloFC implements PojoRequestHandler<SimpleRequest, SimpleResponse> { @Override public SimpleResponse handleRequest(SimpleRequest request, Context context) { String message = "Hello, " + request.getFirstName() + " " + request.getLastName(); return new SimpleResponse(message); } } // SimpleRequest.java package example; public class SimpleRequest { String firstName; String lastName; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public SimpleRequest() {} public SimpleRequest(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } } // SimpleResponse.java package example; public class SimpleResponse { String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public SimpleResponse() {} public SimpleResponse(String message) { this.message = message; } } 准备调用的输入文件: { "firstName": "FC", "lastName": "aliyun" } 使用 fcli 调用结果: invk hello-java -f /tmp/a.json {"message":"Hello, FC aliyun"} initializer 入口 无论您的函数使用流式输入还是通过泛型的方式自定义输入和输出,当需要在 Java runtime 中添加 initializer 接口时,都需在原有的基础上额外实现 initializer 预定义的接口。 initializer预定义接口如下: package com.aliyun.fc.runtime; import java.io.IOException; public interface FunctionInitializer { /** * The interface to handle a function compute initialize request * * @param context The function compute initialize environment context object. * @throws IOException IOException during I/O handling */ void initialize(Context context) throws IOException; } 一个简单的流式输入的函数和 initializer 结合的 demo 如下: package aliyun.serverless.test.example; import com.aliyun.fc.runtime.Context; import com.aliyun.fc.runtime.FunctionComputeLogger; import com.aliyun.fc.runtime.StreamRequestHandler; import com.aliyun.fc.runtime.FunctionInitializer; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class InitializerAndStreamRequest implements StreamRequestHandler, FunctionInitializer { @Override public void initialize(Context context) { FunctionComputeLogger logger = context.getLogger(); logger.debug(String.format("RequestID is %s %n", context.getRequestId())); } @Override public void handleRequest(InputStream input, OutputStream output, Context context) throws IOException { FunctionComputeLogger logger = context.getLogger(); logger.debug(String.format("RequestID is %s %n", context.getRequestId())); output.write(new String("hello world!").getBytes()); output.flush(); } } 针对 InitializerAndStreamRequest 中新增加的 initialize 方法即是 initializer 接口,特性如下: 包名/类名 initializer 所属包名和类名和处理函数一致,都可以是任意的。”initializer” 的格式同为 {package}.{class}::{method},与 “handler” 不同的是 handler 中的 method 为 handleRequest,initializer 的 method 为 initialize。根据定义可知此示例的 initializer 为 aliyun.serverless.test.example.InitializerAndStreamRequest::initialize。 实现的接口 用户的代码中必须要实现函数计算预定义的接口。上面示例中 initializer 接口实现了FunctionInitializer,initializer 接口只有一个 context 参数。 context参数 context 参数中包含一些函数的运行时信息(例如 request id/临时 AK 等)。其类型是 com.aliyun.fc.runtime.Context。 返回值 实现FunctionInitializer接口的函数无返回结果。 泛型的方式输入的函数和 initializer 结合的 demo 如下: package aliyun.serverless.test.example; import com.aliyun.fc.runtime.Context; import com.aliyun.fc.runtime.PojoRequestHandler; import com.aliyun.fc.runtime.FunctionInitializer; import com.aliyun.fc.runtime.FunctionComputeLogger; public class InitializerAndPojoRequest implements FunctionInitializer,PojoRequestHandler<SimpleRequest, SimpleResponse> { @Override public void initialize(Context context) { FunctionComputeLogger logger = context.getLogger(); logger.debug(String.format("RequestID is %s %n", context.getRequestId())); } @Override public SimpleResponse handleRequest(SimpleRequest request, Context context) { FunctionComputeLogger logger = context.getLogger(); logger.debug(String.format("RequestID is %s %n", context.getRequestId())); String message = "Hello, " + request.getFirstName() + " " + request.getLastName(); return new SimpleResponse(message); } } HTTP 触发器函数入口 HTTP 触发器函数接口 HTTP 触发器的简单示例 HTTP 触发器支持传统web应用 关于 HTTP 触发器 的使用请参考:HTTP 触发器 HTTP 触发器函数接口 函数计算提供基于 Servlet 协议的 HTTP 触发器入口,具体接口形式如下: public interface HttpRequestHandler { /** * The entrance function of fc http trigger * @param request The servlet request * @param response The servlet response * @param context The fc context * @throws IOException If IO exception happened * @throws ServletException If servlet exception happened */ public void handleRequest(HttpServletRequest request, HttpServletResponse response, Context context) throws IOException, ServletException; } 使用 HTTP 触发器需将 fc-java-core 库版本升级到 1.3.0 及以上。 HTTP 触发器的简单示例 package com.aliyun.fc.example; import java.io.IOException; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.aliyun.fc.runtime.Context; import com.aliyun.fc.runtime.HttpRequestHandler; public class Hello implements HttpRequestHandler { public void handleRequest(HttpServletRequest request, HttpServletResponse response, Context context) throws IOException, ServletException { String requestPath = (String) request.getAttribute("FC_REQUEST_PATH"); String requestURI = (String) request.getAttribute("FC_REQUEST_URI"); String requestClientIP = (String) request.getAttribute("FC_REQUEST_CLIENT_IP"); response.setStatus(200); response.setHeader("header1", "value1"); response.setHeader("header2", "value2"); String body = String.format("Path: %s\n Uri: %s\n IP: %s\n", requestPath, requestURI, requestClientIP); OutputStream out = response.getOutputStream(); out.write((body).getBytes()); out.flush(); out.close(); } } 1. HttpServletRequest 函数计算 HTTP 触发器的接口直接使用标准的 Servlet 协议。 用户的请求会封装成HttpServletRequest对象,用户请求参数、请求header等均可通过此对象获取。 除此之外,函数计算在HttpServletRequest中预封装了一些属性, 可通过 getAttribute 方法来获取, 具体包括: FC_REQUEST_PATH 获取请求的 Path FC_REQUEST_URI 获取请求的 URI FC_REQUEST_CLIENT_IP 获取请求的 ClientIP HttpServletResponse 用户可通过标准的HttpServletResponse协议对象来返回响应 header 和 body. context参数 context 参数中包含一些函数的运行时信息(例如 request id/临时 AK 等)。其类型是 com.aliyun.fc.runtime.Context。 HTTP 触发器支持传统web应用 基于 Servlet 协议的传统 web 应用能很方便的迁移到函数计算平台,目前支持的主流框架包括 Spring 、 SpringBoot 、 Struts2 等。以下示例如何通过函数计算提供的 fc-java-common 库来加载 web 应用. 打包您的 web 工程,生成 demo.war 包 上传 demo.war 包到 OSS,比如为 demo-bucket 下的 demo.war 创建函数,并设置函数初始化入口和函数入口。 函数示例代码如下: package com.aliyun.fc.example; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.aliyun.fc.runtime.Context; import com.aliyun.fc.runtime.FcAppLoader; import com.aliyun.fc.runtime.FunctionComputeLogger; import com.aliyun.fc.runtime.FunctionInitializer; import com.aliyun.fc.runtime.HttpRequestHandler; public class HelloWeb implements FunctionInitializer, HttpRequestHandler { private FcAppLoader fcAppLoader = new FcAppLoader(); private String ossEndPoint = "YourOSSEndPoint"; private String bucket = "YourOSSBucket"; private String key = "YourWarName"; private String userContextPath = "/2016-08-15/proxy/{YourServiceName}/{YourFunctionName}"; @Override public void initialize(Context context) throws IOException { FunctionComputeLogger fcLogger = context.getLogger(); fcAppLoader.setFCContext(context); // Load code from OSS fcAppLoader.loadCodeFromOSS(ossEndPoint, bucket, key); // Init webapp from code fcAppLoader.initApp(userContextPath, HelloWeb.class.getClassLoader()); } @Override public void handleRequest(HttpServletRequest request, HttpServletResponse response, Context context) throws IOException, ServletException { try { fcAppLoader.forward(request, response); } catch (Exception e) { e.printStackTrace(); } } } 引用 Maven 库 com.aliyun.fc.runtime fc-java-core 1.3.0 com.aliyun.fc.runtime fc-java-common 2.2.2 Java 代码打包 使用 maven 打包jar 使用 IDEA 打包jar 使用 maven 打包 jar 在 pom.xml 中添加 maven-assembly-plugin 插件 maven-assembly-plugin 3.1.0 jar-with-dependencies false make-assembly package single org.apache.maven.plugins maven-compiler-plugin 1.8 1.8 打包 mvn package 执行完毕后,生成的 jar 会被存放在 target 目录下。 使用 maven 打包 jar,并将依赖以 jar 的形式存放在 /lib 目录中 随着项目依赖的增加,jar 的体积会变得越来越大。而用户上传的 jar 或者 zip 代码,在执行前,首先会被解压缩,然后才会被加载、执行。因此在刚才的两种实现中,存在的一个问题是我们打包的 jar 中包含了大量的 class 文件,这无疑会增加解压缩的时间,进而增加函数的首次启动时间。 一个更好的实践是将第三方依赖以 jar 的形式,存放于 /lib 目录。 这里提供一种使用 maven-dependency-plugin 实现的方案: org.apache.maven.plugins maven-dependency-plugin copy-dependencies prepare-package copy-dependencies ${project.build.directory}/classes/lib runtime 执行完 mvn package,打包好的 jar 的目录结构为: /.class lib/*.jar 使用 IDEA 打包 jar 配置导出 jar 包的选项: java1 java2 java3 验证打包结果 rockuw-MBP:hello-java (master) $ ls -lrth total 6520 -rw-r--r-- 1 rockuw staff 3.2M Aug 31 21:03 hellofc.jar rockuw-MBP:hello-java (master) $ jar -tf hellofc.jar | head Picked up _JAVA_OPTIONS: -Duser.language=en META-INF/MANIFEST.MF example/ example/HelloFC.class example/SimpleRequest.class example/SimpleResponse.class META-INF/ META-INF// org/ org// org/apache/ 函数计算目前支持以下 Java 运行环境: OpenJDK 1.8.0 (runtime = java8) 对于 Java 运行环境的基本使用请参考Java 函数入口。以下将介绍 Java 运行环境相关特性: 使用 context 使用 logging 使用自定义的模块 异常处理 使用context context 是函数计算在运行时生成的一个对象,其中包含一些运行时的信息,用户在代码中可以使用这些信息。其定义如下,具体实现可以在 这里 找到: package com.aliyun.fc.runtime; public interface Context { public String getRequestId(); public Credentials getExecutionCredentials(); public FunctionParam getFunctionParam(); public FunctionComputeLogger getLogger(); } 可以看到 context 中包含了4个信息: RequestId: 本次调用请求的唯一 id,用户可以把它记录下来在出现问题的时候方便调查 FunctionParam: 当前调用的函数的一些基本信息如函数名/函数入口/函数内存/超时时间 ExecutionCredentials: 函数计算服务通过扮演用户提供的 服务角色获得的一组临时密钥,其有效时间是 5 分钟。用户可以在代码中使用它去访问相应的服务(例如 OSS),这就避免了用户把自己的 AK 信息写死在函数代码里。 Logger: 函数计算封装过的 logger,见下面的 使用logging 例如下面的代码使用临时密钥,向 OSS 中上传了一个文件: package example; import com.aliyun.fc.runtime.Context; import com.aliyun.fc.runtime.Credentials; import com.aliyun.fc.runtime.StreamRequestHandler; import com.aliyun.oss.OSSClient; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class HelloFC implements StreamRequestHandler { @Override public void handleRequest( InputStream inputStream, OutputStream outputStream, Context context) throws IOException { String endpoint = "oss-cn-shanghai.aliyuncs.com"; String bucketName = "my-bucket"; Credentials creds = context.getExecutionCredentials(); OSSClient client = new OSSClient( endpoint, creds.getAccessKeyId(), creds.getAccessKeySecret(), creds.getSecurityToken()); client.putObject(bucketName, "my-object", new ByteArrayInputStream(new String("hello").getBytes())); outputStream.write(new String("done").getBytes()); } } 使用logging 用户的函数通过 context.getLogger() 打印的内容会被收集到用户在创建 Service 时指定的 LogStore 中: package example; import com.aliyun.fc.runtime.Context; import com.aliyun.fc.runtime.StreamRequestHandler; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class HelloFC implements StreamRequestHandler { @Override public void handleRequest( InputStream inputStream, OutputStream outputStream, Context context) throws IOException { context.getLogger().info("hello world"); outputStream.write(new String("hello world").getBytes()); } } 上面的代码输出的日志内容是: message:2017-07-05T05:13:35.920Z a72df088-f738-cee3-e0fe-323ad89118e5 [INFO] hello world 使用 context.getLogger().warn 和 context.getLogger().error 分别可以打包 WARN/ERROR 级别的日志。 使用自定义的模块 如果用户需要使用自定义的模块,则需要在打包 jar 时,将它们与代码一起打包。以下演示如何将 OSS Java SDK 打包到项目中。 在 pom.xml 中添加 OSS java SDK: com.aliyun.fc.runtime fc-java-core 1.2.1 com.aliyun.oss aliyun-sdk-oss 2.6.1 执行通用打包流程 请参考 Java 代码打包 错误处理 用户的函数在执行过程如果抛出异常,那么函数计算会把异常捕获并将异常信息返回。例如下面的代码: package example; import com.aliyun.fc.runtime.Context; import com.aliyun.fc.runtime.StreamRequestHandler; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class HelloFC implements StreamRequestHandler { @Override public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { throw new IOException("oops"); } } 调用时收到的响应为: invk hello-java -f /tmp/a.json { "errorMessage" : "oops", "errorType" : "java.io.IOException", "errorCause" : "oops", "stackTrace" : [ "example.HelloFC.handleRequest(HelloFC.java:15)" ] } Error: Request id: 45dd8d90-6b78-cce3-087c-8bf4ebc6c9af. Error type: UnhandledInvocationError 发生异常时,函数调用的响应的HTTP header中会包含X-Fc-Error-Type: UnhandledInvocationError。

1934890530796658 2020-03-27 16:27:27 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 企业建站模板