
暂无个人介绍
开发者学堂课程【MongoDB 快速入门:MongoDB 最佳实践】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/49/detail/1006MongoDB 快速入门-MongoDB 最佳实践(一)内容介绍:一、MongoDB 应用场景与选型二、阿里云 MongoDB 产品特性及服务一、MongoDB 最佳实践1、MongoDB 数据库定位数据库分两大类:(1). OLTP(Online Transaction Processing)指在线业务,交易时业务,即联机事务处理。(2). OLAP(On-Line Analytical Processing)联机分析处理。OLTP 一般指手机应用、网页应用,与人打交道,特别是有交互式的。需要数据库能够提供毫秒级的响应。OLAP 指一般在晚上可以跑一个P,做分析处理,跑完后把结果写到表里面,第二天来拿结果即可。OLTP 和 OLAP 最大的区别就是时效性的区别,分析型和事物型的场景。MongoDB 主要是 OLTP 型的数据库,跟 Oracle、MySQL、SQL Server 等 OLTP 型 数据库对标。原则上Oracle和MySQL 可以做的事情,MongoDB 基本都能做(包括ACID事务),只是做法不太相同。甚至大家常说Mongo不支持事务,但从 MongoDB 4.0 也开始完全支持跟交易相关的强事务。MongoDB 的三个优点:(1)、横向扩展能力,数据量或并发量增加时候架构可以自动扩展。MongoDB 是原生的分布式数据库,通过它的分片技术,可以做到 TB 甚至 PB 级的数据量,以及数千数万数十万到百万级的并发,或者是连接数等等,这些都有很多案例遵循。MySQL 需要一些特定的分库分表,或者第三方的解决方案,不是原生,在很多地方仍旧存在瓶颈。(2)、MongoDB一个非常强的特性是它的灵活模型,适合迭代开发,数据模型多变场景。现在的开发都是讲究快速迭代,往往在第一个版本出来的时候,需求是不完整的,要在过程中不断完善,这个时候有一个比较灵活的、不固定结构的数据库,非常有优势,在开发时间上会节省非常多,在现代化的开发上是有助的。(3)、JSON 数据结构,适合微服务/REST API。REST API 的后面其实都是我们现在用的都是一种REST或者 JSON 的数据结构,而 MongoDB 是一种非常原生的支持。2、选型考量基于技术需求选择 MongoDB第一个指标:数据量。这是最简单,最直观的。假设单表里面要保存的处理数据超过亿或者10亿的级别,而且使用挺频繁,这个时候就可以考虑使用 MongoDB。这种场景下如果用 MySQL 做分库分表,效率、稳定性、可靠性与专门设计运载大数据量的MongoDB 相比是远远不如的。第二个指标,数据结构模型。如果数据模型非常稳定、结构、需求非常清楚,还不会有很大区别。但如果是很多时候我们做迭代开发,或者是做一些场景,我们知道这个数据还不明确, MongoDB是非常有优势的,因为它允许过程中快速迭代,不需要去修改它的 Schema,继续可以支持你的业务。第三个指标,高并发读写,MongoDB 通过分片直接支持。比如线上应用,网上有可能是有很大很多的用户一起来使用,并发读写会非常高,这个时候考虑到 MongoDB 的分布式集群,分片,可以支撑非常大的并发。基于单机的,比如 Oracle、MySQL、SQL Server 可能都会有很大的瓶颈。还有一些比如说你想做跨地区集群,甚至跨洋、跨国、跨地区,或者是做一些地理位置查询,像摩拜单车等等之类的,以及一些大宽表,我们经常要来做海量数据的这种分析,MongoDB 都是非常不错明显的优势。基于场景选择 MongoDB基于场景选择 MongoDB 常见的有:移动/小程序 APP、电商、内容管理、物联网、SaaS 应用、主机分流、实时分析、数据中台等。接下来,根据一些具体的案例对以上加强理解。1、移动应用: 对我们的用户,特别是对一些互联网公司来说,移动/小程序 APP 是必不可少的,它的特点是:它是基于REST API/JSON 进行交互,往往采用的是互联网公司的迭代式开发,两个星期一个迭代、一个版本。著名的互联网公司每天都会出版本,月月新、周周新、天天新。手机移动的场景,会有非常多的地理位置。 成功的 APP 用户往往不只是几万几十万,甚至百万千万上亿, 像微信、字节、抖音等移动应用场景,这些都是一些技术需求。MongoDB在这些方面都是不错的支撑。字节跳动: 去年的一位工程师分享过,他们刚刚开始在大规模的把 MySQL的一些集群迁移到 MongoDB,去年时,他们已经有150多个 MongoDB的集群,大概已经有350 多个用户项目在使用 MongoDB。他们在使用 MongoDB 主要的考量就是并发量和数据量达到一定地步以后,MySQL 集群的性能不能稳定工作,毛刺比较多。还有扩容困难,会花费大量时间,和业务迭代速度没法跟得上。他们每天要发布几十个版本,就算DBA 响应非常及时,效率也不会很高,总不如没有 DBA 的效率高。MongoDB 就不需要 DBA 来操作。它们的一些应用大家可以参考,是很多一部分是在线 TP 业务,直接是他们一大堆的手机应用,后面可能就是用 MongoDB,然后还有一些跟地理位置相关的查询,是MongoDB来支撑的。有不少游戏的日志、运行、状态,都是通过 MongoDB支撑,还有一些就是中台系统,里面很多用MongoDB来做一些元数据管理。主机分流/读写分离:这个场景在金融行业比较常见。金融行业的特点是业务系统、交易系统用的很多的都是IBM或者小型机或是主机,上面运行一些 DB2 或者比较老的关系数据库。有个特点是使用时按量付费的,它并不是买断的,当读一次写一次都有额外的计费,叫 MIPS。最近几年,银行在做大量手机端的开发,把这些交易数据放到手机端,这时,手机端对交易数据的读的流量猛增。根据一个银行的统计,现在99%的流量都是读,这些读的流量对成本增加非常高,这是一个原因,还有其他原因就是对这种关系业务模型改动非常困难,想去创新,想去增加一些新的业务,需要非常高的成本。所以有一个策略,就是把这些数据拿出来,做读写分离,用另外一种数据库来支持这种读。在这样的场景下,MongoDB 是非常好的选择。因为MongoDB有非常好的查询能力,性能非常高,相比关系数据库。 MongoDB 是基于内存的一种读写,它的分布式意味着可以把海量的数据、几年的历史数据拿过来放到热数据库里面,让其支撑手机端的交易查询。比如海外的花旗银行,Barclays国内的中国银行在近些年上新了这种业务系统。实例场景:中国银行首先业务需求是希望在手机银行里支撑历史交易数据的查询,也就是说,他们想跟支付宝一样。它们想查询三年的账单,但三年数据每天都有 6000 万,月末,还有几个亿,加上三年算下来有几百、几千亿的数据,是非常海量的数据量中国银行希望能够在手机 APP 上能够让用户直接来查询历史的交易数据,还有一些其他金融日历等应用,那这些两个 APP 的需求,就是说需要把用户所有的或者最近几年的这种金融数据都能够放到一个快速查询的库里面来做这个事情。数据还是比较大的,因为他们一天的这种交易都有6000万,多的时候有好几个亿,他们希望第一个阶段能够支撑三年的数据,算下来有600亿,这样的数据量放在一个库里面肯定是不可能,分库分表也非常麻烦,因此他们最终是选择了 MongoDB 分片集群来做这样的事情。上图所示是架构图,首先它把借记卡系统和信用卡系统有的基于Oracle 的,使用 CDC 的技术,是实时数据库同步的机制,把数据从库里边“增删改”都拿出来,通过 Spark 进行计算处理,然后放到 MongoDB 的集群里面,再变成 JSON 文件的格式, 再通过 API 的后端,把这些数据暴露出去给手机 APP 的前端。通过这种方式,首先,数据实时的从主机系统同步过来,其次,通过 API 的方式,可以提供非常高效率、高性能的查询给到手机 APP,保证用户的体验。这种场景是比较常见的金融数据的查询库,在很多银行都得到了使用。数据中台:数据中台是现在最热的名词之一。它的架构是把企业多个业务系统数据进行统一汇聚到一个中台,在上面通过治理,服务出去,这样可以快速的提高企业的业务的响应能力,形成大中台、小前端的方式。1、场景特点:多源系统数据汇聚场景,数据模型多样化。存储量较大,需要能够分布式存储。快速业务响应能力意味着快速数据建模和快速发布。支持企业所有业务系统的数据需求,查询性能需要保证。基于数据中台场景的特性,MongoDB 的结构非常适合多元数据的聚合。不同系统的数据结构,就算是同一类型,比如都是客户,它有非常大的差异性,字段的个数、属性的个数都是不一样的。这时,建一张新的 Schema结构是非常困难的。通过 JSON的这种动态模型,不需要考虑很多复杂的问题,很容易把它结合起来。MongoDB 的横向扩展能力,可以让一套系统支撑多套业务系统的数据存储能力。 MongoDB 还有内存缓存的读写能力,或者是快速高并发的读能力, 可以支撑很多数据中台业务。基于上述,MongoDB是个非常好的一个实时数据中台存储解决方案。3、场景举例(1)数据中台案例 – 周生生全渠道实时数据服务平台:周生生珠宝商在中港台澳各地有数百家门店,建立数据服务平台的原因是,中广台澳各地有很多套业务系统,有销售、库存、商品、会员等等,数据散落在这些系统中间,并没有统一。新业务他们想打造一套全渠道体验,去了解客户的所有信息或是订单、跨地或是想做业务,也需要完整的最新的库存信息。基于上述构建了业务数据中台系统,使用 Tap data 实时同步功能,基于 Log miner 和 CDC 机制,把数据从 Oracle 里面把它抽出来,实时同步到 MongoDB。过程中并采用实时处理能力,把基于关系模型的各种多表合并成一个JSON,再实时的固化视图放在 MongoDB 里面。在MongoDB的价值就是能够存储数十亿笔资料,同时能够提供毫秒级的响应。另外一点,它能够提供中港台跨地区分布,保证用户能够最快访问数据。然后结合 API 能力,让前端开发小程序、APP、需要API的时候,原先需要几个星期几个月,通过中台可以很快将API发表出来,全面提高效率。这些都依赖于 MongoDB 数据库非常强的整合能力和查询能力,也是中台所需要数据的特性。实时分析:分析的话大部分时间是用大数据平台做的,比如说我们常说的个性化推荐,标签等系统的一般做法是晚上将全量的用户行为数据,整个的跑一遍结合其他数据跑出一些个性化的标签出来,例如用户喜欢什么样的内容等等,然后放到一个关系库里面,第二天当你去访问的时候,就会得到一些这样的结果。但这种做法有两大缺陷:一是效率很低,因为活跃用户比例很低,所以每天晚上都在跑100%的用户,对计算资源的需求非常大,其中90%的数据都是没用的。因为很多用户没有登陆使用。二是数据的实时性,因为运算基于前一天的结果,所以有些实时的场景推进系统,比如看一个网页的时候,根据第一个网页点击的内容,给你推荐一些相关的信息,这个时候就没法做到了。所以一些实时推进系统是很有必要的,这些系统的特色是要求快速响应,这样的数据系统不仅需要相应海量数据,还要响应短时间内秒击进行快速计算。MongoDB在此方面可以做快速的聚合性计算,做统计分析,得到这种结果,是否满足一些条件来推荐相应的信息。另外如果给足够的内存,也可以在内存里面计算。世界顶级航旅服务商:亿级数据量实时分析:世界级的这种航旅服务商除了国内一些企业,在海外基本可以支撑世界上大部分的航空公司的票务、查询、订票、选票、票价计算等等场景。他们每天要处理 16 亿的预定等相关的请求与分析。所谓的分析是要根据用户在查询的目的地、时间段,推荐比较合适的路线,或者相应的航旅产品,酒店之类。一种做法可以事先计算,那么用户量太大,根本没法计算。另外一种场景,使用 MongoDB 实时计算能力,在几十台物理机上部署了很多的微分片,把数据打散在这些机器上,当有需求过来,可以通过并行机制,很快的把用户的数据基于 ID、目的地、时间段进行过滤,这样输入的分析数据就比全量数据少了几个数量级。通过这种情况可以做到准时性的数据分析,得出一些推进的结果。电商:电商场景的特点是:商品信息特别多,而且不好管理。因为不同的商品有非常不同的属性,信息是包罗万象,无法用一张表表示信息,差异太大。数据库模式设计困难,关系一般采用EKB,但查询也是非常麻烦,查询维护也是很大痛点。当并发访问量大的时候,压力也是非常大。MongoDB 在电商场景下有非常独特的优势,JSON 动态模型可以允许同一张商品表里面有非常不同的字段类型。也就是同一张表可以有自行车、衣服、电脑,电脑可能是有50个字段,自行车可能有 30个字段,衣服可能有20个字段都没问题。这种变化的模型,正是MongoDB非常好的优势。世界顶级网络设备生产商:电商平台重构:思科是一个做网络设备的公司,两年前把基于 Oracle 的电商系统,整个迁移到了MongoDB上面,这上面每天有几百亿美元的流水,这是非常好的一个业务场景。包括商品信息、订单、用户交互。迁移过来以后,14个关系型表集合成到1个集合,非常高效,看上去一目了然。60个索引优化到7个,因为表的数量少,效率增加了非常多。代码量减少了12万。之前的 3~5 秒页面刷新时间降低到小于一秒,都是非常实际的价值呈现。内容管理:内容管理是 MongoDB 的强项,最开始是以博客系统为例,出现在大众视野。原因是博客、营销系统、内容管理系统,涉及到的都是一些非结构化、半结构化、多结构化的数据管理,传统数据库只能做结构化的数据。当有文本、配置文件、PDF、音频、视频需要统一管理时,关系数据库就吃力了。MongoDB则非常适合。它JSON 可以支持各种结构的数据,甚至二进制的数据。一些文本、 日志更不在话下,它的分片结构可以支撑海量数据。所以Gartner魔力象限里面最顶上的两位 Adobe AEM 和 Sitecore 两个 CMS 文 档管理系统的软件,都是用的 MongoDB 来做数据管理和存储。物联网:物联网使用非常广泛。它的技术特性是:首先它有非常多的传感器,每个传感器都是不同厂家提供的,它并没有标准的数据模型。如果要管理看上去是一个传感器,但实际上它有非常不同的数据类型和属性需要来支持和查询管理,这个时候有 JSON 模型就非常有优势。另外传感器是机器数据,频繁的时候可以每秒都一次,5 秒一次,甚至每 100 毫秒 1 次,如此,数据不断的进到系统里面。如果没有能够支撑高并发海量数据的系统,是无法支撑数据库的,因为数据很快就增长了百亿、千亿级。因为这个原因,类似于华为 / Bosch / Mindsphere 这些著名的物联网平台,后面都是采用 MongoDB。 MongoDB 什么时候不太适用?MongoDB 有一项需要关注的弱点,就是他的关联能力。MongoDB 按照我们的最佳实践,设计不建议有太多的分表设计,那当你不能做到这一点的时候,表很多的时候,这个时候 MongoDB 就会有一些局限性,比如说我们做数仓的时候,往往是要建各种各样的维度表,通过复杂的关联联合起来,做一些复杂的计算,这些在 MongoDB 中很困难。又比如说,ERP,ERP 其实里面的数据表、实体一级对象非常多,你很难把它实现成就少数的集成表,所以这种情况下你会发现,很多时候要用到多种关联的时候才能做事情的时候,也会有一些局限性。如果有些场景的数据模型是非常固定的,就这10个字段,用了20年了,我现在只重写一遍 UI,改写体验,但是后台的数据结构、流程都是非常明确的,数据量不会太大,比如这个财务系统,内部的,那这个时候你用 APP 其实不是非常必要,因为它的弹性模型、分布完全没有意义。
开发者学堂课程【场景实践 - 基于阿里云PAI机器学习平台使用时间序列分解模型预测商品销量:商品销量预测方法】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/523/detail/7067商品销量预测方法内容介绍:一、常见预测方法——因果预测法二、常见预测方法——时间序列法三、时间序列分解四、ARIMA五、价格弹性时间序列分解模型六、模型优势一、常见预测方法——因果预测法根据事物之间的因果关系来预测事物的发展和变化,通过对预测目标有直接或间接影响因素的分析找出其变化的规律,并根据这种变化规律来确定预测值。因果预测法也叫回归法,一般可以分为一元线性回归、多元线性回归和自回归。其中一元线性回归分析一个自变量与因变量之间的相关关系,然后用一元回归方程进行预测。例如根据居民的收入的变化预测某种日常消耗品的需求量。多元线性回归法会分析因变量与若干个自变量之间的相关关系,运用多元回归方程,从若干个自变量的变化去预测因变量的变化。例如依据商品的促销手、促销幅度的变化,预测商品的销售量。自回归利用历史数据,在不同时期的取值之间的依存关系,建立起回归方式进行预测。比如根据消费者目前的食品消费水平,就可以预测出下一期的食品消费水平,其中因变量是预测值Yt,而自变量则是因变量的滞后值即之前的那个值 Yt-1和 Yt-2。二、常见预测方法——时间序列法1.时间序列也叫时间数列、历史复数或动态数列。它是将某种统计指标的数值,按时间先后顺序排到所形成的数列。2.时间序列预测法通过编制和分析时间序列,根据时间序列所反映出来的发展过程、方向和趋势,进行类推或延伸,借以预测下一段时间或以后若干年内可能达到的水平。3.移动平均法相继移动计算若干时期的算术平均数作为下期预测值Xn =1/n(Xt-1+ Xt-2+ Xt-3 + ...+ Xt-n)从回归分析法的角度看,时间序列分析法实际上是一种特殊的回归分析法,因为时间序列不考虑事物之间的因果关系或其他相关关系,而且研究对象的时间与时间的相关关系。对时间序列进行预测的时候有以下几种方法,简单平均法,把N个历史数值作为观察值,求出算术平均数作为下期预测值,这种方法假设是过去,这样今后也会这样,把近期和远期的数据看成是一样的,因此只适用于事物变化不大的趋势。指数平滑法根据历史数据的上期实际值和预测值进行预测,优点是只需要有上期的实际值和上期的预测值,用指数加减的办法就可以计算下次的预测值,这样可以节省很多数据和处理数据的时间,减少数据的组成量,方法比较简便。缺点就是没有包含远期预期数据可能忽略了很多信息,造成预测不够准确。移动平均法就是相似移动计算若干个时期的算术平均数作为下期的预测值。公式计算法 Xn =1/n(Xt-1+ Xt-2+ Xt-3 + ...+ Xt-n),xt是当时间为T时的预测值,N是要计算移动平均的周期数,Xt-1+ Xt-2+ Xt-3 + ...+ Xt-n表示前一期前两期一直到前N期的实际值。举一个简单例子,比如计算t=6的预测值,如果要取5个周期的历史数值做移动平均,那么N=5带入公式中就 X5+ X4+ X3+ ...+ X1季节趋势分析法是根据每年重复出现的周期性季节变动,预测未来的季节性变动趋势,一般使用的是季度或者月度频率法,把各年度的数值按季度或月度求和之后算出平均数。举个例子假设总共有三年的完全数据,每年1月份的季节变动数值都等于将这三年的1月份数值加起来之后除以三,因为总共有三个一月的,这样求得的每年相同月份的季节变动都是相同的。三、时间序列分解对于时间序列进行分解能够捕捉到4种模式长期趋势( T )●现象在较长时期内受某种根本性因素作用而形成的总的变动趋势季节变动( S )●现象在一年内随着季节的变化而发生的有规律的周期性变动循环变动( C )●现象以若干年为周期所呈现出的波浪起伏形态的有规律的变动不规则变动(R )●一种无规律可循的变动长期趋势(trend)的反映数据在一个较长时间段内的发展方向,表现为近似直线的持续向上或者向下或者平稳的一个趋势,它一般是受某种根本性因素作用而形成的,比如产品的生命周期或者社会总体的经济形式。季节变动(seasonality)反映了现象在一年内随着季节的变化而发生的有规律的周期性变动,比如毛衣在秋天的冬天卖的比较多,春夏卖的比较少。循环变动(random error)是受各种因素影响而形成的上下起伏不定的波动,注意季节变动和循环变动区别是循环变动没有固定周期,可能是几年。但季节变动是有固定周期的,基本就是一年。不规则变动(cycle)又称随机变动,是受各种偶然因素影响所形成的。四、ARIMA1、定义自回归移动平均模型(Autoregressive Integrated Moving Average Model)时间序列预测法。记作 ARIMA(p,d,q),是统计模型(statistic model)中最常见的一种用来进行预测的模型参数和数学形式p--采用的时间序列数据本身的滞后数(lags) ,也叫Auto-Regressive项d--时间序列变为平稳时所做的差分次数,也叫 Integrated项原始序列11,12,13,14,15差分序列1,1,1,1差分处理就是新增序列,新序列的值是原始序列的后一项减去前一项,比如原始序列为11-15,共5条记录,可以看出一个增长趋势。差分处理后新增序列就为1,1,1,1,成为了一个平稳序列。q--移动平均项数,也叫 Moving Average 项2、基本思想将预测对象随时间推移而形成的非平稳时间序列转化为平稳时间序列,然后对因变量的滞后值以及随机误差项的现值和滞后值进行回归。此模型一旦被识别后就可以从时间序列的过去值及现在值来预测未来值。ARIMA 的优点是模型只需要借助内在的变量就可以进行预测,而不需要其他外在变量,比较简单。ARIMA 考虑数据在时间序列上的依存性,又考虑了随机波动的干扰性。对于短期趋势的预测,准确度是比较高的。ARIMA 的缺点是要求数据是稳定的或者是通过差分后是稳定的,如果经过差分后仍然是不稳定的数据是无法捕捉到规律的,因为股票数据无法使用 ARIMA 进行预测的原因就是股票数据常常受政策和新闻的影响活动。从原理上来看,一方面销量是受很多因素影响是不稳定的,如果使用 ARIMA 进行预测,准确率可能无法保证。另一方面 ARIMA 模型无法预测定价和促销类型对销量造成影响,这样预测的销量无法指导利益策略,提升利润。五、价格弹性时间序列分解模型*促销幅度%=(标准价格–定价)/标准价格*100%设︰需求价格弹性不因时间而波动1.训练集回归真实销量 q,促销幅度%,促销类型2.回归系数q=a+b*p+c*f3.训练集回归预测销量Q4.训练集预测差值q-Q= dQ5.训练集时间序列分解dQ ~ U,T,C,S,R6.时间序列系数U,T,C,S,R7.测试集时间序列预测销量 dQ_f8.测试集回归预测销量 Q_f9.最终预测销量dQ_f +Q_f价格弹性时间序列分解模型,也就是将促销幅度、促销手段、时间序列都考虑进来,进行多元线性回归,并将时间序列进行分解的一个模型。首先定一下促销速度百分比这个因素,它的计算方式是(标准价格–定价)/标准价格*100%。如果数据中没有标准价格,那么也可以用历史的平均价格来代替。举个例子,某个产品的历史价格去算出平均后是100,但定价为95元,那么促销幅度百分比就是5%。按照顺序看一下模型的逻辑和流程。首先第1步和第2步,将历史数据拆分成训练集和测试集,在训练集中将促销幅度和促销类型作为自变量。将真实的销量q作为因变量进行多元线性回归后能得到回归方程式。第3步和第4步,根据刚才算出来的回归系数和训练集里面的历史数据进行预测。预测的销量记为 Q,然后计算实际销量q和回归预算的销量 Q 之间的误差,记作 dQ。基本思想是将促销幅度和促销类型对销量造成的影响剥离出来,只留下时间造成的影响即为真实值和回归预测值之间的差。接下来第5步和第6步,对误差使用时间序列分解模型分解,得到时间序列分解模型的参数与 U,T,C,S,R。其中U代表序列的平均值,在下一个章节中详细介绍如何计算这些参数。到这一步为止都是在训练集中进行的回归预测和时间序列分解,目的是为了得到所有的系数。第7步和第8步,根据算出来的系数和测试集中的自变量,包括时间T促销幅度和促销类型,分别计算时间序列分解模型和回归模型预测值,将这两个预测值加起来就是最终的预测值。注意模型的建立是基于一个假设,需求价值的弹性不会因时间而波动或者说时间会影响商品的需求价格弹性。六、模型优势·洞察价格和促销手段对销量的影响·根据需求价格弹性,更好地定价·还原时间对销量的真实影响·基于产品生命周期更好地决策·降低缺货概率,减少不必要的库存·结合商业信息,改变循环变动C模型的优势以下几点,它能够提供额外信息,这是 ARIMA 所不能提供的。将促销幅度和促销类型作为单独的自变量加入到回归模型中,可以洞察促销对销量的影响。根据商品的弹性,方便企业更好的定价和提升利润,比如高弹性的商品,薄利多销,低弹性的商品少打折甚至提升价格。对数据同时进行回归和时间序列分解可以更好的还原实际情况,如果只对数据进行时间序列分解,商场里面类似全场促销的活动会引起销量波动,使时间序列的参数失真,所以如果能够将促销对销量的影响单独剥离出来,那么就可以找出商品因为时间产生的变化。根据商品的长期趋势可以看出商品属于生命周期的哪个阶段,然后根据信息做一些其他决策,通过计算出的季节变动的规律,可以总结出哪些产品具有比较明显的季节性,这样就可以提前计划好在这个产品的旺季策略性的增加安全库存,以降低缺货的概率。同时适当的促销最大化利润,这样比随机地进行促销更有针对性的效果,在进入淡季之前可以开始减少订货。使淡季时的库存保持在一个最低的标准以降低成本。对于爆款和滞销的款式也是一样的道理,时间是分析方法的缺点是预测的时候循环变动C的值必须手动输入,而无法用模型导出,不过这个问题可以通过忽略循环变动或者假设一个恒定的C值来避开,有些人认为其实是一种优势,因为他们可以利用这一点将知道的商业信息加入到预测模型中,以上是商品销量的预测。
开发者学堂课程【全面讲解 Spring Cloud Alibaba 技术栈(知识精讲+项目实战)第四阶段:短信服务 Api 介绍】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/686/detail/11915短信服务 Api 介绍研究短信文档 Api 的使用,打开帮助文档。有 SDK 参考新版、开发指南旧版,使用的是旧版文档。需要关注的有两部分,第一部分是 API 文档,具体的定义了每个 API的详细参数以及返回值。第二个是 SDK 以及 DEMO 如果 API 文档看不特别清楚,可以下载相关的 DEMO 进行查看。首先来关注一下API文档,选择 Java,里面有 API 短信发送,短信查询,短信消息以及批量发送。API文档HTTP协议及签名JAVA短信发送APl(SendSms)-- -JAVA短信查询API(QuerySendDetalls)--- JAVA短信消息API---JAVA短信批量发送API(SendBatchSms)PHP1、短信发送 API (SendSms)---Java调用 SendSms 发送短信(1)请求参数第一部分是 API 的名称、怎么调用,第二部分是给 API 传递、打成参数,第三个是 API 会给哪些响应,如何根据响应来判断 API 是否调用成功,入参、出参就是返回值。第一个是手机号,第二个是签名,第三个是模板 code 。模板是取得模板 code 码,因为已经明确说明要的是 template code最后一个叫 TemplateParam 模板参数,申请模板的时候常见模板库是有变量的,需要给变量传递实际的值,这是存在的意义,需要 JSON,调用方法需要传递的请求参数。中间两个已经准备好,上面手机号和下面手机号需要用的时候再来准备好。(2)返回数据返回数据第一个叫回执的ID,也是短信发送以后在内部的流水号,可以关注也可以不关注,意义不是特别大。第二个是 Code 代码比较重要,OK 是成功,如果不是 OK 就有问题,Message 一般用在当出现错误的时候,根据具体的消息来判断错误原因。后边还有request ID 是请求时的一个内部的 ID 号,意义也不是特别大,主要关注的是 code 码和 message 码。2、短信查询(QuerySendDetails)调用 QuerySendDetails 接口查看短信发送记录和发送状态。短信查询也有详细的介绍(1)请求参数前两个跟分页相关,短信查询会涉及到很多,手机号、发送时间还有流水号,流水号可以根据某一条流水具体查询一条短信,如果不想用流水号,可以用时间来查询,查询某一个时间段的短信。(2)返回数据返回数据里面前两个是返回的状态,下面是返回的具体信息,包括采购 ID,短信的明细还有一段时间发送的总条数,明细是一个数组,里面是一个个的发送出去短信的具体信息。关于短信消息 API---Java、短信批量发送两个 API,可以参照学习方式了解。3、功能测试第1步:引入阿里云服务依赖<!--短信发送--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alicloud-sms</artifactid></dependency>第2步:使用阿里云提供的 Demo 测试短信发送public class smsDemo {//产品名称:云通信短信API产品,开发者无需替换static final String product = "Dysmsapi";//产品域名,开发者无需替换static final String domain ="dysmsapi.aliyuncs.com";//TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找) static final string accessKeyId = "yourAccessKeyId";static final string accessKeySecret="yourAccessKeySecret"://产品名称:云通信短信 API 产品,开发者无需替换static final String domain ="dysmsapi.aliyuncs.com".//TODO 此处需要替换成开发者自己的 AK(在阿里云访问控制台寻找) static final string accessKeyId ="yourAccesskeyId";static final string accessKeySecret="yourAccessKeySecret"://短信发送public static SendSmsResponse sendSmsO throwsclientExcep tion {//可自助调整超时时间System.setProperty("sun.net.client.defaultConnectTimeout","10000"); System.setProperty("sun.net.client.defaultReadTimeout","10000");//初始化 acsc1ient,暂不支持 region 化IclientProfile profile =DefaultProfile.getProfile("cn-hangzhou ",accessKeyId,accessKeySecret);DefaultProfile.addEndpoint("cn-hangzhou","cn-hangzhou",product,domain); IAcsClient acsClient=new DefaultAcsClient(profile);//组装请求对象-具体描述见控制台-文档部分内容SendSmsRequest request=newSendSmsRequest;//必填:待发送手机号request.setPhoneNumbers(“150000000”;)//必填:短信签名-可在短信控制台中找到 request.setsignName("云通信");//必填:短信模板-可在短信控制台中找到request.setTemplateCode("SMS_100000);//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时。此处的值为request.setTemplateParam("{\"name":\"Tom ",\"code ": "123\"}");//选填-上行短信扩展码(无特殊需求用户请忽略此字段)//request.setSmsUpExtendCode("90997");//可选:outid为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者 request.setoutId("youroutId");//hint 此处可能会抛出异常.注意 catchSendSmsResponse sendSmsResponse=acsclientqetAcsRespon se(request);return sendsmsResponse:}//短信查询public static QuerySendDetailsResponse auerySendDetails(Strina bizid) throws clientException{//可自助调整超时时间 system.setProperty("sun.net.client.defaultConnectTimeout","10000"); System.setProperty("sun.net.client.defaultReadTimeout","10000");//初始化 acsc1ient,暂不支持 region 化IclientProfile profile=DefaultProfile.getProfile("cn-hangzhou",accessKeyIdaccessKeySecret);DefaultProfile.addEndpoint("cn-hangzhou","cn-hangzhou",product,domain);IAcsclient acsclient=newDefaultAcsClient(profile)://组装请求对象QuerySendDetailsRequest request=newQuerySendDetailsReq uest);//必填-号码request.setPhoneNumber(15000);//可选-流水号request.setBizId(bizId);//必填-发送日期 支持30天内记录查询,格式yyyyMMddSimpleDateFormatft=newSimpleDateFormat("yyyyMMdd"); request.setSendDate(ft.format(newDate0));//必填-页大小request.setPageSize(10L);//必填-当前页码从1开始计数request.setCurrentPage(1L);//hint 此处可能会抛出异常,注意 catchQuerySendDetailsResponse querySendDetailsResponseacsclient.getAcsResponse(request);return querySendDetailsResponse;}public static void main(String[] args) throwsclientException, InterruptedException {//发短信SendSmsResponse response=sendSms);System.out.print1n("短信接口返回的数据----------------");System.outprint1n("Code="+responsegetCode());system.out.print1n("Message="+response.getMessage());System.out.print1n("RequestId="+response.getRequestIdo):System.outprint1n("BizId="+response.getBizIdO));Thread.s1eep(3000L);//查明细if(response.getCode()!=nu11&&responsegetCode().equa1s("OK")){QuerySendDetailsResponse querySendDetailsResponse=querySendDetails(responsegetBizId());System.out.print1n("短信明细查询接口返回数据----------------");System.out.print1n("Code="+querySendDetai1sResponsegetCode());system.out.print1n("Message="+querySendDetailsResponsegetMessage()); int i =0;for(QuerySendDetai1sResponse.SmsSendDetai1DTO smsSendDetai1DTO:querysendDetailsResponsegetSmsSendDetai1DTOs()){System.out.print1n("SmsSendDetai1DTo["+i+"]:");SystemLout.print1n("Content="+smsSendDetai1DTo.getContent()); System.out.print1n("ErrCode="+smsSendDetai1DOgetErrCode()); System.out.print1n("OutId="+smsSendDetailDTo.getutid());System.out.print1n("phoneNum="+smsSendDetailDTOgetPhoneNum(());System.out.print1n("ReceiveDate="+smsSendDetailo.aetReceiveDate)): System.out.print1n("SendDate="+smsSendDetai1DogetsendDate());System.out.print1n("Sendstatus="+smsSendDetailDo.getSendStatus()): System.out.print1n("Template="+smsSendDetai1DTogetTemplateCode());}System.out.print1n("TotalCount="+querySendDetai1sResponsegetTotalCount()) System.out.print1n("RequestId="+querySendDetailsResponsegetRequestid());}}}Demo 来自 SDK 及 DEMO 下载,里面提供好了 Demo 案例,只需要下载对应的版本找到用户微服务 pom.xml 加入依赖:<groupid>org.springtramework.boot/groupia><artifactId>spring-boot-starter-web</artifactid></dependenay><!--shop-common--><dependenay><groupId>com.itheima</groupid><artifactId>shop-common</artifactid><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>com.alibaba.cloud</groupid><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactid</dependency><dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactid<version>2.0.2</version></dependency><dependency><groupId>org.apache.rocketmg</groupId><artifactId>rocketma-client</artifactId><version>4.4.0</version></dependency><!--短信发送--><dependency><groupId>com.alibaba.cloud</groupid><artifactId>spring-cloud-alicloud-sms</artifactid></dependenay></dependencies>新建一个 Demo import com.aliyuncs.DefaultAcsClient; importcom.alivuncs. IAcsclient;importcom.aliyuncs.dysmsapimodelv20170525.uerySendDetailsRequest; importcom.aliyuncs.dysmsapi.modelv20170525.QuerySendDetailsResponse importcom.aliyuncs.dysmsapi.modelv20170525.SendSmsRequest; importcom.aliyuncs.dysmsapi.model.v20170525.SendsmsResponse; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profileIclientProfile;import iava.text.SimpleDateFormat;public class SmsDemoTest {//产品名称:云通信短信API产品,开发者无需替换static final String product = "Dysmsapi";//产品域名,开发者无需替换static final String domain ="dysmsapi.aliyuncs.com";//TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找) static final string accessKeyId = "yourAccessKeyId";static final string accessKeySecret="yourAccessKeySecret"://产品名称:云通信短信 API 产品,开发者无需替换static final String domain ="dysmsapi.aliyuncs.com".//TODO 此处需要替换成开发者自己的 AK(在阿里云访问控制台寻找) static final string accessKeyId ="yourAccesskeyId";static final string accessKeySecret="yourAccessKeySecret"://短信发送public static SendSmsResponse sendSmsO throwsclientExcep tion {//可自助调整超时时间System.setProperty("sun.net.client.defaultConnectTimeout","10000");System.setProperty("sun.net.client.defaultReadTimeout","10000");//初始化 acsc1ient,暂不支持 region 化IclientProfile profile =DefaultProfile.getProfile("cn-hangzhou ",accessKeyId,accessKeySecret);DefaultProfile.addEndpoint("cn-hangzhou","cn-hangzhou",product,domain); IAcsClient acsClient=new DefaultAcsClient(profile);//组装请求对象-具体描述见控制台-文档部分内容SendSmsRequest request=newSendSmsRequest;//必填:待发送手机号request.setPhoneNumbers(“150000000”;)//必填:短信签名-可在短信控制台中找到 request.setsignName("云通信");//必填:短信模板-可在短信控制台中找到request.setTemplateCode("SMS_100000);//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时。此处的值为request.setTemplateParam("{\"name":\"Tom ",\"code ": "123\"}");//选填-上行短信扩展码(无特殊需求用户请忽略此字段)//request.setSmsUpExtendCode("90997");//可选:outid为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者 request.setoutId("youroutId");//hint 此处可能会抛出异常.注意 catchSendSmsResponsesendSmsResponse=acsclientqetAcsRespon se(request);return sendsmsResponse:}//短信查询public static QuerySendDetailsResponse auerySendDetails (Strina bizid) throws clientException{//可自助调整超时时间 system.setProperty("sun.net.client.defaultConnectTimeout","10000");System.setProperty("sun.net.client.defaultReadTimeout","10000");//初始化 acsclient,暂不支持 region 化IclientProfile profile=DefaultProfile.getProfile("cn-hangzhou", accessKeyId ,accessKeySecret);DefaultProfile.addEndpoint("cn-hangzhou","cn-hangzhou",product,domain);Acsclient acsclient=newDefaultAcsClient(profile)://组装请求对象QuerySendDetailsRequest request=new QuerySendDetailsReq uest);//必填-号码request.setPhoneNumber(15000);//可选-流水号request.setBizId(bizId);//必填-发送日期 支持30天内记录查询,格式yyyyMMddSimpleDateFormat ft=newSimpleDateFormat("yyyyMMdd"); request.setSendDate(ft.format(newDate());//必填-页大小request.setPageSize(10L);//必填-当前页码从1开始计数request.setCurrentPage(1L);//hint 此处可能会抛出异常,注意 catchQuerySendDetailsResponse querySendDetailsResponseacscli ent.getAcsResponse(request);return querySendDetailsResponse;}public static void main(String[] args) throwsclientException, InterruptedException {//发短信SendSmsResponse response=sendSms);System.out.print1n("短信接口返回的数据----------------");System.outprint1n("Code="+responsegetCode());system.out.print1n("Message="+response.getMessage());System.out.print1n("RequestId="+response.getRequestIdo):System.outprint1n("BizId="+response.getBizIdO));Thread.s1eep(3000L);//查明细if(response.getCode()!=nu11&&responsegetCode().equa1s("OK")){QuerySendDetailsResponse querySendDetailsResponse=querySendDetails(responsegetBizId());System.out.print1n("短信明细查询接口返回数据----------------");System.out.print1n("Code="+querySendDetai1sResponsegetCode());system.out.print1n("Message="+querySendDetailsResponsegetMessage()); int i =0;for(QuerySendDetai1sResponse.SmsSendDetai1DTOsmsSendDetai1DTO:querysendDetailsResponsegetSmsSendDetai1DTOs()){System.out.print1n("SmsSendDetai1DTo["+i+"]:");SystemLout.print1n("Content="+smsSendDetai1DTo.getContent()); System.out.print1n("ErrCode="+smsSendDetai1DOgetErrCode()); System.out.print1n("OutId="+smsSendDetailDTo.getutid());System.out.print1n("phoneNum="+smsSendDetailDTOgetPhoneNum(());System.out.print1n("ReceiveDate="+smsSendDetailo.aetReceiveDate)): System.out.print1n("SendDate="+smsSendDetai1DogetsendDate());System.out.print1n("Sendstatus="+smsSendDetailDo.getSendStatus()): System.out.print1n("Template="+smsSendDetai1DTogetTemplateCode());}System.out.print1n("TotalCount="+querySendDetai1sResponsegetTotalCount()) System.out.print1n("RequestId="+querySendDetailsResponsegetRequestid());}}}第一个是短信发送,第二个是短信查询,有几个变量需要注意,前两个变量是阿里云内部的一些东西,不需要改默认就可以,下边两个是认证的密钥、ID以及密钥,做申请的时候申请了三部分东西,只用到了两个,第一个认证秘钥没有使用可以通过输入手机号显示出来,把一对密钥拷过来,然后把一段替换掉就可以,一定替换成自己的。接下来是发送短信,发送短信需要大家填入的东西都在一块,手机号填一下、模板的 code 填一下,签名填,需要设置的模板里面的参数,比如 code 代码需要自己写一下,主要替换掉就可以其他的不用管,这是短信发送 API 的使用,接下来短信查询也很简单的,提供了一个参数,按照要按照流水 ID查,不想用流水 ID 查,可以通过手机号、时间段进行简修改解锁条件。4、下单之后发送短信(1)在shop-user模块中加入sms依赖<!--短信发送--><dependency><groupId>com.alibaba.cloud</groupid><artifactId>spring-cloud-alicloud-sms</artifactid></dependency>(2)将阿里短信给出的 demo 封装成工具类public class Smsutil {//替换成自己申请的accessKeyIdprivate static string accessKeyId ="LTAIML1f8NKYXn1M";//替换成自己申请的accessKeySecretprivate statiq string accesskeysecret ="hqyw0zTNzeSIFnZhM EkOazxvvcr3Gj";static final string product = "Dysmsapi";static final string domain ="dysmsapi.aliyuncs.com";/***发送短信** @param phoneNumbers 要发送短信到哪个手机号* @param signName 短信签名[必须使用前面申请的]* @param templateCode 短信短信模板 ID[必须使用前面申请的]*@param param 模板中${ code }位置传递的内容 */public static void sendsms(string phoneNumbers, StringsignName, String templateCode, String param) {try {System.setProperty("sun.net.client.defaultConnectTimeout","10000");System.setProperty("sun.net.client.defaultReadTimeout","10000");//初始化 acsclient,暂不支持 region 化IclientProfile profile =DefaultProfile.getProfile("cn-hangzhou",accesskeyId,accessKeySecret);DefaultProfile.addEndpoint("cn-hangzhou"."cn-hangzhou".product.domain): IAcsclient acsclient=newDefaultAcsclient(profile);SendSmsRequest request=new SendSmsRequest); request.setPhoneNumbers(phoneNumbers); request.setsignName(signName);request.setTemplateCode(templateCode);request.setTemplateParam(param);request.setoutId("yourOutId");SendSmsResponsesendSmsResponse=acsc1ientgetAcsRespo nse(request); if (!"ok".equa1s(sendSmsResponse.getCode())){throw newRuntimeException(sendSmsResponsegetMessage ());}} catch (Exception e) {e.printstackTrace();throw new RuntimeException("发送短信失败");}}}(3)修改短信发送的服务//发送短信的服务 @s1f4j@Service@RocketMQMessageListener(consumerGroup ="shop",topic = "order-topic") public class SmsService implements RocketMQListener<Ord er>{@Overridepublic void onMessage(Order order){log.info("收到一个订单信息{},接下来发送短信",JSON.toJSONString(order));//这里可以调用 userDao 查询出 user 的 telephoneSmsUti1.sendSms("telephone","黑马旅游网","SMS_170836451 ","{\"code\":\"验证码\"}");}}拷过来,新建一个工具类放在 user 里面,new 一个包包里面放一个 Smspackage com.itheima.utils; import com.aliyuncs.DefaultAcsClient; importcom.aliyuncs.IAcsclient;importcom.alivuncs.dvsmsapimodel.v20170525.SendmsRec uest; importcom.aliyuncs.dysmsapimodelv20170525.SendSmsResp onse; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IclientProfile;@slf4jpublic class Smsutil {//替换成自己申请的accessKeyIdprivate static string accessKeyId ="LTAIML1f8NKYXn1M";//替换成自己申请的accessKeySecretprivate statiq string accesskeysecret ="hqyw0zTNzeSIFnZhM EkOazxvvcr3Gj";static final string product = "Dysmsapi";static final string domain ="dysmsapi.aliyuncs.com";/***发送短信** @param phoneNumbers 要发送短信到哪个手机号* @param signName 短信签名[必须使用前面申请的]* @param templateCode 短信短信模板 ID[必须使用前面申请的]*@param param 模板中${ code }位置传递的内容 */public static void sendsms(string phoneNumbers, StringsignName, String templateCode, String param) {try {System.setProperty("sun.net.client.defaultConnectTimeout","10000");System.setProperty("sun.net.client.defaultReadTimeout","10000");//初始化 acsclient,暂不支持 region 化IclientProfile profile =DefaultProfile.getProfile("cn-hangzhou",accesskeyId,accessKeySecret);DefaultProfile.addEndpoint("cn-hangzhou"."cn-hangzhou".product.domain): IAcsclient acsclient=newDefaultAcsclient(profile);SendSmsRequest request=new SendSmsRequest); request.setPhoneNumbers(phoneNumbers);request.setsignName(signName);request.setTemplateCode(templateCode);request.setTemplateParam(param);request.setoutId("yourOutId");SendSmsResponsesendSmsResponse=acsc1ientgetAcsRespo nse(request); if (!"ok".equa1s(sendSmsResponse.getCode())){log.info(“发送短信失败,{},sendSmsResponse);throw newRuntimeException(sendSmsResponsegetMessage ());}} catch (Exception e) {log.info(“发送短信失败,{},e);throw new RuntimeException("发送短信失败");}}}把发送短信的 API 进行了抽取,因为本次要演示的只有发送,而对于查询可以自己去抽取一下,把必须要填的或者查询条件放在位置,上面有标识,要看发送到哪个手机号,短信签名是社么,短信模板是什么以及模板要传递的内容是什么,把规定查询的参数往上翻,把这些东西变成了一些参数放在方法请求里面,如果返回值不是 OK 直接抛了一个异常,如果比较正规的话里面要打一个日志出来,如果发送成功没有任何异常触发。第一个把密钥替换成自己的,第二个是要调用方法把四个参数传进来,四个参数手机号自己定、签名用申请的模板、param 自己定。
开发者学堂课程【场景实践-阿里云 Quick BI 在房源的画像分析上的应用:阿里云产品MaxCompute介绍】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/525/detail/7083阿里云产品MaxCompute介绍内容介绍:一、MaxCompute二、MaxCompute 基本概念三、MaxCompute SQL四、数据开发产品 Data IDE五、数据开发(Data IDE)常见场景六、数据开发(Data IDE)日常任务概览七、数据展现产品 Quick Bl八、Quick BI 特点九、Quick BI 全景图本节介绍构建画像所应用到的阿里云产品一、MaxCompute原名 ODPS,大数据计算服务(MaxCompute,原ODPS )由阿里云自主研发,提供针对 TB/PB 级数据、实时性要求不高的分布式处理能力,应用于数据分析、挖掘、商业智能等领域。阿里巴巴的数据业务都运行在 ODPS 上。1、分布式:采用分布式集群架构跨集群技术突破机群规模可以根据需要灵活扩展2、安全:自动存储容错机制所有计算在沙箱中运行(不允许访问底层、不允许使用函数命令直接访问内核)保障数据高安全性、高可靠性3、易用:标准 API 的方式提供服务高并发高吞吐量数据上传下载(如果数量较大建议采用后台命令上传方式,因为在前台开发套件上上传数据有一定的约束限制)全面支持基于 SQL 的数据处理4、管理与授权:支持多用户管理协同分析数据(房屋画像包含了房主的私密信息、房子的私密信息,都为隐私不能随便查看)支持多种方式对用户权限管理配置灵活的数据访问控制策略(可以控制到字段集)https://help.aliyun.com/product/27797.html?spm=5176.doc27800.3.1.jx0ByB二、MaxCompute基本概念1、项目空间 ProjectMaxCompute 的基本组织单元,它类似于传统数据库的 Database 或 Schema 的概念,是进行多用户隔离和访问控制的主要边界。一个用户可以同时拥有多个项目空间的权限。通过安全授权,可以在一个项目空间中访问另一个项目空间中的对象,例如∶表(Table),资源(Resource),函数(Function),实例(Instance)2、表 TableMaxCompute 的数据存储单元,它在逻辑上也是由行和列组成的二维结构,每行代表一条记录(与关系型数据库类似),每列表示相同数据类型的一个字段,一条记录可以包含一个或多个列,各个列的名称和类型构成这张表的Schema,表格分两种类型︰内部表及外部表(MaxCompute2.0版本开始支持外部表)。3、分区 Partition为避免全表扫描,提高处理效率,为表创建分区.MaxCompute2.0支持 TINYINT、SMALLINT、INT、BIGINT、VARCHAR 和 STRING 分区类型。分区使用限制︰单表分区层级最多6级;单表分区数最多允许60000个分区;一次查询最多查询分区数为10000个分区。4、任务 Task数据处理相当于后台的批量处理、自动化处理。通过任务来解决。任务(Task)是 MaxCompute 的基本计算单元。SQL及 MapReduce 功能都是通过任务(Task)完成的;用户提交任务尤其是计算型任务,分解成执行计划,执行计划是由具有依赖关系的多个执行阶段构成,逻辑上形成有向图。5、资源Resource资源(Resource )是 MaxCompute 的特有概念。用户如果想使用 MaxCompute 的自定义函数(UDF)或 MapReduce功能需要依赖资源来完成﹔资源类型包括:File 类型、Table 类型、Jar 类型、Archive 类型(可以将表、文件等作为资源进行数据处理)MaxCompute 底层存储及数据类型MaxCompute 底层存储使用的是分布式文件系统 PanGu基于列存储的文件格式,降低了无效磁盘读写,减少 IO以列为单位聚簇组织(聚簇被称为Block),存储前压缩,节省大量空间三、MaxCompute SQL适用于海量数据(GB、TB、EB 级别),离线批量计算的场合(首次使用发现选择一两条数据记录缓慢,实际上是因为 SQL 在后台处理是分布结构需要转换成 mapreduce 城市化处理方式来进行处理数据。小数据体现不出优势,但是选用 TB 以上就会发现处理性能很好。)作业提交后会有几十秒到数分钟不等的排队调度,适合处理跑批作业,无法在毫秒级别返回用户结果用户学习成本低,不需要了解分布式概念不支持 Update、Delete ;不支持主键、外键、事务(仅作数据分析使用)其它限制及与 Oracle,Mysql,Hive 对比参考∶https://help.aliyun.com/document_detail/54051.html四、数据开发产品 Data IDE大数据开发集成环境(Data lDE),提供可视化开发界面、离线任务调度运维、快速数据集成、多人协同工作等功能,为您提供一个高效、安全的离线数据开发环境。并且拥有强大的 Open API 为数据应用开发者提供良好的再创作生态。1、数据开发:·可视化的业务流程设计器·代码类型编码和调试·自动补全代码·代码格式化·代码版本管理·多人协同开发等功能。2、数据管理:·涵盖全链路数据血缘·数据计量·影响分析·支持元数据·异构数据·业务元数据·数据生命周期数据资产·数据权限等管理。3、作业调度(这些数据处理不能使用人为每日处理,必须有自动化系统进行管理):·多时间维度的离线任务调度·在线运维·监控报警·支持超过百万级的离线调度任务量五、数据开发(Data IDE)常见场景构建数据画像、数据仓库、数据分析常见的这种业务流程。从数据产生的原系统将数据收集存储后进行分析处理,最后进行数据提取和应用。是典型的 BI 应用场景。画像步骤基本类似,经过这些步骤。1、将业务系统产生的数据轻松上云,构建大型数据仓库和 BI 应用,利用 ODPS 强大的海量存储与数据处理能力。2、基于数据开发快速使用和分析数据,将大数据加工结果导出后直接应用于业务系统,实现数据化运营。3、针对作业调度与运维复杂性,数据开发提供统一友好的调度系统和可视化调度运维界面,解决运维管理不便等问题。六、数据开发(Data IDE)日常任务概览日常数据开发任务:数据开发项目管理、成员及权限管理、数据表管理、数据导入、创建任务、创建数据同步任务、创建自定义函数、创建 Open MR、创建 Shell 任务、测试任务、下线工作流以上就是开发画像所使用到的所有任务。此实验较简单,主要使用 SQL 即可。通过数据导入创建任务,用 SQL 编写任务脚本。为了验证可以配一个调度,进行每天自动循环处理。七、数据展现产品 Quick Bl任务中有一个需求需要提供日常报表处理,此处采用阿里云的 Quick Bl 产品。QuickBI 提供海量数据实时在线分析服务,支持拖拽式操作、提供了丰富的可视化效果(各种样式风格的报表:柱状图、饼状图等都有现成的模板组件,通过参数配置完成),可以帮助您轻松自如地完成数据分析、业务数据探查、报表制作等工作。它不止是业务人员“看”数据的工具,更是数据化运营的助推器,解决大数据应用“最后一公里”的问题,实现人人都是数据分析师。八、Quick BI 特点丰富的数据可视化效果、严密的权限管控、灵活的报表集成方案、智能加速引擎(开通后数据提取加快)、海量数据多维分析、多数据源支持产品应用主要是展现报表,若是涉及到实际应用项目需要添加该权限。九、Quick BI 全景图完整流程如下:该流程与数据处理流程、画像处理流程类似。但凡是数据处理系统基本为数据采集、数据预处理、数据加工分析、数据的应用及数据展现几个步骤。Quick BI 作为一个独立产品,同样存在数据源、数据处理、数据分析、数据展现。以上就是数据处理相关的业务、系统、产品所经过的基本步骤。数据展现完可以嵌入原系统进行查看。如果公司中已经存在正在运行的系统,不用再单独开发一套展现的 web 界面,可以直接进行嵌入,该方式在很多企业中较常见。
开发者学堂课程【高校精品课-中国传媒大学 -云计算技术:虚拟化服务(服务器虚拟化、存储虚拟化)】学习笔记,与课程紧密联系,让用户快速学习知识课程地址:https://developer.aliyun.com/learning/course/8/detail/1259虚拟化服务(服务器虚拟化、存储虚拟化) 内容介绍:一、虚拟化的特点二、服务器虚拟化概念三、服务器虚拟化-底层实现四、服务器虚拟化-虚拟机迁移五、服务器虚拟化-隔离技术六、服务器虚拟化-案例分析 一、虚拟化的特点1、讲云计算概述的时候,讲过云计算的特点。下面讲虚拟化的特点,有分区、隔离、封装、独立。虚拟化分区是把虚拟化层能够给多个虚拟机划分服务器资源的能力,每个虚拟机都可以单独运行一个操作系统。同时运行的操作系统可以是相同的,也能是不同的。在一台服务器上运行多个应用程序,每个操作系统能看到的是虚拟化层给他自己的虚拟硬件,比如 CPU、内存。每个虚拟化层觉得自己运行在专用的服务器上,所以就实现了分区。分区可以解决两方面的问题,一方面是划分资源的配额,防止虚拟化超配额使用资源。每个分区都是给一定的资源配额,不会过量,也不会过少,根据需要分配。每个虚拟机会单独安装操作系统,彼此互不影响。2、隔离在讲虚拟化概述的时候讲虚拟化前和虚拟化后,虚拟化前是左边,虚拟化后是右边,起到了隔离的特征。主要通过分区建立多个虚拟机,采用逻辑隔离的措施,能够防止相互影响。假如一个服务器崩溃或者故障,不会影响到同一服务器上的其他虚拟机,在使用自己的笔记本时,可能会遇到操作系统故障,应用程序崩溃等,这会让整个机器或一台服务器崩溃,在它之上的所有应用程序都会受到影响。但是安装了虚拟机之后,一个虚拟机的崩溃或者是故障,不会影响到同一个服务器上的其他的虚拟机。一个虚拟机当中的病毒,和其他虚拟机相隔离,所以一个虚拟机上的病毒,也是不会影响到其它虚拟机上的病毒。3、封装比如说硬件配置、内存状态、磁盘状态、cpu 状态等,封装就是把它们储存在独立的物理硬件的一小组文件中。容器也是虚拟化的一个例子,容器类似于集装箱可以到处搬,因为它有封装的特征,这样只需要复制几个文件就可以随时随地复制、保存或者移动虚拟机。4、独立虚拟机相对硬件独立,在虚拟机迁移会体现的非常明显。虚拟机迁移的时候,只需要把虚拟机的一些设备文件或配置文件,或者是磁盘文件复制到另外一台主机上运行就可以了,不需要关心底层硬件类型是否兼容,这是相对硬件独立的特征。 二、服务器虚拟化概念1、概念将一个或多个物理服务器虚拟成多个逻辑上的服务器,集中管理,能跨越物理平台不受限制。2、服务器虚拟化发展史1964年, IBM 开始尝试在大型机上实现虚拟化。1972年,IBM 推出运行在大型机上的虚拟机。1999年,VMware 推出了 X86架构的虚拟化产品。X86 架构是计算机语言的指令集,是英特尔公司首先发布的。X86 架构是微处理器执行的语言的指令集。2002年,Xen被开源,VMware 是闭源的。2006年,KVM 诞生。2007年,惠普发布了针对惠普 UX 的 Integrated 虚拟机。2008年,微软在WINDOWS server 20082 当中加入了 hypervisor, hypervisor 是硬件的虚拟化技术。英特尔公司也推出了它的硬件虚拟化技术2008年,limits 容器 LXC 推出。2010年,KVM虚拟化机制。2011年,IBM、惠普和英特尔成立开放虚拟化测试联盟,加速KVM推广。2013年,Docker 推出。这是整个服务器虚拟化的发展史,主要是 CPU 内存、IO 的虚拟化。3、服务器虚拟化技术有两个方向一种是把一个物理的服务器虚拟成若干个独立的逻辑服务器,比如分区。本课程主要关注这种虚拟化技术。第二种是把若干分散的物理服务器虚拟为一个大的逻辑服务器,比如网格技术。 4、服务器虚拟化分类(1)根据虚拟化层实现方式的不同分为寄居虚拟化和裸机虚拟化两种。根据解决X86体系缺陷的不同方法,分为全虚拟化、半虚拟化和硬件虚拟化三类。第一种分类,根据虚拟化层实现的方式不同,寄居虚拟化和裸机虚拟化。①寄居虚拟化寄居虚拟化的虚拟化层称为虚拟机监控器,也可以称为虚拟机的模拟器(VMM)。VMM 安装在已有的主机操作系统上,最底层是物理机,是宿主操作系统,VMM 是安装在宿主机的操作系统上。通过宿主操作系统来管理和访问各类资源(如文件和各类IO设备)。②裸机虚拟化直接把 VMM 安装在服务器硬件设备上,没有宿主机操作系统。本质上 VMM 也可以认为是一个操作系统,一般称为 Hypervisor,这个操作系统是轻量级的操作系统。Hypervisor 实现从虚拟资源到物理资源的映射。直接安装在裸机上的虚拟化。③通过下图比较看它们的优缺点,操作系统虚拟化和混合虚拟化就不再仔细讲解。寄居虚拟化优点:简单、易于实现。因为有宿主操作系统。缺点:安装和运行应用程序依赖于主机操作系统对设备的支持。管理开销较大,性能损耗大。裸金属虚拟化优点:虚拟机不依赖于操作系统,支持多种操作系统,多种应用。但是 Hypervisor 层是一个轻量级的操作系统,所以虚拟层内核开发难度大,这就是它的缺点。寄居虚拟化有厂商 VMware workstation 和 Virtualbox,裸金属的虚拟化是 VMware ESXServer 和 Citrix XenServer。操作系统虚拟化是 Virtuozoo、Docker、LXC,Redhat KVM、华为 FusionSphere 使用的都是混合虚拟化。(2)还有一种分类方式是为了解决X86体积缺陷的方法分为全虚拟化,半虚拟化和硬件虚拟化。①全虚拟化在X86就架构里面,CPU 被分成四个环,分别是 Ring0、Ring1、Ring2、Ring3,其中 Ring0 的权限最高,一般运行的是特权指令,操作和管理关键资源的指令。比如开启摄像头这样的指令就是特权指令,只有在 Ring0 级别上才能运行的指令。Ring1 和 Ring2 上运行的指令很少。还有一种除了特权指令之外,主机操作系统发出的指令还有普通指令。普通指令在普通的权限级别上就能运行,在 Ring3 级别上就能运行。但是在虚拟化环境中,有一种特殊指令(特权指令)也被称为敏感指令,在虚拟化当中有两种机制,这就是全虚拟化方案,用软件实现的虚拟化。②两种机制a、一种是特权解除,看下图只有 host OS 在 Ring0 级别上,就是宿主机操作系统才能执行这个特权指令,VMM 和 Guest OS 应用都是运行在 Ring3 级别上的。在 Guest OS 中,执行系统内核的特权指令的时候,客户机的操作系统或者是称为虚拟机的操作系统,执行特权指令(敏感指令),一般都会触发异常。在触发了异常之后,这些异常就会被 VMM 捕获,再去找 Host OS,Host OS 再去找硬件执行。客户机的操作系统执行敏感指令之后,这些敏感指令会被 VMM 捕获,再由 VMM 将这些特权指令进行虚拟化成为指针对虚拟 CPU 起作用的虚拟特权指令。缺点是会存在一部分特权指令运行在 Ring1 的用户态上,而这些运行在 Ring1 上的特权指令并不会触发异常然后再被 VMM 捕获。b、所以出现了另外一种机制:陷入模拟(二进制翻译),就是 VMM 会对 GuestOS 中所有的二进制代码进行扫描,一旦发现 GuestOS 执行的二进制代码中包含有运行在用户态上的特权指令二进制代码时,就会将这些二进制代码翻译成虚拟特权指令二进制代码强制的触发异常。这就是陷入模拟,首先会对 GuestOS 当中所以的二进制代码进行扫描,发现异常,会把这些翻译成为特权指令的二进制代码触发异常,这就是二进制翻译。一般就这两种机制,特权解除和陷入模拟。VMware 使用二进制翻译的全虚拟化方案已经成为全虚拟化事实上的标准。③优点是不修改虚拟机操作系统,虚拟机的可移植性和兼容性较强,支持广泛的操作系统;缺点是运行时需要翻译 Guest OS 二进制代码,性能损耗较大,并且引入了新的复杂性,导致虚拟机监视器(VMM)开发难度较大。④半虚拟化a、Hypervisor 只模拟部分底层硬件,因此客户机操作系统不做修改是无法在虚拟机中运行的。半虚拟化通过修改客户机的操作系统内核,把不可虚拟化的指令替换为直接与虚拟化层交互的超级调用(hypercalls)。b、优点是通过虚拟机系统和 hypervisor 的交互,可改善性能和效率;缺点是只支持修改开源的操作系统,如果 Guest OS 是 WINDOWS 系统,windows 系统是闭源的,所以不能实现半虚拟化,只能修改开源操作系统,比如 Linux。此外,被修改过的虚拟机操作系统 Guest OS 可移植性较差。开源的 Xen 项目是半虚拟化的一个例子,它使用一个经过修改的 Linux 内核来虚拟化处理器。c、开源的 Xen 就是半虚拟化的例子,它使用一个经过修改的 Linux内核来虚拟化处理器。需要修改客户机的操作内核,其实修改的就是特权指令。因为 X86 系统有虚拟化漏洞,所以半虚拟化直接去 Guest OS 上把特权指令修改,让他不能访问 Ring0 级别的 CPU。⑤硬件辅助虚拟化WINDOWS 硬件辅助虚拟化叫 hypervisor,英特尔的硬件辅助虚拟化叫 VT-x,英特尔是生产处理器的公司,在处理器内部形成了新的 CPU 执行状态,一种是根模式(Root Mode),还有一种是非根模式(Non-Root Mode)。看下图Guest OS 运行在非根模式 Ring0 的核心态中,这表明 Guest OS 能够直接执行特权指令,而不再需要特权解除和陷入模拟机制。为什么有根模式和非根模式?Guest OS 一旦运行的是敏感指令,这个时候就会切换到根模式,由一个叫 VMCS 部件监控;当这个敏感指令执行完之后,再切换到非根模式执行普通的指令,这是英特尔的 VT-x硬件辅助虚拟化。(3)下图是由 X86 结构的缺陷形成的三种虚拟化技术,全虚拟化和半虚拟化一般都是软件虚拟化,用软件来实现。全虚拟化特点:VMM 向虚拟机模拟出和真实硬件完全相同的硬件环境;半虚拟化特点:VMM 需要修改 Guest OS 的特权指令;硬件虚拟化的 VMM 需要硬件的协助才能完成对硬件资源的虚拟。全虚拟化的优点不用修改 Guest OS 内核;半虚拟化性能高,能达到与原始系统相近的性能;虚拟化硬件也不需要修改 Guest OS 内核。全虚拟化缺点:虚拟化平台给处理器带来的开销;半虚拟化必须修改 Guest OS;硬件虚拟化需要硬件支持。全虚拟化代表产品有 VMware 和 Virtual PC;半虚拟化是 Xen 和 Denali;硬件虚拟化是 intel-VT 和 AMD-V。 三、服务器虚拟化-底层实现底层实现有 CPU 虚拟化、内存虚拟化、IO 设备虚拟化,这是服务器的虚拟化。1、CPU 虚拟化CPU 虚拟化技术是把物理的 CPU 抽象成虚拟的 CPU。一个物理的 CPU 只能运行一个虚拟的 CPU 指令,每个客户的操作系统是可以使用一个或多个虚拟 CPU 的,在各个操作系统之间,虚拟 CPU 运行是互相隔离,互不影响的。CPU 虚拟化有两个关键问题,虚拟 CPU 的正确运行是要保证虚拟机指令正确运行,现有的实现技术包括模拟执行和监控执行。监控 Guest OS 是否执行了敏感指令,如果执行了就要模拟执行。另外一个问题是调度问题,调度问题是指 VMM 决定当前哪个虚拟 CPU 在物理 CPU 上运行,要保证隔离性、公平性和性能。2、内存虚拟化内存虚拟化是把物理内存统一管理,包装成多个虚拟的物理内存提供给若干虚拟机使用,每个虚拟机拥有各自独立的内存空间。虚拟内存管理包括三种地址,物理地址就是物理机的地址,Host Machine的地址;虚拟地址是虚拟机上的地址,客户端看到的地址;它们两个中间有一个机器地址,保证公平和性能。3、IO 设备虚拟化IO 设备虚拟化技术把真实的设备统一管理起来,这几个虚拟化都是一样,内存是把物理内存统一管理,IO 设备是把真实的设备统一管理起来,包装成多个虚拟设备给若干个虚拟机使用,响应每个虚拟机的设备访问请求和 IO 请求。由 VMM 进行管理,IO 虚拟化也是由全虚拟化、半虚拟化和软件虚拟化三种思路。目前主流的 IO 设备虚拟化都是通过软件的方式来实现的,就是通过软件模拟来实现。 四、服务器虚拟化-虚拟机迁移1、虚拟机有一个特点是封装,封装便于虚拟机迁移。虚拟机迁移是将虚拟机实例从源宿主机迁移到目标宿主机,并且在目标宿主机上能够将虚拟机运行状态恢复到其在迁移之前相同的状态,以便能够继续完成应用程序的任务。从虚拟机迁移的源与目的地角度可分为物理机到虚拟机的迁移(P2V)、虚拟机到虚拟机的迁移(V2V)、虚拟机到物理机的迁移(V2P)。2、实时迁移(LiveMigration)就是保持虚拟机运行的同时,把他从一个计算机迁移到另一个计算机,并且在目的计算机恢复运行的技术。有两种情况下会用到实时迁移,一种是云计算中心的物理服务器负载经常处于动态变化中,当一台物理服务器负载过大时,若此刻不可能提供额外的物理服务器,管理员可以将其上面的虚拟机迁移到其他服务器,达到负载平衡。还有一种情况是云计算中心的物理服务器有时候需要定期进行升级维护,当升级维护服务器时,管理员可以将其上面的虚拟机迁移到其他服务器等升级维护完成之后,再把虚拟机迁移回来。3、下图是虚拟机迁移的示意图,虚拟机迁移的时候,它的状态和资源都是需要迁移的,需要把源宿主机迁移到目标宿主机,比如说磁盘、内存、CPU 状态、IO 的设备等都是需要传送过去的。而且内存的迁移难度是最高的,因为内存里面数据量比较大,而且信息非常重要;磁盘的迁移是最简单的,一般是通过共享的方式,不是真正的方式来迁移。4、虚拟机到虚拟机的迁移迁移有六个步骤,第一步预迁移(Pre-Migration),把源计算机称为主机a(host a),目的计算机记为主机b(host b),预迁移是主机a打算迁移其上的一个虚拟机 VM,首先要选择一个目的计算机作为迁移的对象,选好之后进入第二步,预订资源。预订资源(Reservation)是主机a向主机b发起迁移请求,确定b是否有这个资源,如果有就预订这些资源;如果没有继续在主机a当中运行,可以选择其它计算机作为目的计算机。第三步,预复制(InterativePre-Copy)。这个阶段 VM 仍然运行,主机a上的虚拟机仍然是运行的,主机a是以迭代的方式把 VM 的内存页复制到主机b上。在第一轮的迭代当中,所有的页都要从a传送到b;在第二轮之后,只复制前一轮传送当中被修改过的页面。第四步,停机复制(Stop-and-Copy)。停止主机a上的 VM,把它的网络连接到b,这个时候 CPU 状态和前一轮当中修改过页都会在这个步骤被传送过去。最后,主机a和主机b就会有一样的 VM 印象。第五步,提交(Commitment)。主机b会通知主机a已经成功收到了 VM 印象,主机a会对消息进行确认,确认之后就可以销毁或者是抛弃上面的 VM。第六步,启动(Activation)。起动迁移到b上的 VM,这是迁移的六个步骤。5、迁移的内容(1)内存的迁移(最困难的部分)①内存迁移分为三个阶段,第一阶段是 push 阶段。刚才讲解的六个步骤,适用于各个迁移。push 阶段在 VM 运行的同时,把它的内存页面通过网络复制到目的机器上,被修改的页是需要重传的。push 阶段是刚才讲的六个步骤中的预复制阶段,要把内存页通过网络复制到目的页,第一轮迭代,把所有的页从a传到b,之后的迭代只需要复制前一轮中迭代中被修改的页面,所以是预复制。②第二阶段是 Stop-and-Copy 阶段,这个阶段停止工作,把剩下的页面复制到目的计算机上,然后在目的机上启动新的 VM,对应的是步骤四,停机复制。步骤一到步骤六是整个虚拟机的迁移步骤,内存的迁移可以对应步骤三、步骤四。③第三阶段,pull 阶段。pull 阶段是新的虚拟机运行过程当中,如果访问到未被复制的页面,会发现页错误,会从原来的 VM 处把页复制过来。这个时候机器a上面的 VM 还是在工作着,所以才能把原来的 VM 把页复制过来。实际上,迁移内存没有必要同时包含上述三个阶段,目前大部分的迁移策略只包含其中一个或者两个阶段。(2)迁移方案①迁移方案有 Stop-and-Copy,静态迁移,需要 VM 停止工作,就是把机器a的 VM 暂停,然后把内存页复制给目的计算机,最后启动新的 VM。这种方法简单且总的迁移时间较短,但是停机时间是无法接受的。停机时间和 VM 物理内存大小是成正比的,如果 VM 内存很大,则它总的迁移时间会很长,所以这并不是一个特别理想的方案。②第二种迁移方案是 Stop-and-Copy 和 pull 两种方案相结合。首先是在 Stop-and-Copy 阶段把关键的、必要的复制到目的机器上,然后在目的机器上启动 VM,目的机器的页只有在需要的时候才复制过去。这种方案总的停机时间很短,Stop-and-Copy 阶段只是把关键的、必要的复制过去,大部分内存里面的东西还是没有复制过去,所以停机时间较短,但是总的迁移时间很长。因为剩下的页需要在使用的时候复制过去,而且在 pull 阶段复制会造成性能下降,因为有很多页都要在 pull 阶段复制,这样就会造成性能下降。③第三种迁移方案是 push 和 Stop-and-Copy 阶段结合,就是第一阶段和第二阶段相结合。Xen 采用的就是这种方案,首先采用预复制的方法,把内存页以迭代的方式复制到目的计算机上,第一轮复制所有的页,第二轮只复制在第一轮迭代当中修改过的页;第三轮只复制在第二轮当中修改过的页。迭代到一定次数,预复制阶段会结束,就会进入到 Stop-and-Copy 阶段,这个时候在停机,把剩下的没有复制过去的全复制过去,平衡了停机时间和总的迁移时间的矛盾,是一种理想的实时迁移内存的方法。但是需要有一种算法能够测定工作集,测算在 push 阶段什么时候迭代停止,需要有一种算法针对改动频繁的页,需要有一种算法能够测定工作集,以免反复重传,这种方法可能会占用大量的网络带宽,对其他服务造成影响,这是几种迁移方法的比较。(3)网络资源的迁移网络也是比较重要的一部分,VM 的所有网络设备、TCP 的连接状态和 IP 地址等都是需要一起迁移的。在局域网内,可以通过发送 ARP 的重定向包,将 VM 的 IP 地址与目的机器的 MAC 地址相绑定,之后的所有包就可以发送到目的机器上。(4)存储设备的迁移迁移存储设备的最大障碍在于需要占用大量时间和网络带宽,通常的解决办法是以共享的方式共享数据和文件系统,而非真正迁移。目前大多数集群使用 NAS(Network Attached Storage,网络连接存储)作为存储设备共享数据。NAS实际上是一个带有瘦服务器的存储设备,其作用类似于一个专用的文件服务器。在局域网环境下,NAS已经完全可以实现异构平台之间,如NT、UNIX等的数据级共享。基于以上的考虑,Xen并没有实现存储设备的迁移,实时迁移的对象必须共享文件系统。 五、服务器虚拟化-隔离技术1、虚拟机隔离是指虚拟机之间在没有授权许可的情况下,互相之间不可通信、不可联系的一种技术。可以从软件角度、硬件角度、网络角度来说明。软件角度是互相隔离的虚拟机之间保持独立,如同一个完整的计算机;硬件角度是被隔离的虚拟机相当于一台物理机,有自己的CPU、内存、硬盘、IO等,它与宿主机之间保持互相独立的状态;网络角度是被隔离的虚拟机如同物理机一样,既可以对外提供网络服务,也一样可以从外界接受网络服务。2、虚拟机隔离机制√网络隔离√构建虚拟机安全文件防护网√基于访问控制的逻辑隔离机制√通过硬件虚拟,让每个虚拟机无法突破虚拟机管理器给出的资源限制√硬件提供的内存和保护机制√进程地址空间的保护机制、IP地址隔离3、内存隔离(1)MMU 是 Memory Management Unit(内存管理单元),是 CPU 用来管理虚拟存储器、物理存储器的一个控制线路。MMU 的功能有四个,管理虚拟存储器的控制路线,管理物理存储器的控制路线,负责将虚拟地址映射为物理地址,提供硬件机制的内存访问授权。(2)内存虚拟化的时候讲了虚拟内存管理有三种地址,虚拟地址、物理地址、机器地址。内存隔离里面的机器内存就是刚才说的物理地址,虚拟内存就是虚拟地址。中间是伪物理内存,实际的地址是机器地址,虚拟机上的用户看到的是虚拟地址,中间是伪物理内存把虚拟内存和机器内存联系起来,使得用户看到的地址都可以是从零开始的,但实际上,机器内存上并不是这样的地址,这是它们之间的映射关系。虚拟内存映射给伪物理内存,伪物理内存映射给机器内存。(3)VMM 使用分段和分页机制对自身物理内存进行保护,X86 结构提供了支持分段机制的虚拟内存,这能够提供另一种形式的特权级分离。每个段包含基址、段限、属性位,基址和虚拟地址相加形成线性地址;段限决定了这个段中所能访问的线性空间的长度;属性位则标记了该段是否可读写、可执行,是代码段还是数据段等。4、网络隔离(1)网络隔离的目标是确保把有害的攻击隔离,在可信网络之外和保证可信网络内部信息不外泄的前提下,完成网问数据的安全交换。网络隔离的关键是在于系统对通信数据的控制,主要通过不可路由的协议来完成网问的数据交换。安全要素主要包括机密性、完整性、可用性、可控性、抗抵性,这些安全要素需要安全机制来实现,比如访问控、身份认证、加密签名。(2)通过不可路由的协议,彻底阻断了网络间的直接 TCP/IP 连接,能够对通信的双方内容、过程进行多种的安全保护机制,通过这种方式保障网间的数据交换安全、可控,杜绝了由于操作系统和网络协议自身漏洞带来的安全风险。网络隔离实现原理通过专用通信设备、专有安全协议、加密验证机制、应用层数据提取和鉴别认证技术来实现不同安全级别网络之间的数据交换,从而实现彻底的网络隔离。六、服务器虚拟化-案例分析1、VMware 公司推出了面向云计算的一系列产品和解决方案。VMware 提供了云的基础架构及管理、云应用平台、终端用户计算等,这些层次上的解决方案,主要给企业级组织机构的服务器虚拟化技术,使用它的服务器虚拟化技术可以实现传统的数据中心到云计算环境的转变。他的两种迁移工具较为主流,一个是虚拟机迁移工具(VMotion),还有一个是存储迁移工具(VMware Storage VMotion)。2、VMotionVMotion是VMware用于在数据中心的服务器之间进行虚拟机迁移的技术。虚拟机迁移过程中主要采用三项技术:①将虚拟机状信息压缩存储在共享存储器的文件中②将虚拟机的动态内存和执行状态通过高速网络在源ESX服务器和目标ESX服务器之间快速传输③虚拟化网络以确保在迁移后虚拟机的网络身份和连接能保备3、VMware Storage VMotionVMvere Storago VMotion用于实时迁移虚拟机磁盘文件,以便满足对虚拟机磁盘文件的升级、维护和备份。原理是存储之间的转移,核心技术是磁盘快照、REDO记录、父/子磁盘关系、快照整合这些技术。本节课主要讲了服务器虚拟化的概念、服务器虚拟化的底层实现、虚拟机迁移、隔离技术、案例分析。
开发者学堂课程【场景实践 - 机器学习PAI实现精细化营销:阿里云机器学习平台 PAI 介绍】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/521/detail/7047阿里云机器学习平台PAI介绍内容介绍:一、机器学习 PAI 简介二、机器学习 PAI 特点三、机器学习 PAI 的算法四、机器学习 PAI 应用场景五、机器学习 PAI 应用流程六、一个完整的机器学习流程一、机器学习 PAI 简介阿里云机器学习平台 PAI 是构建在阿里云 MaxCompute 计算平台之上,集数据处理、建模、离线预测、在线预测为一体的机器学习平台。它最大的特点就是降低存储和计算成本,否则用自己单独的机器去进行一些计算,是非常麻烦的,而且在大量数据的基础上如果不采取分布式的处理,单机的处理是很难达到数据处理能力。第二个特点就是降低了技术门槛,对于一些数学算法并不是很精通的,机械学习PAI已经降低了技术门槛,方便大家去应用,以上是最重要的两个特点。二、机器学习 PAI 特点1.基于 MaxCompute、GPU 集群,支持 MR、MPI、SQL、BSP、SPARK 等计算类型2.内置阿里、蚂蚁多年沉淀的分布式算法,将成熟的算法封装起来,支持百亿级数据量训练,处理能力是比较强的。3.WEB 界面,通过拖、拉、拽等方式即可完成复杂数据挖掘流程他的平台架构最底层是基础设施,上面是开放框架,第三层是模型与算法,最上层是业务应用层,不管应用哪一层,以及自己开发模型或者是直接使用他的模型都可以。三、机器学习 PAI 的算法PAI提供最丰富的算法︰包含特征工程、数据预处理、统计分析、机器学习深度学习框架、预测与评估这一整套的机器学习算法组件,共100余种。本次精细化营销涉及到的数据预处理、数据的特征分析还有聚类算法,这里面都是由组件来支撑的。四、机器学习 PAI 应用场景营销类场景∶商品推荐、用户群体画像、广告精准投放,例如登录天猫、淘宝首页的猜你喜欢金融类场景∶贷款发放预测、金融风险控制、股票走势预测、黄金价格预测SNS关系挖掘︰微博粉丝领袖分析、社交关系链分析文本类场景∶新闻分类、关键词提起、文章摘要、文本内容分析非结构化数据处理场景︰图片分类、图片文本内容提取 OCR其它各类预测场景︰降雨预测、足球比赛结果预测不同的类有不同的数据组件支撑五、机器学习 PAI 应用流程在首先明确任务、目标、数据情况的前提下才能确定使用那些组件,使用哪些算法,使用哪几步流程,并不是每一个机器学习都是使用完整的处理流程或者说是各个流程都涉及到,这是不一定的,可能数据非常完整不需要预处理,只是需要一个算法。也可能有的算法就不需要再去评估,直接可以运用到生产中,它不是必须的,是根据特定的任务和场景来决定的。1)数据预处理2)选择特征3)选择模型进行数据训练4)模型评估5)模型发布(再学习训练)六、一个完整的机器学习流程1.开通数据实名认证账号登陆控制台进入机器学习使用阿里的服务,首先就是要拥有一个实名认证的账号,通过账号注册完以后,登录控制台登录到机器学习,选择所设计的实验项目,如果没有项目可以新建项目,因为项目是max compute最基本的管理组件之一,是数据应用的最基本的单元,而 pAI 还是构建在 max compute 之上,所以确定项目空间来实现。2.导入数据新建/倒入数据源上传本地数据编辑数据集选择租户及工作空间,新建实验;通过“源/目标”菜单下的 OSS 组件、 MySQL 组件配置数据源通过“数据源”组件创建表上传本地数据,因为 max compute 是以表的形式从创建数据的,PAI 构建在它之上也是以表来处理数据的。通过“读数据表”组件读取实验数据,相当于把数据导入到 PAI,可以进行实验。3.数据预处理数据去噪维度填充类型转换对选定的数据源进行预处理,判断进行实验进行模拟训练的数据是否是纯净的、不需要加工的数据,如果需要加工则需要进行数据的预处理。数据预处理包括数据采样与过滤和数据合并两类组件以及类型转换、归一、标准化等组件。选择合适的组件,配置参数信息(如图随机采样组件)将采用组件直接拉入到工作区域进行转换,配置转换的参数。4.特征工程特征变换特征评估特征选择特征生成特征工程功能组件包括特征变换、特征重要性评估、特征选择、特征形成四类组件。选择合适的组件,根据具体的业务场景配置参数信息、字段信息(如图特征异常平滑组件)5.训练和预测选择模型配置参数数据处理预测结果训练和预测组件就是机器学习、深度学习相关的算法处理组件,如客户细分一般采用聚类和分类组件。选择合适的组件,配置参数信息、字段信息;预测组件是专门用于模型预测的组件,两个输入:训练模型和预测数据;输出为预测结果;有的样本数据是需要一分为二的,一个是用于训练用的,一个是用于验证的,作为预测结果。这些组件不一定都需要使用,根据具体的业务来进行选择6.评估选择模型配置参数查验结果训练完成后的模型需要进行评估,检验是否满足要求。评估组件为上步的预测输出进行评估(如图示例)评估完成后可以进行发布在线预测部署或离线调度满足要求后进行模型最后的部署。
开发者学堂课程【RocketMQ 知识精讲与项目实战(第二阶段):Springboot 集成 Rocketmq 消费者】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/703/detail/12398Springboot 集成 Rocketmq 消费者内容介绍:一、添加依赖二、配置文件三、启动类四、消息监听器本节继续开发 Rocketmq 的消费者。开发消费者的步骤与生产者类似:添加依赖(此处依赖基本与生产者相同)、配置文件、启动类、消息监听器(对于消费者,不是发送而是消费消息,所以通过监听器进行消息监听进行消费)。此处已经创建了一个消费者工程springboot-rocketmq-consumer一、添加依赖先来添加依赖,三个依赖与生产者相同<dependencies><!--添加web起步依赖><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>${rocketmq-spring-boot-starter-version}</version></ dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.6</version></ dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>对于消息的消费者,消费时应用不能停止即消费者的应用在启动后就一直处于运行状态,所以在依赖中还需要加入外部启动器。二、配置文件接着配置配置文件,创建 application.properties,配置属性:# nameserverrocketmq.name-server=192.168.25.135:9876;192.168.25.138:9876#消费者组名rocketmq. consumer.group=my-group三、启动类接着创建启动类com.itheima.shop.springboot.rocketmq.Consumer添加注释@SpringBootApplication在代码public class ConsumerApplication{}中加入public static void main(string[] args) {springApplication.run(ConsumerApplication.class,args);}四、消息监听器入口类写好后再创建消息监听器。先来创建一个类 listener.Consumer,让该类变成监听器,要实现 RocketMQListener修改代码public class Consumer implementsRocketMQListener<String>{}然后重写代码,在代码中输入@Overridepublic void onMessage(String s){//onMessage参数类型就是上述指定的String}要让监听器起作用还需要在上方配置 RocketMQListener 注解:@RocketMQListener(topic=”springboot-rocketmq”,consumerGroup=”${rocketmq. consumer.group}”)参数中还存在 consumeMode=consumeMode.CONCURRENTLY,但是暂时不需要修改,只需要使用默认。至此就可以接收到主题 springboot-rocketmq 的消息,就可以进行打印在代码public class Consumer implementsRocketMQListener<String>{}中再添加System.out.println(“接收到消息”+s);编写完成后还有最后一步:当前监听器应该注册到容器中所以需要再加入注解@Component注册完后打印日志当应用启动好后进行输出:在 ConsumerApplication.java 中加入注解@Slf4j,并在代码 public static void main (String[] args){}中添加Log.info(“消费者启动成功”);以上编写完成后进行启动,控制台如图显示消费者收到很多消息,是因为之前发送了很多消息,现在清除掉,再让生产者重新发送消息,结果如图以上就是 Springboot 集成消费者的过程。总结:对于 Springboot 集成 RocketMQ 消费者,总体上也是四个操作,添加依赖基本与生产者相同,但是需要加入web模块。编写配置文件基本与生产者相同。再编写启动类,最后编写消息监听器,使用监听器监听消息进行处理。监听器监听什么主题的消息使用到 RocketMQMessageListener 注解去进行配置,此处消费者组名可以指定。然后注册到 Springboot 容器中。完成后就可以启动启动类,启动类一旦启动,消息监听器就开始监听,一旦生产者发出消息,消费者就可以监听到。
开发者学堂课程【RocketMQ 知识精讲与项目实战(第二阶段):Springboot 集成 Rocketmq 生产者】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/703/detail/12397Springboot 集成 Rocketmq 生产者内容介绍:一、准备工作二、添加依赖三、配置文件四、启动类五、测试类本节我们使用 Springboot 去整合 RocketMQ,之后再进行 RocketMQ 开发就会变得非常方便。分成2个步骤:第一步开发消息生产者,第二步开发消息消费者。一、准备工作在开发两者前需要将 Springboot 和 RocketMQ 整合的依赖安装到本地仓库。此处可以登录 rocketmq-spring 官网即在 GitHub 上开源网址。在 GitHub 网站上下载依赖包,点击下图按钮下载:提供的资料中也存在,如下:下载该包后进行解压,之后需要将它安装到本地仓库。使用如下命令安装:mvn install -Dmaven.skip.test=true-Dmaven.skip.test=true是跳过测试,安装比较方便。二、添加依赖本地仓库已经安装好,做好准备工作后进行开发消息生产者。第一步添加依赖第二步配置文件第三步编写启动类第四步编写测试类先来添加依赖,本地已经创建好了项目springboot-rocketmq-producer打开项目后,在项目中将rocketmq和springboot整合的起步依赖获取到,添加依赖代码如下:<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.1.RELEASE</version></parent>//对于springboot工程开发首先需要加入继承父工程<properties><rocketmq-spring-boot-starter-version>2.0.3</rocketmq-spring-boot-starter-version></properties><dependencies><dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>${rocketmq-spring-boot-starter-version}</version></ dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.6</version></ dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></ dependencies>在添加依赖时添加了三个,第一个为 spring-boot 与 rocketmq 整合的起步依赖;第二个是 lombok,不是必需,但是此处导入是为了简化开发例如要进行日志的输出就可以使用它进行快速输出;第三个导入 spring-boot-starter 进行测试。复制代码到 IDE 中的 pom.xml 中三、配置文件接着配置配置文件,在 springboot 中配置文件有两种格式:yml、properities创建 application.properities,输入# nameserverrocketmq.name-server=192.168.25.135:9876;192.168.25.138:9876#发送者组名rocketmq. producer.group=my-group四、启动类接着编写启动类,创建启动类com.itheima.shop.springboot.rocketmq.ProducerApplication创建好后添加@SpringBootApplication注解@SpringBootApplicationpublic class ProducerApplication{public static void main(string[] args) {SpringApplication.run(ProducerApplication.class,args);}五、测试类编写入口类后进行测试,在测试时 springboot 与 rocketmq 的起步依赖中提供了一个消息模板,使用该模板就可以快速发送消息到 rocketmq。创建测试类 com.itheima.shop.test.ProducerTest在代码 public class ProducerTest 上添加@RunWith(SpringRunner.class)@SpringBootTest(classes={ProducerApplication.class})上述提到的模板为 RocketMQTemplate,在代码 public class ProducerTest 中输入@Autowiredprivate RocketMQTemplate rocketMQTemplate;@Testpublic void testSendMessage(){rocketMQTemplate.converAndSend(payload:”springboot-rocketmq”,payload:”Hello Springboot Rocketmq”);//发送方式 send 第一个 destination 是要发送的消息的主题,第二个是消息的名字(另一种发送方式如果需要发送字符串可以使用 converAndSend)}然后进行测试,点击运行运行成功后如何查看呢?可以打开之前配置的 Rocketmq-console 控制台,点击主题可以看到有刚才发送的主题消息。所以在企业中可以使用 Springboot 集成 Rocketmq 快速发送消息。最后注意:在上述依赖中 lombok 的依赖使用:例如想要输出日志,添加注解@sllf4j,再在public void testSendMessage 中添加代码 Log.info(“”)就可以打印日志,例如 Log.info(“消息发送成功”)再来运行,就可以看到日志输出关于 Rocketmq 集成 Springboot 消息的发送已经完成。总结:在 springboot 集成 Rocketmq 过程中首先下载相关依赖包,在 GitHub 上下载,然后使用命令添加到本地仓库。然后添加配置文件(配置文件中主要配置了.group)、启动类、测试类(使用 RocketMQTemplate 进行消息发送)
开发者学堂课程【宜搭低代码开发认证教程: 宜搭产品简介(一)】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/299/detail/3499宜搭产品简介(一)内容介绍一、低代码平台的概念及特点二、宜搭产品介绍三、宜搭产品的应用场景 一、什么是低代码平台1、低代码平台的概念低代码开发平台( Low-Code Development Platorm )是无需编码(0代码或无代码)或通过少量代码,就可以快速生成应用程序的开发平台。允许终端用户使用易于理解的可视化工具开发自己的应用程序,而不是传统的编写代码。构建业务流程流程、逻辑和数据模型等所需的功能,必要时还可以添加自己的代码。低代码平台是相对于传统的开发模式就是 for-code 的代码模式来讲的,它相对是一个比 for-code更轻量级的模式,也包括了零代码的这种模式低代码可以说有几行代码也算是低代码,有很多行代码也算是低代码,但是它是整体的是和传统的开发模式是不一样的,通过这种低代码的开发模式可以快速按照用户自己的需求通过配置的方式在扩展点上,可以通过程序扩展的方式然后来实现自己的一个业务逻辑,这也是最近比较流行的另外一种叫法就是 hpapass,是高效能的一个代码开发平台平台系统:2、低代码开发平台的显著特点• 用户只需要关注业务本身——运维管理、数据库、代码运行、防火墙、服务器全部交给平台搞定对于低代码开发平台来说用户只需要关注业务本身,像传统的开发模式,要做一个应用。不但需要去写代码,还要把本身的环境跑起来,环境跑起来之后需要运行,需要去租服务器,然后把代码托管到服务器上,后续的整个运维管理,防火墙,譬如防爬虫,防 ddos 攻击,防数据爬取,都需要自行解决。而通过低代码平台后,低代码平台完全封装了这些功能,用户只需要在平台上完成自己的业务规则,之后应用就可以通过一个简单的发布上线就可以跑起来。• 业务轻松定制与调整——可视化拖拽实现信息填报、数据收集、流程审批、报表显示在开发的过程中道理也是相同的,通过传统的开发模式,进行后端开发,可能需要懂Java可能需要懂 c 语言;进行前端开发,需要会写 Javascript; 需要好看的样式,需要写 css;做一个报表,首先要做一些数据准备,之后做一些 etl 的过程,最后再去做报表。• 一键多端移动在线同时实现——组织架构同步、消息通知同步、移动 PC 双端办公,让效率飞起来如果这个应用既想在 pc 端用,也想要在移动端或ipad 端用,就需要做多套才能满足要求。而通过低代码平台的话,低代码平台可以一站式解决这些问题,只需要把业务逻辑写好,像多端适配,一些端上的工具像钉钉、正钉,或者企业自有的这种端都可以打通,从而提升效率。低代码开发平台的业务价值• 编程门槛降低:人人都是程序猿以前想写代码,要经过一个专业的培训,如大学四年的计算机课程或培训机构,是一个有门槛的事情。而通过低代码平台,就可以做到人人都是程序员。• 业务自主权提升:业务怎么做业务自己说了算一个业务有需求了之后,首先要把自己的需求想好,然后去找对应的开发部门沟通;或者找其他人做,发布一个需求,然后做出相应功能。而通过低代码开发平台,就可以通过自行学习,搭建出自己需求的应用。• 为业务发展定制:系统不再成为业务发展的瓶颈从企业角度,讲究创新和快速响应。只有不断的创新,企业才能不断的有高的利润和增长点。从社会价值角度,例如疫情期间,要做健康打卡程序,要做来访人员的信息收集程序,通过传统的开发模式去写,时间较长,会错过疫情防控的最佳时机。而通过低代码平台的话,就可以快速响应业务的发展,在一到两天的时间就可以解决问题。• 为业务变化调整: VUCA 时代(易变不确定复杂模糊),怎么变都尽在掌控为业务的编辑变化提供了一个方便的调整。例如之前页面改一个文案,需要先找开发,然后开发改好了测试,最后发布整个流程。而通过低代码平台的话,只需要自己修改,大大节约时间。• 数据实时在线:以安全、准确的数据力驱动业务发展低代码平台可以实现数据实时在线,不通过低代码平台来做的时候,很多就是没有开发的时候,可能很多内容都是留在纸上或者通过 excel 来沉淀的,对于企业想通过数据来驱动业务发展,但数据都没有在系统里,就没有数据驱动,而有了低代码平台,就能够让业务数据迅速的线上化和语上化,为未来的数据驱动业务发展提供了一个基础。 二、宜搭产品介绍1、宜搭是什么——低代码应用构建平台宜搭是阿里巴巴纯自研,以极少的代码搭建企业应用,并一键发布到PC和手机端。传统模式下需要13天完成的应用,用宜搭2小时便可完成。主要目的在于从工具的角度,降低企业应用开发门槛,从而整体提升信息化水平,促进企业数智化转型。宜搭是阿里巴巴自研的一款低代码应用平台,它的核心的引擎都是自研的,以极少的代码搭建出企业的应用,然后一键可以发布到 pc 端和移动端。可以快速的促进企业的信息化,包括了企业的数字化转型和政府的数字化转型。宜搭的核心功能,是通过表单+流程+报表,来快速实现业务的定义,之后通过编排服务,使业务状态发生变更,让整个业务流转起来。宜搭的核心功能与编排服务2、宜搭产品发展历程——集团2000+应用实践宜搭平台从2016年10月启动,次年3月正式在阿里集团内正式上线并推广运行,经过近2年的时间的发展,逐渐成长为一个承载阿里集团以及近40家生态化公司,包括25万员工的一个就是办公平台和 APaaS 平台,并于2019年3月份在阿里云正式对外发布,2020年6月9号宜搭重磅发布了专有云版本。专有版本包括两种专有版本的,一是专有云版本,另外是专有化部署版本,这两个也是有差异的。发展历程截图
开发者学堂课程【服务网格技术最佳实践:服务网格下的东西向与南北向流量管理实践(二)】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/292/detail/3435服务网格下的东西向与南北向流量管理实践(二)四.东西向与南北向流量管理东西向:在服务网格中 所谓的东西向流量管理指在数据面在集群类,它是服务于服务之间,集群内网格内的服务与服务之间的流量管理,才称之为东西向。南北向:在网格内的流量管理。南北向就是讲集群外部的客户端连接到集群内部,或者是从集群内的服务去访问集群外的服务,我们称之为南北向。如图图的左端可以看见公共网络的左端 ,有一个公有的 IP 地址,其中一个私有的 IP 地址,是通过私有的方式。在图的右端,在集群内的服务,是访问集群外的服务,我们可以通过 egress gateway 或者直接通过 sidecar 访问外部服务。在服务网格边界,在网格内的东西向流量管理,在网格内的服务之间,东西向的管理服务之间的调用是不需要网格的。服务之间的调用,是通过集群本地的服务访问,这里没有启用服务网格技术,之前没有启用网格技术,它的服务调用是通过服务云的方式进行发现和调用,进行实验之后,调用的方式会发生改变,基本是通过服务云的方式来进行访问。在南北向流量,比如说我们用 istio 网关来举例,我们可以看到它的调用量度,在 istio 网关里面,是用其他的类型,来控制终端用户,他们之间通过系统工作来运行,具体是怎么工作的,外部请求如何到达服务网格内部,整个步骤可以通过图来了解。如图我们可以看到它可以通过公有网络的方式,也可以通过私有网络的方式,在客服端发出请求,请求会出现一个端口,在负载均衡这一侧,在某个端口进行监听。一旦请求发在负载均衡上面,上面就会把请求转发在集群中,对应的负载均衡会把请求转发在集群里面,这个服务也是标准的 K8S 的服务,这个请求到了网关之后,会通过 K8S机制找到它的网关对应的事物。第五步就是发挥作用的地方,我们会有 getway 资源,进行一个绑定, 因为在 istio 里面可以有一个网关的资源,也可以有一个虚拟服务资源,通过分别对应的资源,会有访问的专考,通过 istio 的一个入口网关资源,包括 istuo 虚拟服务资源,能够把一些路由的配置信息,附加到服务上面,通过一些解析,能够把路由的地址映射到具体的服务。那么第六个就会看到 K8S 会根据路由信息,配置到路由上面,然后把请求转发到里面去,这是转发的流程。五.Demo 五个步骤首先是创建一个具体的 ASM 实例然后再把集群,添加到实例上面去进行管理,第二步就是添加集群到 ASM 实例,装完第二步。第三步就是添加南北向入口网关,添加南北向的入口网关,根据系统规则,去把流量通过入口去请求转移到网络内部。第四步,有具体部署 Demo 的运用,我们会把应用部署到 ASM 的运用的管理的集群里面,我们会看到南北向的流量管理以及东西向的流量管理,整个流量的路由都会通过 lstio 资源来体现整个路径,在第五步我们会定义 istio 资源,我们会体现整个 Demo 的运程。首先打开阿里云的官方首页在阿里云的官方首页,可以看到在云计算基础上弹性计算的里面,我们可以看见有一个内别叫服务网格,是 ASM 的一个产品,点击链接之后,就可以进到服务网格 ASM 的官方首页。在这个里面大家可以看见首页里面介绍的内容,包括产品的介绍,产品帮助文档,完成的程度,使用的场景,在这一块我们直接进入到管理控台,去看如何管理创建服务控制台。 进这个控制台之后,可以看到有一个案例叫做创建新网格,点击之后就可以看见基本的使用网格信息,比如我们说的 demo ,之后会指定地域,比如我们说的杭州地域,可以说一下当前 SM服务产品的,已经支持了国内五个重要的地域,包括海外的东南亚,中欧的客服的地域支持,我们后续也会扩大对其他地域的支持,我们可以创建新的 VPC ,相应的会选择已有的 VPC ,或者创建一个新的 VPC 下的 swich 。接下来选择一个 istio 版本,当前我们已经选择了6.8这个版本,在下面的选项里面,重点介绍公网访问这个选项默认没有启用公网地址来报道,因为在前面,讲到 asm 这个产品是提到与社区兼容的方法,来使用服务网格的能力,你仍然可以使用实名的方式来认证这个规则,使用的途径你仍然可以使用 concle 的命令行去访问网格实例,使用公网地址暴露 APi 。如果你是公网的方式来访问这个 asm 这个时候就需要勾选,第二个选项是指是否使用公网地址来暴露组件。只有你的数据面的集群所在的 ipc 与控制平面实地所在的 vpc 不是一个,同时又没有其他方式,只能通过公网的方式来打通控制面的组件,这个时候就必须使用公网地址,如果你是用公文包来使用,就要有地址,我们的建议是使用 VPC 可以使用你的 KS 是一样的,让软件打通,在这个过程中我们就不启用公网地址,其他选项我们也是采用默认的方式。第一步我们去创建 asm 实例,创建的时候大概要用三分钟的时间,开始创建服务网格实例,可以点击日志,点击链接查看过程,可以看到它里面有一个负载均衡,去报告过程,我们等待创建过程,经过三分钟的时间,可以看到 AS 实例是创建出来了,在创建完之后可以点击名称,也可以点击管理链接,进入这个它的详情页,在详情页里面可以看到 ASM 实例的一些基本信息,包括它的所在地域暴露的地址,我们可以通过地址来访问它的 APSO,在右上角有一个共同按钮,第一个是功能设置,点功能设置,我们可以看到有一些创建的时候有一些配置项,可以通过二次更改,假如没有启用链路追踪,可以通过配置项来进行修改,第二个按钮就是连接配置,暴露客服文件,通过一些方式 cope 到本地。 用命令去连接 ASM 实例,然后进行操作,创建实例,已经完成了。第二步就是把集群添加到实例里面去,在页面我们可以看到有一集群按钮的添加,点击之后我们可以看到有一个画面,看到你所管理的这个集群,有一个选项叫与网格处于同一 VPC 的集群,它页面就进行过滤,就显示当前实例的 VPC 下载的集群,演示的例子里面是已经创建好了集群,用户可以事先创建一个集群,添加到 ASM 中,接下来就选中集群,点击确定,这个时候会有很重要的提示信息,说选定的集群加入到当前的服务网格中,在这之后我们不能在用单独的命令在集群上再去安装组件,因为控制面已经托管使用了,如果一直用并且安装组件有可能会导致集群的版本造成冲突,导致整个网格的能力不可用,一旦操作失误,需要线上网络实例,把网络集群移出 ,进行重新添加,会把一些具体信息进行恢复。在点击确定之后, 集群将会加入到 ASM 的实例中,去进行连接,会出现加入的状态,这个过程中你的 ASP 的集群就已经纳入到 AMS 实例进行管理,第二步我们已经完成。
开发者学堂课程【4节课走进 RPA 低代码开发:RPA 流程梳理和适用场景以及控制台功能展示(一)】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/290/detail/3417RPA 流程梳理和适用场景以及控制台功能展示(一)内容介绍:一、RPA 流程梳理二、RPA 场景适用三、RPA 控制台功能 一、RPA 流程梳理1.简介RPA 流程梳理是非常重要的一步,关系到实施周期,开发周期和开发方向等,流程梳理可以将业务需求转化成业务需求。如过流程梳理出现问题,将会影响项目开发人员后期开发方向。我们定义某一组活动为一个业务流程,这组活动有一个或多个输入,输出一个或多个结果,这些结果对客户来说是一种增值。简言之,业务流程是企业中一系列创造价值的活动的组合。流程梳理可以帮助交付人员更好的理解客户的业务流程,更好的挖掘企业业务需求,使业务需求向IT需求转化。2.业务流程步骤: 目标具体方式按BU进行初筛评估适合开展RPA的事业部或部门1.了解公司组织和业务架构2.了解各部门业务需求和业务痛点初步选定流程并列出BPL列出选定部门的主要业务流程1.介绍流程筛选规则2.组织各部门讨论流程列表评估RPA可行性梳理流程细节BWD评估流程复杂程度1.评估RPA可行性2.评估流程复杂性3.评估投入成本及收益回报制定实施时间计划根据实际情况制定流程开发时间计划1.规划各流程实施计划图2.安排各流程开发实施负责人举个例子:业务报销流程较复杂,时间跨度较大,按照上述流程执行后,可以了解大致的流程,根据企业需求,将发票数据填入企业数据内部,也可以进行相关计算,金额核算等操作。二、RPA 流程适用RPA 是评论流程机器人,是一款软件产品,可以模拟人的操作,RPA 需要独占一台电脑。RPA 适合重复的工作,举个发票报销的例子:未采用阿里云RPA前:手动输入发票信息录入Excel模板,汇总发票金额→与系统中合同金额进行核对匹配→匹配发票联与合同,生成采购单号→如有偏差,手工对账调整→录入业务系统,生成对公报账-物资采购类发票挂账→打印报账单采用阿里云 RPA 后:通过 OCR 自动批量采集发票信息,并在发票认证页面进行发票检验→阿里云 RPA 机器人将发票信息自动录入某系统、盘点匹配发票和合同→双路对账,并推送对账异常提示给业务人员进行调整→阿里云 RPA 自动录入报账系统并生成打印账单,自动发送指令打印报账单上部分工作是重复性地将发票信息填入到系统中,当工作量变大时,就需要用到 RPA 操作。适用 OCR 识别发票数据,将数据自动的添入系统内部进行对仗,并自动生成对账单,当对账单出现异常时,RPA 机器人可以提示业务人员进行调整。此部分就可以使用 RPA 机器人代替人工进行添入或者计算的操作,并且机器人准确性高。上述只是 RPA 机器人的一部分功能,更多功能欢迎咨询官网。三、RPA 控制台功能1.控制台是什么?阿里云RPA分为服务器,控制台,编辑器,机器人四部分。控制台是基于web网页技术,提供了如下功能:·权限配置 ·工程管理 ·安全审计 ·日志记录 ·任务设置 ·机器人监控·数据统计 ·授权管理 ·视频回看 ·版本更新服务器主要负责下发任务,存储数据,负载均衡等,编辑器主要负责任务的开发和发布,机器人负责任务的执行。2.登录方式·公共云阿里云RPA控制管理提供统一的服务器地址 https://console-rpa.aliyun.com/,·使用 chrome 浏览器访问此地址。·使用阿里云账号进行登录。登录完成以后就可以登录控制台进行试用、购买、授权和使用对于公共云,服务器有阿里云RPA团队提供。·专有云企业需要提供服务器进行私有化部署使用 chrome 浏览器访问服务器 IP 或者域名。点击【注册新企业】按照页面提示填入相关信息,管理员账号、密码进行注册。注册完成以后使用管理员账号密码登录控制台·将【授权管理许可】 【机器码】发送给阿里小伙伴并得到授权文件将授权文件导入到【更新授权许可】中。登录完成以后,在此页面查看企业机器码:3.功能介绍1.公共云和专有云有什么区别呢?公司应该如何选择呢?答:公共云是指 RPA 服务端由阿里云 RPA 团队提供,用户只需要购买授权即可使用。专有云是需要企业提供服务器进行私有化部署,所有数据保存在企业内部,只需要阿里伙伴提供授权。如果公司网络区别于互联网,并且对于数据安全要求非常严格,可以选择专有云,如果企业想要将开发的应用发布到云市场中售卖,建议使用公共云。2.控制台需要购买吗?是指定电脑才可以登录的吗?如果下班回家了还可以登录吗?公司的电脑不带回家可以用自己的电脑登录吗?答:目前控制台不需要购买的。是购买了机器人和编辑器而提供的。在网络允许的情况下,可以使用任意一台电脑登录,这里的网络允许指的是如果客户是私有化部署,那么在客户网络环境下,拥有账号密码,就可以登录控制台。公共云环境只要拥有账号密码就可以登录。所以要保管好自己的账号密码。3.如何管理企业内所有账号呢?针对不同的岗位,我可以配置不同的权限吗?针对不同的部门可以有部门的权限吗?如果员工离职了,我可以收回他的账号吗,他开发的流程怎么办呢?员工密码忘记了我该怎么操作呢?答:控制台中【成员管理】可以对企业内部所有的账号进行管理,包括权限分配,生成或收回账号,重置密码(专有云)。针对不同岗位、不同部门的员工,可在【角色】中设置不同的权限,并为每一个员工赋予不同的角色。员工离职以后,收回该员工账号,该员工开发的云端工程会转入管理员账号下。员工密码忘记可以找管理员在控制台重置密码,但是超级管理员密码无法重置。此页面为控制台的成员管理页面:可以对人工账号进行修改权限,此处权限称之为角色,可以在系统设置中进行重新设置角色。也可以重置员工的账号密码。如果员工离职后,收回该员工账号,该员工开发的所有应用如云端工程可以转入到管理员账号下,可以在角色列表中进行创建和修改角色。对于每个角色都可以进行如下配置:全部→首页→成员管理→计划任务管理→定时任务/服务型任务提醒:超级管理员密码无法重置4.机器人可以定时去执行吗?我该如何设置定时呢?机器人执行失败会通知我吗?突然有个比较紧急的任务要立即执行还不想停掉之前的任务怎么办?创建好的任务能修改吗?如何设置定时任务?答:控制台中【计划任务管理】可以对已经发布的应用进行定时设置。首先该账号需要申请使用该应用的权限,审批通过以后才可以使用。创建计划任务时可配置任务和机器人,可以选择多台机器人执行,也可以选择多台中的一台执行。由于环境多样,机器人会执行失败的可能,针对于执行失败的任务,会发送邮件通知管理员。对于突然插入的任务,执行的机器人相同时,会对比任务优先级,优先级高的任务优先执行。创建好的任务可以在没有任务正在执行时修改任务设置。此页面是计划任务管理页面首先该账号应该拥有该账号的使用权限,如果没有权限,需要审批通过以后才能使用。可以在此处新建定时任务:在新建定时任务时,选择要执行应用——选择要执行的机器人——配置任务的优先级,由于环境多样,机器人会有执行失败的可能,针对执行失败的人物,会在如下页面设置邮箱,通知管理员。
开发者学堂课程【平头哥物联网入门WI-FI方案开发实践:WIFI&BLE双模芯片市场及特点】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/766/detail/13478WIFI&BLE双模芯片市场及特点内容介绍:一、WiFi 标准概览二、WiFi 市场概览三、芯片类别四、W800特性概述 五、W800五大特性六、W800 1520 产品方案七、W800应用领域一、WiFi 标准概览WiFi 是当今应用最流行、最普遍的局域网标准,平场大家应用的手机,家用的网络摄影头、电视、路由器,这些都内置了 WiFi 的芯片。 WiFi 协议本身从1997发布到现在,历经20多年。我们可以看一下 WiFi 标准的演进情况。这里我们不针对每个 WiFi 标准做细节的阐述,我们很直观的感受到一个趋势,就是 WiFi 标准的迭代是通过新的编码技术、调制技术来提升 WiFi 的数据吞吐率。比如2019年 WiFi 是引用的OFDMA 调制,以及WiFi最新的OFDMA调制,在这么多调制方式中,应用最多的是 wifi 式技术,尤其是在物联网应用里面,WiFi 是应用的非常普遍,今天,跟大家介绍的也是一款 WiFi 式芯片。二、WiFi 市场概览WiFi 市场里面最大的一个部分其实还是手机,除去手机外, WiFi 应用的大市场一个是消费电子,比如电视,OTT 盒子,只能音箱,以及游戏设备,第二个就是网络连接设备,比如路由器,公司的 ip 以及商场转发的 CPE 设备。第三个部分就是车载电子,这个在高端车里面娱乐设备中集成。第三个就是物联网。在这里,也跟大家分享两个数据,在2019年除去手机的12亿颗芯片,非手机的将近是4亿颗。2019比2018年将近有15%的一个增长。第二个就是物联网 WiFi 或者说 MCU WiFi 在2019年增长有4亿颗,在这样一个大的前提下,2019比2018整个 IOT WiFi 芯片有70%的增长。所以说从这个市场的总体情况来看,在整个 WiFi 市场里面,IoT 芯片不仅有一个不错的占有率并且保持一个高速的增长,这也是得益于设备智能化物联网增长。三、芯片类别如果我们从某个角度对 WiFi 芯片进行分类,我们可以简单地把 WiFi 芯片分为三个类别。1、wifi 收发器WiFi 收发器更多的就是一个单独的收发单元,这个wifi 单元是一个独立的RF ,所以它无法自己进行工作,它需要一颗主控芯片,或者说需要一颗 AP 来做配合,它只负责 WiFi 的一个收发。最广的一个应用就是摄像头,摄像头里面有一个AP级处理器,通过AP处理器里外挂一颗 WiFi 收发器,这样的系统方案,成本可以做到更加具有竞争力。2、WiFi SoC跟 WiFi Tranceiver 相比的话,在 RF 单元上配置了 CPU ,配置了一些数值外设, WiFi SoC 可以独立完成系统应用,简单来说照明灯泡或者插座,只需要一颗 WiFi SoC 芯片,像灯的调光或者远程控制,一颗芯片就能够完成。当然,也有更加复杂,应用需求更加强的,比如呼吸机或者其他产品,这都是 WiFi SoC 的典型应用。3、WiFi&BT SoC在 WiFi SoC 基础上,我们发现可以把蓝牙的技术放进去,WiFi 跟蓝牙的 SoC 技术放进去,一个好处就是我可以跟手机打通,直接播放手机里的内容,我手机听歌直接通过音箱来播放。第二个,目前 WiFi 跟BT 的 SoC 领域,通过蓝牙来进行配网,这样可以提升 WiFi 产品激活的用户体验。这也是我们目前可以看到,市场上很多的 WiFi 芯片也是集成单边的趋势。所以我们简单做一个总结就是WiFi SoC有一个往系统更高集成的发展,通讯手段,蓝牙,另一方面,在系统的外侧方面,会集成更加丰富的,比如说可以加上摄像头接口,做一个简单地网络摄像。这也是目前市场很多的公司在做产品的规划趋势。四、W800特性概述 W800 是平头哥生态合作伙伴和北京联盛德微电子推出的一颗WiFi跟蓝牙双模的芯片,W800 内置了平头哥 XT804F 的 CPU ,这个 CPU 内置和单眼能够进行一个很强的预算,另外、W800 内置了TE安全,W800 它的工作频率,最高可以跑240兆,已经比市场上的其他的 LT 芯片比,有非常强的首领优势。视频单元部分刚才提到, W800除去WiFi部分,他还执行了 BT 单元,那 BT 单元目前是说我们 W800 是能够支持传统蓝牙,当前我们发布的版本里面是优先支持蓝牙10.2的协议。所以当前我们 W800 是支持 WiFi , bgn 以及蓝牙10.2。当前W800是支持 2mb flash ,这个一个非常丰富的配置。此外,如果用户需要更大的空间,W800还有 288kb RAM ,支持外扩最高 64MB PSRAM。W800还有非常好的安全设置,后面会跟大家介绍,在接口方面, W800 有五创接口以及创新外设。这里提到一点,对于传感器更好的支持考虑,W800内置了高精度的16位的 ADC。五、W800五大特性W800 跟市场其他LTV性能比的优势。1、高集成度从刚才 W800的资源已经有了这样一个感觉,就是它内置了丰富的存储单元以及数字接口单元。W800 的电路元件也是非常精简的,W800的天线匹配只需要一个简单地π形体,就能完成一个天线的匹配事件。这样一个极简设计降低了设计的复杂性,同时也降低了系统的成本。2、高性能W800 有非常强的处理能力,如果大家去看市场其他的 LTWiFi 芯片,若是时间前一点的化,储存是80到90兆赫兹。对 WiFi 的速传是完全能够满足。W800考虑除了速传部分,目前很多的 LT 在应用里面,对于系统处理一个更强的需求。所以W800最高能跑240兆赫兹。这给用户有很大一个应用开发的空间。3、高安全性W800支持 TE 安全引擎,它可以将W800系统分为安全区和非安全区。安全区好的程序是被保护的,应用程序无法随意的去获这些数据,同时W800内置 SASC 跟 TIPC 这两个单元,可以很好的对外侧进行一个加密安全保护,而W800直接固件加密,采用的是非对称加密,保证代码安全。客户也就不用担心自己辛辛苦苦开发的产品流入到市场之后被别人盗取。W800内置了TE,SHA等隐形。4、双模支持支持WiFi跟蓝牙双模。5、小体积业内 QFN 基本都是5*5的基准,那 W800 做到了4*4业内QFN最小封装。这样的话也是对很多传感器类别,或者是说针对小体积类别的应用需求可以和好的做一个应用支撑。六、W800 1520 产品方案很多客户要做一个新的芯片或新的设计的时候,总是会有一些担心产品化是不是做得不够好。因为客户的产品开发流程周期是比较长,为了帮助中高端用户缩短产品开发周期,更快地将产品推到市场。平头哥也是开发了1520极简的开发理念。W800 目前是基于1520完成了整个的产品设计以及 OCC 的上线。从我们角度,为了能够更好的支撑客户,我们觉得一颗芯片肯定要提供一颗好用的SDK、好用的开发板以及配套的调试工具、调试软件,配套的应用案例以及使用文档。W800这边提供的SDK 是基于 AliOS Things ,在SDK层面针对一部分芯片外设做很好的抽象。我们在 W800 SDK 里面是把很丰富的应用组件,包括 WiFi ,存储、散运一些主件融入进来,在做 SDK 的规划过程中,我们跟内部团队进行了拉通,直接能很好的支持阿里平台的介入,以及天猫只能平台的介入。所以说用户基于我们的SDK,不用去做过多的基础功能开发,可以直接从应用入手,这也是我们希望方案三更快落地的理念体现。W800 开发板 B2601基于通用的接融接口,可以方便方案三在评估阶段,快速的感应外置传感器,或者与外置单元进行连接,快速的完成搭建。为了方便视频工程师或者硬件工程师对硬件进行评估,我们在开发板上也预留了位置。同时我们提供了三遍的RF调试工具。很多客户他针对屏幕建立不是那么熟悉,他是有一个模组化的需求,我们在提供一个参考设计的同时,也提供了一个配套的模组。这个模组能够满足认证相关的指标需求。这样针对不想花时间去做硬件设计的客户,他可以直接参考模组来设计自己的硬件。图形化的调试工具以及调试功能是很重要的,W800配置了平头哥剑池 CDK ,拥有非常丰富的调试手段,以及非常好的用户交互界面。用户可以直接去我们的 OCC 社区下载获取 SDK ,以及将自己开发的组件上传到 OCC 中,在调试过程中,CDK也提供了丰富的手段,帮助用户更快的去发现问题,解决问题。针对客户很多的云端对接需求,W800跟飞燕平台拉通,能够提供飞燕平台的接入例程。这个从灯控的案例,能够实现从手机 app 对1等的控制。除去这些资源W800配置了丰富的使用文档,比如说基于开发的快速上手手册,API 的使用历程。综上, W800 它从软件、硬件、配件到工具、文档方面提供了丰富的资源来帮助方案三去开发和利用。七、W800应用领域1、电工照明这也是当前主要的应用场景。这里面照明不仅仅是球泡的照明,包括目前一个针对照明的很主流的一个应用,灯带的应用,W800非常合适,他主要去采样外面的信号,根据音乐信号他可以去控制这个灯带,按照固定的算法去进行一个闪动。这里面W800高级引用能够更好的进行外部采样,W800的240兆赫兹能够提供一个更强的算法支持。2、故事机故事机以及类似故事机的产品更多的是需要一个云端的打通。能够很方便的连接到云端,获取云端的资源。 W800 一方面它是一颗WiFi式芯片,另外 W800 具有高算力,你可以通过 W800 实现云端音频资源的播放。3、工业控制、医疗监护W800可以实现获得实时的监护,以及数据上传下达的功能,也是W800 所能够应用到的领域。4、智能家电比如净水器、冰箱,也是已经采用了这样一个 WiFi 的接入或者是需要 WiFi 这样的接入。W800 一个方面提供了 AT 的模组,家电厂商或者家电方案商,他可以不需要去过度关注 WiFi 功能的开发,可以通过简单地AT创口指令去针对 WiFi 进行配置,从而实现家电只能化的功能。这些应用案例也只是给开发者做一个参考,W800的核心还是连接到云端,同时针对当前很多设计, W800 具有低功耗蓝牙支持,所以,在同等价位的情况下, W800 能够提供更友好的之间,这也是 W800 的优势。
开发者学堂课程【SpringBoot 实战教程: SpringBoot 整合 Mybatis(注解方式)】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/651/detail/10800 SpringBoot 整合 Mybatis(注解方式)1、在 springboot 中利用注解的方式整合 mybatis,首先需要依赖 jar 包,依赖 mybatis 包和 mysql 包,不用连接池,直接依赖它们两个。2、创建好一个工程,跟 web 进行整合,写好启动类,mybatis 包和 mysql 包依赖好之后,配置连接数据库的信息。<!--springboot 整合 mybatis,注解版--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.1</version></dependency><!--MySQL--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency>3、创建全局配置文件,命名为 application.properties。properties 和 yml 两个都需要会用。使用 db1数据库为例。spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.username=rootspring.datasource.password=rootspring.datasource.url=jdbc:mysql://localhost:3306/db14、准备好后,以用户表为例,在逆向工程中已经生成了 pojo,准备实体类,用注解的方式,不需要 example,把它删掉。只需要留下实体类即可,对应的是用户表,创建一个包,命名为 com.db1.mapper。5、mapper 用的是注解的方式,不需要逆向工程中生成的 mapper。以注解方式如何实现?6、在 UsersMapper.java 中创建一个接口,写一个功能,根据姓名查找用户,为什么不需要 xml 配置文件?在接口中对应的功能上直接写 sql 语句,根据姓名查询用户对应的 sql 语句,在定义接口的同时就把功能对应的 sql 语句写好了。name 值如何获取?相当于输入参数,用 param 注解解决。package com. db1. mapper ;import org. apache. ibatis . annotations.param;import org . apache . ibatis . annotations . Select;import com.db1 ·pojo.Users;public interface User sMapper {@Select ("select * from userswhere name=# {name }")Users findUserByName (@Param("name") String name) ;}这就是用注解的方式整合 mybatis,不需要 mapper.xml 配置文件。这个是查找,再输入添加用户。只指定 name 和 password,对应添加的 sql 语句,输入 insert 注解,进行导入,只给 name 和 password 指定值,values 里面需要写两个单位符,输入 name 和 password 两个字段,方法和对应的 sql 语句写在一起即可。@Insert ("insert intousers (name, password)values(#{name}, #{password}) “)void addUser (@Param ("name") String name, @Param ("password") String password) ;}7、需要生成 mapper 的代理对象,扫描 mapper 即可。创建 interface,命名为 usersservice。8、写接口,对应两个功能,一个是查找用户,一个是添加用户。package com. qianfeng. service;import com.db1 .pojo. Users;public interface UsersService {Users findUser (String name) ;void saveUser (Users) ;}9、创建 class,命名为 UsersServicelmpl。10、首先加入注解,Service 里面要使用 usersmapper,进行注入,@Service public class UsersServiceImpl implements UsersService {@Autowiredprivate UsersMapper usersMapper;@Overridepublic Users findUser (Stringname) {return usersMapper . findUserByName (name) ; 返回的查询出的对象}@Overridepublic voidsaveUser (Users user) { 保存usersMapper.addUser(user.getName(), user .getPassword() ) ;}11、创建,命名为 userscontroller。import org. spr ingframework . beans . factory . annotation. Autowired;import org . springframework. stereotype . Controller;Importcom. qianfeng. service . UsersService;@restControllerpublic class UsersController {@AutowiredPrivate UsersService usersService ;@RequestMapping("/ findUser") 指定对象//@ResponseBody 返回用户对象阶层数据即可public Users findUser (String name ) 查询对象,以阶层格式返回即可,需要传递名字{return usersService. findUser (name) ;}@RequestMapping ("/addUser")//@ResponseBody public String addUser (){Usersuser=new Users () ;创建 users 对象user . setName ("王小二") ;user . set Password("9999") ;usersService . saveUser (user) ;return"ok";} 12、service 和 controller 都要被扫描,mapper 也要扫描,在启动类中加上扫描,它会扫描它的子包,mapper 要用单独的一个注解 mapperscan。@SpringBootApplication(scanBasePackages="com. qianfeng")@MapperScan ("com. db1. mapper")13、启动,访问查找用户,查找用户需要给它传递 name,输入localhost:8080/findUser?name=/小红,回车。可以看到返回的阶层数据。14、添加功能,添加王小二,返回的是 users,输入localhost:8080/addUser,报错。15、控制台提示 sql 语句表名写错,应该是 users。字串是 name 和 password,重新启动。在表里面可以看到王小二9999添加进来。这就是 springboot 如何用注解的方式整合 mybatis。
开发者学堂课程【全面讲解Spring Cloud Alibaba技术栈(知识精讲+项目实战)第五阶段:Seata案例-Seata使用】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/687/detail/11930Seata案例-Seata使用内容介绍一、前言和总述二、seata 的基本介绍三、初始化 seata 在 nacos 中的配置四、启动 Seata 服务五、使用 Seata 实现全局控制一、前言和总述通过异常模拟的方式发现了在当前的分布式系统中事务是无法控制的,接下来就要利用 seata 去解决这个问题。二、seata的基本介绍1、服务端其实 seata 的服务端也称作 seata 的 server,指的就是TC事务协调器。事务协调器是一个非常重要的组件,它用于管理全局事务的提交或回滚,在 seata 中是单独进行的一个应用。只需要把它下载下来,修改对应的配置然后启动就可以了。2、下载地址首先 seata 下载地址为https://github.com/seata/seata/releases/v0.9.0/这是 seata 在 github 上的地址,其中有对应的格式。在此已经准备好了一个zip格式的,直接使用就可以。把 seatasever 复制到工作空间中,对 zip 格式的压缩包进行解压到当前的文件夹中。解压后出现了一个 seata 的文件夹,原有的压缩包就删除了。3、配置修改 seata 的一些配置,主要修改的有两个文件。(1)registry.conf对其是修改注册和配置的指定。①注册中心它支持的注册中心有文件、nacos、eureka、redis、consul 等很多类型。默认的注册中心为软件。现在已经学习过 nacos,而且是阿里巴巴技术站中的内容。所以要优先考虑使用 nacos,也就是要把默认的注册中心改为 nacos。②控制中心同样它的控制中心也支持 file、nacos、apollo 这些内容,默认的控制中心同样为 nacos。指定的就是本机的命名空间是 namespace,默认空间为public。Cluster 集群使用的是 default。基本上均是默认配置,只需指定一个nacos就可以了。(2)nacos-config.txt对第二个配置文件进行修改,在当前文件夹之下有一个nacos-config.txt,其中存在着许多的配置,但需要调整的只有一个地方。但是微服务中还未配置,首先要配置好,等一下配置微服务时与其保持一致就可以了。前面的 service.vgroup_mapping 不能变动,后面的 default 也不能改动,只需要对中间部分的 product-service 进行改动。中间部分使用的就是微服务的名称,只要牢记在微服务中配置项的时候与product-service 保持一致就可以了。这就是需要进行调整的两个配置,这两个配置调整之后接下来就是启动 seata。三、初始化seata在nacos中的配置在启动 seata 之前,首先要把 seata 中的一批数据初始化到注册中心中,它提供了一个脚本为 nacos-config.sh127.0.0.1,对此需要保证 nacos 是正常运行的。nacos 中的配置,找到配置列表后发现其中是空白的。接下来对其进行初始化,然后运行 nacos-config.sh,会发现它在做一些脚本的初始化。初始化完毕后再次进行刷新,会发现出现了大量的配置项。这些配置项均是 seata 内置所要用到的东西。主要关注的其实就是刚才所填写的配置的名称,即service.vgroup_mapping.product-service 和service.vgroup_mapping.order-service。这个只要正确就说明刚才的配置文件没有问题。它们的分组均是SEATA_GROUP。这样的话在初始化中 nacos 的配置就成功了。四、启动Seata服务启动 seata 之后也会注册到nacos中,在 nacos 的服务列表中可以看到一个名为 serverAddr 的服务,这个服务在目前为止是不存在的。启动的命令是 seata-sever.bat-p-mfile,p 指的是端口,监听在9000端口上。这个端口号可以随便写,只要不重复就可以。mfile就成为一个模式,对其直接使用就可以了。等待它启动完毕之后会在 nacos 中注册一个服务,再次刷新就会发现有一个 serverAddr,默认分组的名称为 DEEAULT_GROUP。只要看到 serverAddr 就证明 seata-sever 是启动成功的,不存在任何的问题。至此事务协调器已经准备完毕了。接下来就在应用中添加 TM 以及 RM,两者是以一个依赖包的形式加入到服务中的。在使用 seata 实现事务的控制中有一个初始化的数据表,这张数据表其实是用于记录 undo_logo 日志的。五、使用Seata实现全局控制1、初始化数据表(1)文字讲解现在开启全局服务,在下单完成之后,会将本地事务提交上去,在数据库之中就已经存在这条日志了。在日志存在以后,当商品微服务后面后面的半只服务出现问题时是无法回滚的。所以 undo_logo 日志就是用来记录事务本身的操作。事务操作之前和之后分别为什么样子均记录下来。一旦发现后面的半只事务出现问题了,立刻按照 undo_logo 日志中的内容进行回滚。把 undo_logo 日志打开,其中有分支事务ID、全局事务ID以及回滚的信息等等。(2)代码如下:CREATETABLEundo_log"id'BIGINT(20)NOTNULLAUTO_INCREMENT,branch_idBIGINT(20)NOTNULL,xidVARCHAR(100)NOTNULL,contextVARCHAR(128)NOTNULL,rollback_infolongBloBNOTNULL,log_statusINT(11)NOTNULL,log_created`DATETIMENOTNULL,loq_modified`DATETIMNOTNULL.'extVARCHAR(100)DEFAULTNULL,PRIMARYKEY('id'),UNIQUEKEY'ux_undo_1og’(`xid',"branch_id')ENGINE=INNODBAUTO_INCREMENT=1DEFAULTCHARSET=utf8接下来是对各个微服务的修改。对微服务的修改主要包括一下几个内容。2、添加配置(1)添加依赖这个依赖就认为是 TM 和 RM 的所在包就可以了。三个组件分别为TC、TM 和 RM。TC是以单独的应用执行的,而 TM 和 RM 均是在这样的依赖包中的。代码如下:com.alibaba.cloudspring-cloud-starter-alibaba-seata(2)DataSourceProxyConfig第二部分要配置一个代理数据源,seata 是通过代理数据源来实现事务分支的,如果不提供它则是无法进行事务回滚操作的,所以需要配置 io.seata.rm.datasource.DataSourceProxy 的 Bean。以下所使用的是德鲁伊的数据源所代理出的。在两个微服务中同样需要加入 config 这样的包,然后在此下面创建一个类,这个类的内容对以下的代码直接进行复制即可。这就是一个代理的数据源,对此还需要导入 seata 提供的一个包就可以了。此外有一个 spring.Datasource 的前缀,这里一定是和 resources 下的 application.yml 相对应的。代码如下:@ConfigurationpublicclassDataSourceProxyConfig{@Bean@ConfigurationProperties(prefix=“spring.datasource”)publicDruidDataSourcedruidDataSource(){returnnewDruidDataSource();}@Primary@BeanpublicDataSourceProxydataSource(DruidDatasourcedruidDatasource)returnnewDataSourceProxy(druidDataSource);(3)registry.conf接下来就是把方才所需要配置的 registry.conf 放置在微服务中,因为微服务也是需要从 nacos 中引用内容的。对此直接进行复制,放到 resources 下面的一个新的文件,它的内容与方才所用的seata下面的 conf 是相同的,它是去寻找与之相对应的 nacos 的。代码如下:registry{type="nacos"nacos{serverAddr="localhost"namespace="public"cluster="default"}config{type="nacos"nacos{serverAddr="localhost"namespace="public"cluster="default"(4)bootstrap.yaml这里面最重要的内容只有两点,第一个是指定读取 nacos 中的配置,因为在 TC 中已经预支了很多的配置机理。下面还有一个 seata 的 service 的分组,需要注意的是这个分组要和前面的 order-service 保持一致。如果两者不相同,则是无法找到它的分组,也就无法对其进行控制了。Namespace 所用的是public,group所用的是 SEATA_GROUP,与配置列表中的 SEATA_GROUP 相对应。需要注意的是 product-service指的是service-product。最终要保持相同的是两个 product-service,只不过默认的是二者均和 service-product 保持一致。代码如下:spring:application:name:service-productcloud:nacos:config:server-addr:localhost:8848#nacos的服务端地址namespace:publicgroup:SEATAGROUPalibaba:seata:tx-service-group:product-service3、在 order 中开启全局事务如果要处理全局事务仅需要一个注解 GlobalTransactional 就可以解决。要找到需要开启的地方并把注解填进去。找到下订单要执行的方法,把 GlobalTransactional 代入即可。只需要这样一个注解,没有其他的任何代码。Seata 执行的是没有代码的侵入性原则,这里就与其相对应。分别来启动 order 和 product,等到启动完毕之后重新下一个订单看会出现什么情况。现在是有两个订单,库存为4999。把库存恢复成5000后进行刷新,再把 order全部删除,这样的话测试起来就顺利一些了。现在两个服务均已经启动了,通过 nacos 对其是可以进行监听。再次来看一下执行流程。保存之后需要把断点了解一下,之前需要确认一下 product 是有断点的。在此看一下数据库了解情况。首先看一下 order 的表格,看是否有保存的订单。会发现方才已经提交了,但现在又被回滚了,因为在此有一个时间的限制。重新再做一次下单,在经过一个断点之后会发现在 undo.logo 中已经有日志了。日志中最重要的内容是在进行回滚的时候需要用到的一些信息,会记录一些原始的状态。其中记录了原本的值,如果出现问题时就按照这个值进行回滚。一旦出现异常就按照相关的规则进行回滚了。在刷新后是没有订单的,库存也是未扣除,就不存在问题了。
开发者学堂课程【SpringBoot 实战教程: SpringBoot 实现批量文件上传】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/651/detail/10809SpringBoot 实现批量文件上传1、在之前的工程中添加 html 页面,选择三个文件。文件1: <input type="file" name="file" /></p><p>文件2: <input type="file" name="file" /></p><p>文件3: <input type="file" name="file" /></p><p>提交的地址是 upload/batch,提交方式是post,同样是 form-data 类型。form method= "POST" enctype= "multipart/form-data "2、在 UploadController.java 中输入:@RequestMapping (" /upload/batch")路径和 html 上保持一致@ResponseBody 返回上传成功或者上传失败,字符串类型public String uploadFiles (MultipartFile [ ]file, HttpServletRequest request)名字也要保持一致,只不过需要改成数组//便利数组,把每一个文件生成相应的服务器名称,再进行上传@Controllerpublic class UploadController {@RequestMapping (value="/upload/batch" , method=RequestMethod. POST)@ResponseBody public string uploadFile (MultipartFile[] file,HttpServletRequestrequest) 改成数组形式{Try{ //创建文件在服务器端的存放路径String dir=request.getServletContext().getRealPath(" /upload") ;File fileDir=newFile (dir) ;if(! fileDir .exists () )fileDir .mkdirs () ;/ /生成文件在服务器端存放的名字,数组名加下标for(int i=0; i<file.length; i++){ 做循环便利即可,每循环一次就是要上传的文件String fileSuffix=file[1].getOriginalFilename (). substring (file[1].getOriginalFilename () . lastIndexOf ("."));String fileName=UUID. randomUUID() . toString() +fileSuffix;File files =newFile(fileDir+‘’/‘’+fileName);//上传file[1]. transferTo (files);写入到服务器端,每一个名字都要生成服务器端的名称}}catch ( Exceptione){e.printStackTrace () ;Return’’上传失败’’;}Return’’上传成功’’;}}3、进行批量上传,首先显示 html 页面,还需要再写一个 controller,controller 的作用是转到这个页面上。@RequestMapping("/ indexs")public String toUploads(){return "uploads" ;}4、启动成功,访问 localhost:8080/indexs,出现批量上传的页面,可以上传三个文件,点击上传,上传成功。5、查看服务器端,可以看到多了三个文件。这就是批量上传的实现。
开发者学堂课程【SpringBoot 实战教程: Neo4J 介绍及安装】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/651/detail/10810 Neo4J 介绍及安装内容介绍:一、介绍二、安装 一、介绍1、Neo4j 是一个高性能的,NOSQL 非关系型,redis 属于关系型数据库,图形数据库,它是一个嵌入式的、基于磁盘的、具备完全的事务特性的 Java 持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j 也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。2、这种数据库与传统的关系型数据库有很大的差别。关系型数据库与图形数据库比较(1)关系型数据库:常用的像 mysql,oracle 等都是关系型数据库,在关系型数据库里面对数据的处理是这样子的,对每个对象都创建一个表,对象的属性对应表里面的列。这是一张用户表:idnamesexphone1timboy1102liligirl120如表所示。在数据库里有条数据表示两个对象:tim,lili。在现实生活中会发现任何对象都是有某种联系的,那么关系型数据库里是怎样来表示这种关系呢?就比如tim和 lili 是好朋友,那么在数据库里怎样来表示他们的关系呢?关系型数据库里面是这样处理的,新建一个 relationship 的表,表里面有两个字段 id,friendid。idfriendid1221如图所示。如果要查找 tim 的朋友那么可以遍历 relationship 表就可以了。这种数据模型会有什么问题呢?其实可以对这个数据模型提个问题——tim 的朋友的朋友的朋友的朋友是谁?好,关系型数据会这样回答你的问题:首先在 relationship 表里面找到所有 id 为1(tim 的 id)的数据,然后拿到对应的 friendid,接着逐个根据friendid再进行遍历找到对应的 friendid,如此反复地遍历查询。也许10分钟也许一小时,也许它永远都无法回答你的问题。其实,这种关系只要超过5级关系型数据库就无法解决问题,这就是为什么需要图形数据库的出现了。有些情况下并不是查它的朋友,可能会查它朋友朋友的朋友,虽然也能实现,但是查询,写 sql 语句比较麻烦,另外查询语句执行的性能会比较低,在这种情况下 Neo4j 可以解决这个问题。它把每一个用户看作一个节点,多个用户就是多个节点,用户和用户之间是有关系的,节点和节点之间有关系。(2)图形数据库:在图形数据库里面对数据的处理是这样子的:每个对象都表示成为一个节点(node),每个节点之间的联系表示成关系(relationship),节点与节点之间用关系关联在一起。可以看图更好理解一点。如图所示,有三个节点(node)它们都通过 FRIEND 关系(relationship)关联起来。Tim 的朋友是 lili,lili 跟 jack 互为朋友,同时 jack 认识 tim。在图形数据库里要回答像“tim 的朋友的朋友的朋友”的问题非常简单,数据库只需要找到 tim 的关系(relationship)所对应的节点然后找到对应节点的关系(relationship),只需遍历几次,这样就可以很容易回答了上面的问题了。圆圈表示节点,一个圆圈是一个节点,节点和节点之间,就是用户和用户之间,箭头表示它们之间的关系,表示 tim 认识 lili,lili 认识 jack,jack 认识 lili,jack 认识 tim,但是 tim 不一定认识 jack,tim 的朋友是 lili,tim 的朋友的朋友是 jack,从图形化的上面很容易找到相应的朋友,如果用关系型数据库就相对比较麻烦,甚至,比如找朋友的朋友的朋友,基本上实现不了,这就是图形数据库,最近几年之所以流行的原因。二、安装1、下载 windows 环境下的安装包 neo4j-community-3.3.4-windows.zip。2、解压,解压到某一个目录下,比如目录为 E:\neo4j。目录结构,bin 是 neo4j 的可执行文件,配置文件,conf 是数据存放的目录,data 是它自己的架包。3、设置环境变量,配置方式和 java 一样。(1)变量名:NEO4J_HOME(2)变量值:E:\neo4j(3)再修改变量 path,增加 %NEO4J_HOME%\bin4、查看并编辑配置参数%NEO4J_HOME%\conf\neo4j.conf5、启动在 DOS 命令行窗口,执行:neo4j.batconsole2018-03-29 08:36:21.329+0000INFO2018-03-29 08:36:21.372+0000INFOStarting.018-03- -29 08:36:23. 145+0000INFOBolt enabled on 127. 0.0.1: 7687/2018-03-29 08: 36: 28.204+0000INFOStarted.2018-03- 29 08:38: 43. 999+0000 INFORemote interface available at http://localhost: 7474/看到这个信息说明 neo4j 正常启动了,相当于 neo4j 服务启动了。端口是7474。6、打开 neo4j 集成的浏览器,如果是第一次访问会要求登陆。登陆名和密码都是 neo4j,它会要求修改密码。http://localhost:7474/出现以下页面就证明 neo4j 安装成功并且启动成功,可以正常访问。既然它是数据库,就像 mysql,操作 msql 需要 sql 语句,增删改查。Cypher 语言:Cypher 是专门为图像数据库设计的语言,它浅显易懂。图形数据库,也就是 neo4j,重点就两个,一个是节点,一个是关系,创建节点的同时创建关系,另外涉及到查询,查询节点。举例,假如要创建这么一个数据模型,好友 A 与好友 B 是朋友关系,好友 B 与 C 也是朋友关系,好友 A 认识 C 但 C 不认识 A,这样的数据模型用 Cypher 描述如下:create 建立节点(A:Person 节点,里面指定了属性,属性的名字,和属性的值{name:'jack'})-[:Friend]->(B:Person{name:'tom'})-[:Friend]->(C:Person 这是一个节点{name:'lucy'}),(A)-[:Know]->(C)这是一个节点(注:()里面的是节点,[]里面的是关系,{}里的是属性名和属性值,类似于阶层格式>表示关系的方向)中括号是关系,friend,朋友关系,说明 a 和 b 是朋友关系,箭头是指向 b,a 是认识 b 的,b 是 a 的朋友,c 是 b 的朋友。要查询A的一个名叫”tom”的朋友:match(a)-[:Friend]->(b) a 的朋友用 b 代表Whereb.name='tom'查询条件,朋友必须叫 tomReturnb 查询之后返回Cypher 语言的实现用的是 match。
开发者学堂课程【云原生基础概念及阿里云云原生产品介绍:阿里云函数计算(Serverless)产品介绍与技术特】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/650/detail/10766阿里云函数计算(Serverless)产品介绍与技术特性内容介绍一、函数计算-介绍二、函数计算-事件驱动连接云端服务三、函数计算-场景示例 Web 应用 /API 后端服务一、函数计算-介绍1、Serverless 分为两部分:一种架构思想,一种理念,就是常讲的 base 化,意味着整个软件架构可以做到全托管、免运维、极致弹性、无天容量、按需申请、按月付费,极大提升IT效率,降低成本。2、Base 也是 Serverless 比较核心的形态,基于函数响应事件驱动的模型。比如上传一段代码到云上,上传之后是没有运行的,没有事件触发就不会运行,有事件触发就会把代码运行,事件处理完后就会销毁掉,并且整个运维、监控的问题都不需要考虑了,只需要写好代码就可以了。所以这个模型就需要有非常多的事件集成,在底层做非常多的弹性能力、全链路的打通,让用户更加专注于业务逻辑。3、同时也支持丰富的编程语言:Nodejs、python、java、php、C#也可以自定义语言。二、函数计算-事件驱动连接云端服务丰富的事件源对象存储、API 网关、消息服务、表格存储、日志服务、HTTP、定时器、IOT、DataHub、CDN 云监控、云呼叫中心事件驱动﹐简化编程模型﹐编写少量的代码即可串联多个服务实现复杂的功能。比如一个论坛需要用户上传一张图片,上传以后有很多的工作要做,比如要分析一下这个图片,做一个缩略图,一般来讲写一个微服务实现这样的功能。微服务按传统的方式要部署到线上,即使没有用户上传也要部署到线上,如果用函数计算写这个服务,就是图片上传的事件出发一段代码,这段代码是不在线上部署的,只是把代码传递到仓库里面,构建一个镜像,当有人上传一张图片,这个镜像会被运行起来将事件处理完成。比如这时有一千个用户上传了以前张图片,那么会拉起一千个实例,快速处理完之后销毁掉。有这样的需求才会有这样的计算,平时是没有的,具有非常好的弹性和响应速度,带来一个成本的优化效果。整个函数式编程模型通过代码编程片段可与云平台进行交互,代码和云之间形成一个服务界面,大幅提高了企业 IP 构建的效率。三、函数计算-场景示例 Web 应用 /API 后端服务有很多的场景都会用函数计算实现,包括:Web 应用、IoT/API 后端服务、大规模图片﹑文档﹑音视频处理、大规模消息处理、AI 推理、日志流式处理,只要是能抽象成一个事件驱动的模型都可以用函数计算实现。解决的痛点问题:1、负载快速增加﹐服务器过载﹐性能不稳定2、业务请求有明显波峰波谷﹐按峰值预留资源﹐成木高3、管理机器﹐操作系统﹐中间件﹐应用等﹐运维复杂度高4、串联多个云服务﹐快速实现弹性高可用的后端服务5、丰富的计量模式﹐资源利用率高﹐成本低6、无需管理基础设施﹐运维复杂度低而且拥有国内最大的 FaaS 企业客户群,发展也是非常迅速的。
开发者学堂课程【Kubernetes 极速入门:K8S 集群核心概念 Service 删除 Service 及学习总结】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/658/detail/10920K8S 集群核心概念 Service 删除 Service 及学习总结内容介绍:一、删除 Service二、学习总结 一、删除 Service1. 通过命令行删除1. 命令2. 查看 service3. 【root0master1 -】# kubect1 get service1. 输出2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)AGE3. nginx-app ClusterIP 10.109.21.171 <none> 80/TCP18m在现有的 service 当中,首先查看 service ,如下图所示:图中的 nginx-app1 nginx-app2 nginx-app3 等,图中 nginx-app1是通过命令行创建。那么可以直接使用 kubectl delect service nginx-app1 进行删除,如图所示:如果通过命令行来创建的文件,不建议采用资源清单文件去删除。因为本身未创立清单文件,如要进行删除,又需再创立一个资源清单文件,这样会显得操作更加繁琐。操作运行结果如图:2. 通过资源清单 YAML文件删除:如要通过此方式删除,前提是该文件是通过资源清单文件的形式创建。如下图中,如果需要删除 nginx-app2-svc 删除,则使用04-create-deployment-nginx-app2-service.yaml 进行删除操作结果如下:此操作不仅删除了 service-nginx-app2-svc 文件,也删除了deployment.apps”nginx-app2”在大部分文件中,如果部署了 service,建议使用资源清单文件的方法删除。 二、学习总结1. Service介绍Service 不是一个实体服务,是一条IPtables 或PVS转发规则2.Service作用 可使iPod客户端通过Service 访问Pod,可以通过标签对Pod 进行关联3.Service类型Service分为通过集群内访问的 ClusterIP 类型,通过集群外访问的 NodePort 类型,在云台当中部署使用到的 LoadBalancer 类型和可以把集群外的服务引入集群内部的ExternalName4.Service参数第一是port,为 service 所对应的端口;第二是targetPort,为容器所对应的端口;第三是Nodeport,在使用 NodePort 资源类型时使用的端口5.Service创建一是通过命令行来创建 Service ,二是通过资源清单YAML 文件创建 Service6.删除 Service一是通过命令行来删除 Service,二是通过资源清单YAML 文件来删除 Service
开发者学堂课程【Kubernetes 极速入门:K8S 集群 NaneSpace(命名空间)NameSpace 删除及学习总结】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/658/detail/10883K8S 集群 NaneSpace(命名空间)NameSpace 删除及学习总结 内容介绍:一、通过 kubectl 命令行删除二、通过 kubectl 命令应用资源清单文件删除三、学习总结四、课程预约注意:删除命名空间时,命名空间中包含的所有资源对象同时被删除。因此删除过程中如果有写资源对象不想被删除的,尽量不要直接删除 namespace。 一、通过 kubectl 命令行删除先确认 namespace 是否存在例如:[root@master1 yamldir]# kubegt1 get namespaceNamespace 存在则可以使用[root@master1 yamldir]# kubect1 delete namespace test直接删除 二、通过 kubectl 命令应用资源清单文件删除先确认 namespace 是否存在例如:[root@master1 yamldir]# kubegt1 get namespace然后查看 namespace 资源清单文件是否针对于该 namespace 的例如:[root@master1 yamldir]# cat 01-create-ns.yam1apiversion: v1kind : Namespacemetadata:name: demons1然后再通过 namespace 资源清单文件删除例如:[root@master1 yamldir]# kubect1 delete -f 01-create-ns.yam1用 kubect1 delete 加资源清单文件名就可以把这个资源清单文件删除三、学习总结1.NameSpace 介绍NameSpace 是命名空间,属于逻辑隔离,管理边界,不是网络边界,可以做配额2.查看 NameSpace(1)kubectl get namespace(2)kubectl get ns3.创建 NameSpace(1)通过命令行创建 例如:kubectl create namespace test(1)通过资源清单文件创建4.删除 NameSpace(1)通过命令行删除例如:kubectl delete namespace test(2)通过资源清单文件删除
开发者学堂课程【Kubernetes 极速入门:K8S 集群 NameSpace(命名空间)_NameSpace 介绍及查看】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/658/detail/10883K8S 集群 NameSpace(命名空间)_NameSpace 介绍及查看 内容介绍:一、场景二、学习目标三、学习步骤四、课程内容 一、场景需要准备两套 k8s 集群用于开发测试及预发布,但是由于项目组可用主机资源有限,没有那么多主机可用,不能满足两套 k8s 集群的要求,所以播仔就想在现有的 k8s 集群中运行两套环境,你觉得可行吗?答案是可行的,我们可以使用 k8s 集群中的命名空间即可实现开发测试与预发布环境的隔离。 二、学习目标1.了解 NameSpace 作用2.掌握查看方法3.掌握 NameSpace 创建方法4.掌握 NameSpace 删除方法 三、学习步骤1.第一步:NameSpace 介绍2.第二步:查看 NameSpace3.第三步:创建 NameSpace4.第四步:删除 NameSpace 四、课程内容1. NameSpace 介绍(1)命名空间: 对于一个空间的命名。比如教室101、102等。(2)作用:多租户情况下,实现资源隔离。在这个 k8s 当中如果部署十个应用不能在一块隔离,所使用的就是多租户隔离。(3)属于逻辑隔离:比如小时候在桌子上画的三八线,并不是物理性隔离。(4)属于管理边界:不能跨出命名空间来管理。不论管理边界有多大或者多小,每个项目之间的命名空间的中获取的 IP 地址都是由网络附件来分配的,网络附件来分配的过程当中没有区分命名空间和非命名空间的,都是属于网络插件的管理范围之内的,所以它不是一个网络的边界。(5)不属于网络边界(6)可以针对每个 namespace 做资源配额:如果资源有限的情况下,可以来做相关的操作,如果资源够用,一般是不需要的。2. 查看 NameSpace(1)命令[root@master1~]# kubectl get namespaceGet 是一个基础性命令,获取某一类资源,加上之后就会有相应的输出。就可以看到相应的资源名称,资源的状态以及资源生成的时间。1.输出 2.NAMESTATUSAGE3.defaultActive16h4.knbe-node-leaseActive16h5.kube-pulicActive16h6.kube-systemActive16h(2)演示过程我们知道在这个集群当中,既可以在 master 级别当中,也可以在 worker1级别当中来使用 kube-system 命令来获得集群的相关信息,这里选择在 master 级别来操作,可以直接使用 kubectl get 后边加上资源的命名空间的类形,然后直接回车,就会有相应的输出显示,名称、状态、时间.(3)说明Default 命名空间:用户创建的 pod 默认在此命名空间,如果创建空间时没有指定的命名空间的话,它会自动出现。kube-publi 命名空间:所有用户均可以访问,包括未认证用户,是比较危险的。kube-node-lease kubernetes 命名空间:集群节点租约状态可以看见的,是在后 v1.13加入的。在早期的 v1.9、 v1.10是看不见的。kube-system 命名空间:是比较重要的,仅用来查询使用,因为他是kubernetes 集群组件运行的命名空间,是不可以删除的。在早期和演示过 kubectl get pods,pods 是一种资源类型,他是一种k8s集群能够管理的最小的调度单元。
开发者学堂课程【阿里云上搭建 LAMP 环境实战:安装 PHP7.3.10及其依赖源码包】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/663/detail/11090安装 PHP7.3.10及其依赖源码包 内容介绍一. 安装 libxml2二. 安装 libmcrypt三. 安装 mhash四. 安装 mcrypt五. 安装 libpng六. 安装 jpeg9七. 安装 freetype八. 安装 PHP 一. 安装 libxml2php 的安装也比较复杂,他不是容易出错,虽然下载的是最新的版本,但是因为装 php 的时候,还要装很多 php 的扩展,因为有了这一扩展, php 的功能才很强大,所以是比较麻烦的。扩展有什么作用,回到下载软件的目录,看一下,还有很多的软件包没有解开,这些剩下的其实都和 php 相关的,第一个安装的就是 libxml2 ,在前面试验的时候已经安装过了,已经有了,就不用再去安装了。那 the lib 用到的前面也已经装过了,也不用安装了。#tar-xflibxml2-2.9.9.targg#cd/root/lamp/libxml2-2.9.9#./configure--prefix=/usr/local/libxml2/# make# make install二.安装 libmcrypt我们按照这个步骤继续,先从这个加密软件来安装,首先同样的步骤先解包。这些软件的安装都相对比较容易,直接配置就行了,粘贴都装在固定指定它的安装目录。比较简单,等待一下,然后直接输入 make and make install 直接编译安装一起完成,完成后没有问题可以看一下他的加目录, usr 下边, local 下边有没有数据,有数据没问题回来,继续安装下一个软件。#tar-xflibmcrypt-2.5.8.tar.gz#cd/root/lamp/libmcrypt-2.5.8#./configure--prefix=/usr/local/libmcrypt/# make# make install安装libltd,也在libmcrypt源码目录中,非新软件#cd/root/lamp/libmcrypt-2.5.8/libitd#./configure--enable-Itdl-install# make# make install 三.安装 mhashxf mhash 解压进入到 mhash 这个目录下,然后直接不用指定目录输入 make and make install 一起安装# tar -xfmhash-0.9.9.9.tar.gz#cd/root/lamp/mhash-0.9.9.9# ./configure# make# make install 四.安装 mcrypt解压进入软件目录,需要配置一下环境变量,然后需要指定它的依赖。粘过来,前面已经安装完成,输入 make and make install 安装,安装完成没有出错误# tar-xf mcrypt-2.6.8.tar.gz #cd /lamp/mcrypt-2.6.8#exportLD_LIBRARY_PATH=/usr/lccal/libmcrypt/ib:/usr/local/lib变量: LDLIBRARYPATH 用于指定 libmcrypt 和 mhash的库的位置 #./configure--with-libmcrvpt-prefix=/usr/local/libmcrypt# make# make install 五. 安装 libpng 同样回到目录下解包,xf libpng 解压进入到 libpng 一定要进入到他的目录下边,然后指定他的安装位置,这些软件都不太容易出错,所以我们只要文件,名称,目录别打错就可以。输入 make and make install 安装#tar-xf libpng-1.6.7.tar.gz#cd/root/lamp/libpng-1.6.7#./configure-prefix=/usr/local/libpng# make# make install 六. 安装 jpeg9如果装 jpeg6 他的默认加目录需要一个一个指定,比较麻烦。直接解压安装,进入目录后配置指定他的加目录,不用手动创建了,加上共享模块和静态模块这两个选项,输入 make and make install 安装,所以有一些新版本的软件还是比较容易安装的,比原来省事多了。#tar-xfipegsrc.v9c.tar.gz#cd/root/lamp/jpeg-9c/#./configure--prefix=/usr/local/jpeg9/--enable-shared--enable-static# make# make install-enableshared 与-enablestatic 参数分别为建立共享库和静态库使用的 libtool 七. 安装 freetype同样解包,进入到目录下边,然后我们直接执行指定加目录,粘贴 ./configure--prefix=/usr/local/freetype/ 这样用 PHP 处理图像就可以使用图像上面输出一些字体,输入 make and make install 安装,用 PHP 时可能会出现 PHP freetype . H 这个头文件没有发现,解决方法是补充一个依赖包即可#tar-xffreetype-2.10.0.targz#cd/root/lamp/freetype-2.10.0#./configure--prefix=/usr/local/freetype# make# make install#yum install freetype-develPHP 会出现 Configureerror:freetypeh not found错误解决方法如下:使用:yum installfreetype-devel 补充依赖包即可 八. 安装 PHP同样的方法先解压,装的是最新版本7.3.10,进入 PHP 7.3.10目录下,这是 PHP 的源文件,要记住,后期会有一些拓展文化在源文件里直接可以去找到。同样,他的配置选项需要很多,把他粘贴过来,/configure-prefix=/usr/local/php/\\ 指定配策文件目录 with-config-file-path=/usr/local/php/etc/\-with-apxs2=/usr/local/apache2/bin/apxs\ 指定apache动态横块位置 -with-libxml-dir=/usr/local/libxml2/\ 指定licxml位置 with-jpeg-dir=/usr/local/jpeg9/\ 指定1088位置with-png-dir=/usr/local/libpng// 指定 libong 位置 with-freetype-dir=/usr/local/freetype/\ 指定 freetype.位置 with-mcrypt=/usr/local/libmcrypt/\ 指定libmcrypt位置with-gd\ 启用gd 库--enable-soap\ 支持soap服务(api)enable-mbstring=all \ 支持多字节,字符串 enable-sockets 支持套接字 -with-pdo-mysql=/usr/local/mysql\ 启用 mvsol的 pdo 模块支持 with-pdo-mysgl=mysqlnd \ Mysql Native Driver 简称:mysglnd --with-gd--without-pear 不安装 pear(Composer代替)输入 make test 执行,一共需要测试 PHP 的13376个函数可用。再输入 make and make install 安装,出现的警告可以忽略,只要不是致命错误就行,没有提示错误,PHP 安装完成。1.生成 PHP 配置文件软件已经有了,那我们怎么配合使用呢?还需要配置文件,把配置文件安装时指定配置文件在 PHP 加目录下,etc 下面,到 usr , local 下面,创建一个 etc 的目录,mkdir 创建一个 etc #mkdir/usr/local/php/etc#cp/root/lamp/php-73.10/phpini-production/usr/local/php/etc/php.ini在这个目录下,只要把源码包里面已经自带的一个文件拷贝过来,变成 php.ini ,就是 php 的配置文件。拷贝在 root,lamp 下边。暂时先不用修改,那 php 也不需要启动。可以用了,在 php 的加目录下,也就是 bin 目录下,里面有这么多 PHP 可用的命令。 php ,还有 phpize ,这是后面扩展用的,这里用 php 定义就行了。如果想要其他目录下也用这个文件,那就直接使用这个文件,把这个做到环境变量里就可以了。回到我的 root 目录下,新建一个 vi.test.php 文件,随便写一些 php 代码。比如 ls 这是一个 test 测试,回车,保存。执行 share 脚本, share A. share. 那 php 脚本呢? usr,local 下面的 php 加目录下有个 php 命令用它执行。输入 test.php 就执行了。那同样,想看一下 php 默认安装了哪些模块,—m 这就是 php 现在已经安装的模块,好多模块现在都没有,那想装这些扩展模块,后期用 ppize 安装就行了,在 apache 目录下的 htducs 目录下有一个 test.php ,现在 apache 就能执行它吗?我们在安装 php 时,已经将这个 php 的模块作为一个 apache 的模块装到了 apache 目录下 apxs 目录下,到这个目录下看看有没有这个扩展,usr 下边, local 下边, apache 下边,发现这个目录现在不存在,后期扩展再生成这个目录,现在只是指定 bin 下面的这个文件,这个文件指定他下面的这个位置。回到 htdocs 目录下,看一下 test 文件能不能执行,usr 下边,local 下边,bin 下边的 php 执行一下 test.php ,还记得这里面的内容,查看一下。我们写的是一个循环,输出时还有语句,那这个文件,我们现在在浏览器能不能执行,如果能,证明 php 已经挂在 apache 上了,apache 可以去解析了,刷新一下原来的 test 文件,还是没有执行,没有挂成功。那就还需要一步设置。2. 修改 Apache 配置文件,使其识别 php 文件。并能通过 php 模块使用,php 进行页面解析#vim/usr/local/apache2/etc/httpd.conf AddTypeapplication/x-httpd-php.php打开 apache 配置文件,告诉 apache,.php 的用 php 去执行就可以了,搜索添加类型 addtyp, 打开 apache 配置文件,找对位置添加一条就可以了, AddType application/x-httpd-php.php 把它粘贴过来,随便找个位置,最好和那几个放在一起,后缀凝视.php 的应用的文件 x-httpd.php 这个类型用 php 用php 解析,也可以用多个,后面是 .phtml 的,也用php 模块解析,现在我们都用统一的 .php 文件,后面文件加不加没有必要。保存一下,apache 配置文件修改完之后必须重启 apache ,然后回到浏览器再刷新一下,页面就把 php 代码解析了,把结果返回来了,这样 apache 就挂摆成功了,通常装 php 一定要做这样一个测试,编写一个 phpinfo ,但文件名叫什么无所谓,用一下这样的函数,就不用命令行执行了,因为数字都在 tml,直接用 php ,现在执行 phpinfo ,都是页面的,格式看着也不舒服,所以还是用浏览器去解析,打开浏览器执行 phpinfo ,这个文件执行后尽量把他删掉,不然其他人也能访问这个文件,知道服务器所有的配置情况了。能看到 php 的版本,使用的系统,构建的时间,配置的命令,配置文件的目录,使用的php 配置文件,特别是下边能看见所有配置的模块,还有所有的驱动,这个是我们检查 php 环境的最主要的文件,只是一个小函数而已。
开发者学堂课程【RocketMQ知识精讲与项目实战(第一阶段):Rocketmq-console集群监控平台搭建】学习笔记,与课程紧密联系,让用户快速学习知识课程地址:https://developer.aliyun.com/learning/course/702/detail/12374Rocketmq-console集群监控平台搭建主要内容:一、Rocketmq-console二、下载并编译打包三、总结 一、Rocketmq-console1.为什么要使用Rocketmq-console上节课介绍了集群管理工具—Mqadmin,使用 Mqadmin 可以借助其一些命令对集群中的一些组件/决策进行管理,很多人都会觉得 Mqadmin 在直接使用时需要记忆一些常用命令比较麻烦,接下来就讲解一个更加直观的平台—Rocketmq-console,Rocketmq-console 以一种 UI 的形式给大家展示集群各个组件运行的状态。2.概述Rockefelle 有一个对其扩展的开源项目 incubation-rocketing-exernals,这个项目中有一个子模块叫 rocketma-consoie,这个便是普理控制台项目了,先将incubator- rocketings ---ketmanist 拉到本地,因为我们需要自己对 rocketing--console 进行编译打包运行。 3.如何使用Rocketmq-console使用 Rocketmq-console 首先需要大家到 GitHub 上去下载它的开源项目,打开这个链接,Rocketmq-console 被托管到了 GitHub 上这是一个开源项目,其实 Rocketmq-console 是 Rocketmq-exernals 项目下的子项目,Rocketmq-exernals 是 Rocketmq 的扩展项目,其中包含了许多的子项目,例如用 Rocketmq如何去集成 DotNet,如何去集成 PHP,如何去集成 kafka,如何去集成rabbitmq,docker 运行环境等等,都是 Rocketmq 一些附属的子项目,有这样的需求可以进行使用,现在使用的 Rocketmq-console 就处在这个地方,大家需要将项目先下载下来,下载的工作已经准备好,在资料安装包当中,解压出来以后,进到 Rocketmq-console 中是一个 Measure 工程,如果想要运行工程需要打一个 jar包,直接运行就可以了。此工程基于 springboot 开发,打一个可执行jar包就可以直接使用它,打包命令是mvn.clean package 去打包,打包的时候可以跳过测试直接打包即可,打包之前需要做一件事,监控平台要去连接 name sever 通过它去查看集群中的运行的一个状态数据,所以我们要在这个项目中去配置 name sever 的一个地址。二、下载并编译打包:1.配置name sever地址Rocketmq-console 项目当中找一下他的配置文件,在 resource 下面,里面有一个springboot 的配置文件叫做 application.properties,打开再此当中查找 name sever 配置的地方,是 rocketmq.config.namesrvAddr=这个位置,在这个位置配置 name sever,由于现在 name sever 是一个集群,分别在135和138上面的都是启动了,所以直接把集群的两个节点配置上去,config. namesrvAddr =192.168.25.135:9876;192.168.25.138:9876配置上去之后就可以打包了,打包的命令为git clone https://github.com/apache/rocketmq-externalscd cd rocketmq-consolemin clean packagyDmaven test, skip-true这个命令很简单,先去 clean 再去打包,然后跳过测试打包,这个执行起来效率比较高一点。进到 pom 文件目录,打开命令行窗口,在这个地方执行打包,打包后会在 target 文件夹中生成 target 文件夹,在文件夹中生成可执行的 jar 文件,把可执行的 jar 文件需要放在两个机器上135/138两个服务器当中,先等待执行完毕正在 copy 资源文件,copy 过来后会进行编译执行一个打包,打包到服务器以后,查看运行效果2.运行效果java-jar rocketmq-console-ng-1.0.0. jar启动成功后,我们就可以通过浏览器访问 http://local host:8080进入控制台界面了,通过8080端口,端口去访问 Rocketmq-console 工程就会看到一个界面如下图:运行起来以后会详细的讲解监控平台应该怎么用,如果不跳过测试打包的时间可能会更长,跳过测试打包相对来讲会快一点,现在已经打包成功。将命令行窗口关掉,进入target,会看到 java-jar rocketmq-console-ng-1.0.0. jar带源码的 jar 文件,直接运行这个就可以,JAR 文件不可以在本机运行,要放到集群环境中放到135或者138节点中都可以,现在先去连接上其中一个节点连接135,通过 fileZilla 把它提交到 usr/soft 文件夹上去,双击上传上去,上传成功后打开命令行窗口,在 soft 用户之下,会看到上传的jar文件3.启动jar文件使用 java-jar rocketmq-console-ng-1.0.0. jar 命令找到 jar 文件,直接点击回车就可以,看一下启动输出的日志,正在启动可以看到 spring boot 启动的 logo 这个项目就是用 spring boot 开发的,在启动时要连接 name sever,刚才已经配置了name sever 的地址,启动的端口号是8080,启动 MVC 工程,这个启动也会花一点时间,启动完毕,告诉我们目前在8080端口启动,访问要首先找到目标机器,通过8080端口访问,点击回车,回车后会看到一个当前的启动页面如果能看到一个这样的界面说明 Rocketmq-console 监控平台已经启动成功,监控平台可以将语言设置为中文环境,就会一目了然看到当前为我们提供了哪些功能菜单,其中有运维、驾驶舱、集群、主题、消费者、生产者、消息、消息轨迹。①运维是报告当前连接的 name sever 两个节点和一个集群。②驾驶舱最常见到的是驾驶舱,在驾驶舱中显示了 broker,现在的 broker 有四个节点分别叫做 broker-a:0、broker-b:0broker-a:1、broker-b:1,其中broker-a:1、broker-b:1是从节点,另外两个是主节点,broker-a:0、broker-b:0已经提前测试了一些发送的数据,可以显示每一个broker 的消费量。还显示了 broker 五分钟趋势,五分钟之内的趋势可以现在查看指定主题在这五分钟发送了多少条消息可以看到历史时间以及消息趋势。还包括主题top10,就是哪些主题现在比较活跃以及五分钟趋势图,这是驾驶舱告诉我们的信息。 ③集群现在有一个名字叫 rocketmq-cluster 的集群,这个名字是搭建集群时配置了 broker 的配置文件,broker 的配置文件四个节点的名字 brokerclustername 叫做 rocketmq-cluster,集群下面有四个 broker 的节点,很清楚的告诉我们当前每一个节点的位置,版本,生产消息 tps 数,今天的消费数,今天的每一个消费数量等等都会清晰的展示出来。④主题主题当中显示了当前集群有几个主题,在这个地方可以新建自己的主题,新建时指定主题和哪一个 broker 绑定,指定主题时如果指定集群名字就不需要去指定具体的某一个 broker,如果指定 broker 就不需要去指定集群,通过这个界面可以去制定一个 topic 主题。除了看一些普通的主题还可以看一下重试的主题包括死信队列等等这些都可以看到。点击系统出现几个与系统相关的主题⑤消费者等一会再去进行消息的生产者和消息的发送者的消息发送和消费的过程就会看到启动的消费者就会在这个地方显示出来,同样生产者也会在相应的位置显示出来,包括消息这个菜单,消息菜单会显示出当前生产者给 broker 发送多少条消息,可以通过时间点去进行条件查询。还可以查看某一条消息,例如可以根据消息的 key 去查询当前 key 上的消息或者根据消息 ID 去查看当前消息的情况,这是消息菜单所提供的功能 ⑥消息轨迹消息轨迹其实显示了消息发送到哪一个 broker,最终是由哪一个消费者去消费了等等就是消息的轨迹信息,可以从这个菜单查询出来。三、总结总体会看到 rockermq 集群监控平台其实提供了刚才所用到的 mqadmin 管理工具当中的一些功能,给予一种更加直观的图形化的界面的方式显示出来,集群的平台在开发过程中经常会用到。以上就将集群的监控平台的搭建基本上就讲解完毕了。总结一下对集群监控平台大家首先要去通过附属的扩展项目把它下载下来,其中包含它的一些子项目,最终找的是 Rocketmq-console,进入到 console 当中要去执行 mvn 的打包命令,打成一个jar包,将jar包扔到集群环境中通过 Java-jar 命令把它启动起来,在进行打包之前一定要去指定 nameserve 的集群地址,然后再启动,启动之后通过8080端口在目标集群上访问它,然后就可以看到一个这样的界面这是集群监控平台的搭建和基本的使用过程,后续再进行上面开发时包括进行案例测试都是去查看集群当中的信息。
开发者学堂课程【阿里云负载均衡 SLB 实战演练:阿里云 SLB 的创建及后端服务器的添加】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/661/detail/11073阿里云 SLB 的创建及后端服务器的添加 内容介绍一、 购买 SLB二、 配置 SLBSLB 的创建:点击左上角菜单,产品与服务,搜索框搜索 SLB,SLB 是负载均衡器,有很多种类。阿里云的 SLB 是 LVS 的一种应用,nginx、haproxy 都是实现负载均衡器的一些方式。如果使用四层代理的话,阿里云建议的是使用 LVS。反向代理服务器和负载均衡服务器的效果一样吗:反向代理服务器是负载均衡服务器的另外一种应用。比如涉及到七层代理的时候会遇到这种方式,如果服务器量比较大的情况下,建议使用四层负载的形式;如果服务器量比较小的情况下,而且应用比较特殊的情况下可以采用七层代理的应用。总体来说是差不多的,但是各有各的优缺点。 一、 购买 SLB1. 基础配置点击负载均衡器,创建负载均衡器。选择按量付费,地域与之前相同。可用区域类型选多可用区,可用区域类型是指负载均衡器如果只是一个单实例的的负载均衡器,它如果单区域出现问题之后,可能会导致服务器不可用。比如有两个可用区,一个出现问题还可以使用另一个。主可用区也与之前一样,备可用区选一个其他的,实例名称自己命名。2. 网络与实例类型实例规格选择后会有参考说明。规格越大,能够支持的最大连接数量越多。所以规格的选取主要考虑用户的访问量和远程连接数量的多少。本次实验要给互联网当中的服务器提供 SLB 功能,所以实例类型选择公网。计费方式两种都可以。如果选择按带宽计算的话,要选择带宽值。购买数量填1。3. 检查完配置之后,点击购买。4. 确认订单,勾选协议,购买成功。5. 点击控制台,下图显示已经购买完成了。 二、 配置 SLB点击开始配置,共四步:协议&监听、后端服务器、健康检查、配置审核。1. 协议&监听选择负载均衡器的协议就是提供负载均衡器的工作方法。一般选择 TCP 和 UDP 的话选择的是四层负载,使用的技术是 LVS;选择 HTTP 和 HTTPS 的话选择的是七层负载,选择的技术是阿里云的 nginx 服务器。这里选择TCP,端口填80。前面已经购买了两台服务器,添加了两个页面 web1和 web2,需要将其添加到负载均衡器的小组当中去,故此时需要添加后端服务器。监听协议是指:假设有一个互联网用户,想访问负载均衡器,通过负载均衡器来访问两个服务器的网站内容,此时需要给负载均衡器启动一个端口tcp 80,也就是说,互联网用户访问这个端口就可以访问两个服务器的页面了。高级配置中提到负载均衡器如何把用户的访问提交给两台服务器,工作方法有三种,即调度方法。a) 轮询是指假如有两台服务器,第一用户访问第一台服务器,第二个用户访问第二台服务器,第三个用户访问第一台服务器,第四个用户访问第二台服务器。b) 有的服务器实力比较强一点,CPU 数量多一点,内存大一点,处理能力强一点,所以希望这一类服务器可以多干一点活,故使用加权轮询,加权轮询可以告诉服务器,这个服务器比较强一点,所以可以多几个用户来访问。c) 最小连接数是指假如有两台服务器,第一台服务器已经有用户访问了,但是第二台服务器还没有用户访问,这时如果有用户访问,那么负载均衡器就会把用户的请求发给第二台服务器,因为第二个服务器还没有用户访问;如果现在第一台服务器已经有三个用户访问了,但是第二台只有两个用户访问,如果这个时候再有一个用户,那么这个用户的请求会被发给第二台服务器,因为第二台服务器用户的数量小于第一台服务器的用户数量。d) 同样的有的时候有些服务器的能力可能会强一点,这个时候也可e) 以采用加权的方式,即加权最小连接数。(1) 会话保持是指,当用户来访问服务器时,比如第一次访问的是第一台服务器,第二次访问的是第二台服务器,这对于某些需要会话保持的业务来说是不利的,希望用户第一次访问第一台服务器,第二次还可以访问到第一台服务器,第三次依旧可以,这时就需要开启会话保持功能。(2) 开启访问控制就是控制哪些用户可以访问,哪些用户不可以访问。(3) 开启监听带宽限速可以限制带宽。(4) 连接超时时间和监听名称都可以自己设置,甚至可以允许后端服务器获取客户端真实 ID。2. 后端服务器(1) 添加后端服务器的方式有三种:虚拟服务器组、默认服务器组、主备服务器组。虚拟服务器组是指,把刚刚的两个 ECS 服务器添加到一个组里,通过这个组让这两台服务器与 SLB 发生关系,这样的话,SLB 就可以通过虚拟服务器组来访问这两台服务器。要创建虚拟服务器组,名称自定,添加服务器,能看到之前购买的服务器,两台都要添加。(2) 点击下一步,配置权重值和端口号,都是80端口,权重值默认100,也可以修改,范围是0-100。3. 健康检查如果使用七层负载就可以使用健康检查,后端有两台服务器,如果有一台出现了问题,那么这台服务器就会自动地从后端服务器中被剔除,以便于用户访问的所有服务器都是争取的。如果服务器出现了问题还在负载均衡器的后端当中,用户使用的时候就会时好时坏,用户体验很糟糕。4. 配置审核检查没问题之后,点击提交,点击确定。5. 配置完成6. 检验打开浏览器,输入 IP 地址,回车,访问 web1,刷新一下,访问 web2,这样可以使后端服务器的压力变小。1) 三个端口是不冲突的,如下图:tcp80端口是供互联网用户访问的,服务器中的80端口是互联网中的端口,而且是不同的,所以不冲突。2) 如果访问一直显示 web2,不能够说明权重不一样,也有可能是网络问题没刷新过来,也可能是缓存问题。3) 物理机能完成的东西虚拟机也可以完成,而且即使不使用虚拟机,使用服务器一样可以完成,不需要太关注这二者的区别。而且在未来,会有软件定义网络、软件定义计算资源、软件定义存储,所有东西都是软件定义的。4) 两台云服务器三个网站怎么处理:一般不建议一台服务器运行多个网站,如果这样的话,网站的访问量会很小;如果真的需要一台服务器建立多个网站的话,可以通过配置虚拟主机主机的方式完成。5) 按量付费的方式需要删除一些主机和一些服务,在删除的过程中要注意如何删除,注意删除顺序,先删除 SLB,再删除 ESC、,再删除安全组,最后删除专有网络。如果不按顺序删除,会出现卡壳的情况。6) 负载均衡器在当前架构当中是流量分发的角色,也就是流量分发大管家,本身不承担业务流量,承担的是用户访问流量,只是把用户接待进来。比如去饭店吃饭,前台只负责接待,但做饭是后厨的事。7) 负载均衡器可以做四层也可以做七层。如果是 TCP 或者 UDP 协议,使用的是四层的调度;如果使用的是 http 或者 https 的话,使用的就是七层调度方式。
开发者学堂课程【RocketMQ知识精讲与项目实战(第一阶段):Mqadmin命令介绍】学习笔记,与课程紧密联系,让用户快速学习知识课程地址:https://developer.aliyun.com/learning/course/702/detail/12373Mqadmin命令介绍内容介绍:一、使用方式二、命令介绍三、注意事项 一、使用方式进入 RocketMQ 安装位置,在 bin 目录下执行./mqadmin {command} {args} 二、命令介绍(1)Topic相关Topic 可以简单理解为消息的类别(作为了解)在发送消息的时候,要先创建消息的类别,并且指定哪个 Broker 负责当前这一类消息。Update Topic 也就是创建更新 Topic 配置,包括-b 表示 Broker地址,表示 topic 所在 Broker,只支持单台 Broker,地址为 ip:port;-c表示 cluster 名称,表示 topic 所在集群(集群可通过clusterList查询);-h-表示打印帮助;Delete Topic 删除 TopictopicList 查看 Topic 列表信息topicRoute 查看 Topic 路由信息topicStatus 查看 Topic 消息列队 offsettopicClusterList 查看 Topic 所在集群列表(2)集群相关clusterList 查看集群信息,集群、BrokerName、Brokerld、TPS 等信息。-m 表示打印更多信息(增加打印出如下信息#InTotalYest,#OutTotalYest,#InTotalToday,#OutTotalToday)clusterRT 发送消息检测集群各 BrokerRT。消息发往${BrokerName} Topic。 (3)消息相关可以通过 id 查看消息,可以通过关键字 key 查看消息,或者通过偏移量查看消息。(4)消费者、消费组相关和消费者、消费组相关的,也就是和 consumer 相关的几个命令也有很多,图表中有具体的说明(5)连接相关和连接相关的,查看当前 consumer 的网络连接和 producer 的网络连接的信息。(6)NameServer相关包括更新 NameServer 的 kv 配置,目前还未使用,删除 NameServer 的 kv 配置,获取 NameServer 配置(7)其他最后一个其他方面,开启监控进程,监控信息误删、重试对列消息数等等。三、注意事项(1)几乎所有命令都需要配置-n 表示 NameServer 地址,格式为 ip:port(2)几乎所有命令都可以通过-h 获取帮助(3)如果既有 Broker 地址(-b)配置项又有 clusterName (-c)配置项,则优先以Broker 地址执行命令;如果不配置 Broker地址,则对集群中所有主机执行命令
开发者学堂课程【微服务+全栈在线教育实战项目演练(SpringCloud Alibaba+SpringBoot):课程列表前端(1)】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/667/detail/11474课程列表前端(1) 内容介绍:一、在 api 创建 js 文件,引入接口地址二、在页面中进行调用三、在分类中进行遍历四、对课程进行 v-if 判断一、在 api 创建 js 文件,引入接口地址1、查询课程列表的方法第一步操作,在 API 里面创建一个JS文件,引入接口地址,进入 API,在 API 中,创建课程,修改名字为 cos。点击 JS,进行复制,复制之后修改一下方法,第一个方法为条件查询再分页,更换一下课程名字为 get。 而在方法中,按照写过的接口,有三个参数,第一个参数是当前页,第二个为每月记录数,第三个是对象,所以有三个参数需要传递,然后写三个当前页每页技术和查询对象。SearchObj 为查询对象的三个条件,接下来写一下接口地址,“/eduservice/coursefront”,详情请看代码。@RestController@RequestMapping("/eduservice/coursefront”)@CrossOriginpublic class CourseFrontController {@Autowired Private EduCourseService courseService://1 条件查询带分页查询课程@PostMapping(“getFrontCourseList/{page}/{limit}")public R getFrontCourseList (@PathVariable long page, @PathVariable long page@RequestBody(required = false) CourseFrontVo courseFrontVo) {Page<EduCourse> pageCourse = new Page<>(page,limit) ;Map<String.Object> map = CourseService.getCourseFontList(pageCourse,courseFrontVo) ;//返回分页所有数据 return. R. ok().data(map);}2、查询所有分类的方法//添加课程分类//获取上传过来文件,把文件内容读取出来@PostMapping("addSubject”)public R addSubject (MultiprtFile file) {//上传过来excel文件subjectService.saveSubject(file, subjectservice) ;return R.ok() ;}//课程分类列表(树形)@GetMapping("gerAllSubject”)public R getAlISubject() {//list集合泛型是一级分类List<OneSubject> list = SUBJECTSERVICEGetALLONEIWOSUBJECT ();return R.ok().data(”list”,list);getCourselist(page, limit , search0bj) {returnrequest({url: /eduservice/coursefront/ getFrontCourseList/${page}/${limit} ,method:'post',data:search0bj})}import request from ‘@/utils/request’ export default { //条件分页课程查询的方法getCourseList(page, limit, searchObj) return request({url: /eduservice/coursefront/getFrontCourseList/${page}/${limit} ,method: ‘post’,data: searchObj} )//讲师详情的方法getTeacherInfo(id) { return request( {url: ‘/eduservice/teacherfront/getTeacherFrontInfo/${id}’,method: ‘get’ } ) 二、在页面中进行调用课程列表页面,在 course 里面有一个 index 目录,就是课程列表。先引入 course第一个 page 代表当前页,然后第二个 data 这个值,就是课程列表的数值,写数字、写对象都可以,第三个是一级分类列表,还有一个二级分类,下面这部分代表二级分类里边有这个,这个是一级分类的集合,还有二级分类集合,下面还有一个叫 SearchObj 是查询条件的表单对象。点击外语考试,下面显示二级分类,点价格最新(包括关注度等值),每次点击这个值都有颜色的变化。比如这个外语考试变成红色,点价格,它的背景色变成绿色,把直线放置,条件查询,选中效果值,红色变成绿色。初始值就可以定出。接下来写方法,首先用密布结构来写。import courseApi from ‘@/api/course'exportdefault{data({return{page:1,//当前页data:{},//课程列表subjectNestedList:[ ], // 一级分类列表subSubjectList: [ ], //二级分类列表searchobj:{}, //查询表单对象oneIndex:-1, twoIndex:-1,buyCountSort:"",gmtCreateSort:"",priceSort:""}},created() {//课程第一次查询this.initCourseFirst( )//一级分类显示this.initSubject( )},methods:{//1 查询第一页数据initCourseFirst(){courseApi.getCourselist(1,8,this.search0bj).then(response => {this.data=response.data.data } )},//2 查询所有一级分类initSubject(){courseApi.getAllSubject().then(response=>{this. subjectNestedList = response.data.data.list})},//3分页切换的方法gotoPage(page) {courseApi.getCourseList(page,8,this.search0bj).then( response => {this.data=response.data.data })}};</script> 三、在分类中进行遍历在页面位置中,首先找到“课程类别”—显示所有的一级分类,下面的位置会显示课程数据。<li v-for="(item, index)in subjec tNestedL ist" : key="index"><a title="数据库" href="#">{{item.title}}</a></li><ulclass-"clearfix"><liv-for="(item, index) in subSubjectlist" :key=" index"><a title="职称英语" href="#">{{item.title}}</a></li><!-- /无数据提示结束--><article v-if="data. total>0" class="comm-course- list"><ulclass="of"id="bna"><liv-for-"itemindata.items":key="item.id"><divclass="cc-l-wrap"><sectionclass="course-img"><img :src="item.cover" class=" img- responsive" :alt=" item. title"><divclass="cc-mask"><а hrеf="/соurѕе/1" tіtlе="开始学习" сlаѕѕ="соmm-btn с-btn-1">开始学习</а></div>section><h3class="hLh30txt0fmt10"><a href=" /course/1" :title="item. title" class="course-title fsize18 c-333">{{item.title}}</a></h3> 四、对课程进行 v-if 判断<!-- /无数据提示开始--><section class="no- data- wrap" v- if="data. total==0" ><em class="icon30 no- data- ico"> </em><span class="c-666 fsize14 ml10 vam">没有相关数据,小编正在努力整理中...</ span></section><!-- /无数据提示结束-->karticlev- if="data. total>0" class="comm-course-list"><ul class="of" id="bna">
开发者学堂课程【SpringBoot 快速掌握 - 高级应用:RabbitTemplate 发送接受消息& amp 序列化机制】学习笔记,与课程紧密联系,让用户快速学习知识 课程地址:https://developer.aliyun.com/learning/course/613/detail/9302RabbitTemplate 发送接受消息& amp 序列化机制内容介绍:一、创建项目二、配置相关信息三、发送单播消息四、发送广播消息五、接收消息一、创建项目使用 Spring Initializer(Spring 初始化向导),创建包名为 com.atguigu,工程名为springboot-02-amqp 的项目,表示用来测试 amqp。下一步为工程设定参数,选择1.5.12版本,在 Integration (整合)模块里勾选上 RabbitMQ,因此此时我们所需为 RabbitMQ,其他时刻也可以选择Kafka、JMK (ActiveMQ)JMS、JMS(Artemis) 等等。为了测试方便,也可以引入 web 模块,点击 next,然后点击 finish,完成工程的创建。打开观察它的 pom 文件,引入了 spring-boot-starter-amqp 模块。二、配置相关信息查看其 pom 文件,引入了 spring-boot-starter-amqp 模块,点击进入后发现它引入了 spring-message、spring-rabbit 操作模块。spring boot 在一定场景下可完成自动配置。RabbitMQ 相关类中的 RabbitAutoConfiguration 是 rabbitMQ 的自动配置类,自动配置了连接工厂ConnectionFactory 。从这里可以获取 rabbitMQ 的连接,而连接信息比如主机地址、用户名、密码以及vhost等均是在 config 中得到的。config 是 rabbitProperties 和 spring.rabbitmq 的配置绑定, RabbitProperties 封装了 RabbitMQ 的所有配置。找到配置文件,输入 spring rabbitmq 的相关配置,包括:rabbitmq 的主机地址118.24.44.169(若不写默认为 localhost)、rabbitmq 的用户名 guest、rabbitmq 的密码 guest 以及 rabbitmq 的端口,默认不写即5672,vhost 的属性可以指定也可以不指定。三、发送单播消息自动配置除了给我们连接了工厂,还会在容器中加一个 RabbitTemplate 和AmqpAdmin:RabbitMQ (系统管理功能组件)。RabbitTemplate 用来给 rabbitMQ 发送和接收消息,AmqpAdmin:RabbitMQ 可以创建队列和交换器等。在测试类里 RabbitTemplate 自动注入,尝试给消息队列里边发送一些内容。发送单播消息的过程:将一个消息发布到一个队列,可以使用两个方法,第一种是用 send(String exchange String routingKey, Message message),好处是可以自己构造一个 message,可以定制消息体内容和消息头;第二种是一种更为常见的方式 convertAndSend(String exchange,String routingKey,0bject object),object 默认当成消息体,只需要传入要发送的对象,自动序列化发送给 rabbitmq。对象被默认序列化以后发送出去核心代码:@Testpublic void contextLoads() {//Message 需要自己构造一个;定义消息体内容和消息头//rabbitTemplate.send(exchage , routeKey,message);//object 默认当成消息体,只需要传入要发送的对象,自动序列化发送给 rabbitmq;//rabbitTemplate.convertAndSend(exchage, routeKey,object);Map map = new HashMap<>();map.put( "msg","这是第一个消息");map.put( "data",Arrays.aslist("he1loworld" ,123,true));/对象被默认序列化以后发送出去rabbitTemplate.convertAndSend( exchange: "exchange.direct", routingKey: "atguigu.news " , new Book)将数据转换成 json 形式发送消息转换器默认使用的是 Simple MessageConvert,序列化数据的时候是按照JDK的序列化规则进行的,我们可以换为自己的配置,命名为 config.MyAMQPConfig,添加注解 @Configuration,放入MessageConvert,添加 return new Jackson2JsonMessageconverter()}核心代码:@Testpublic void receive(){0bject o = rabbitTemplate.receiveAndConvert( queueName: "atguigu.news");System.out.println(o.getClass());System.out.println(o);}四、发送广播消息发送广播消息的过程不管是单播还是广播,只需要发送给对应的交换器就可以。发送广播消息的核心代码:public void sendMsg(){rabbitTemplate.convertAndSend(exchange:"exchange .fanout" routingKey:"", new Book( bookName; "三国演义",author: "罗贯中"))五、接收消息接收消息的过程:输入以下代码,将消息传递后浏览器中的对应位置会接收消息。当消息传出后,刷新浏览器,会发现,消息已传入对应位置。接收消息的核心代码:@Testpublie void receive(){0bject o = rabbitTemplate.receiveAndConvert( queueName:"atguigu .news");System.out.println(o-getClass(;System.out.println(o);
开发者学堂课程【SpringBoot 快速掌握 - 高级应用:Docker 安装 Zookeeper】学习笔记,与课程紧密联系,让用户快速学习知识课程地址:https://developer.aliyun.com/learning/course/613/detail/9317Docker 安装 Zookeeper连上 Linux 虚拟机来安装一下 super 来,首先来检查一下刀客 images 使用 docker的方式。没有 super 相关的径向,就去 docker hub 里边来搜索一下 Zoo Keeper,进来搜索Zookeeper,后来安装官方镜像,这儿有很多版本,3411,是默认最新的,来安装它,来使用 docker pul 命令,把它下载来,开始使用。下面来安装它,来使用 docker 付给,把它下载下来,还是使用这个镜像加速,来到doctor 中国,拿到镜像加速的链接地址,复制,来把 zookeeper 装上回车,等待它进行下载。下载完之后用 docker images ,先来 clear docker images 检查一下发现已经有了 zookeeper 镜像来进行运行,运行参照 zookeeper 官方说明来往下翻,只需要用 docker-run -- name some - zookeeper -- restart always -d 后台运行 zookeeper。这个镜像已经暴露了做 Zookeeper 的2181,2888和3888的这三个端口,分别是客户端的交互端口,还有这些 follow 的端口和选举的这些端口,那就来用这个命令来运行,复制过来后来粘贴,然后--name 我们自己来指定一个名字,比如叫 ZK01,但是来加上-P ,把它的这些端口暴露出来,来镜像里边有2181来。客户端进行交互,既不做集群,也不做选举,就直接只暴露这个2181就行,虚拟机的2181映射到我们 docker 容器的2181--restar ,然后,这个-d 后台运行把我们这个zookeeper 的镜像 ID 来复制来粘贴回车,用 docker ps 命令来检查,zookeeper 在2181端口儿已经运行了接下来就将它作为注册中心的创建服务提供者和服务消费者使用 dubbo,整合起来。
开发者学堂课程【云原生实践公开课:服务网格下的东西向与南北向流量管理实践】学习笔记,与课程紧密联系,让用户快速学习知识课程地址:https://developer.aliyun.com/learning/course/698/detail/12278服务网格下的东西向与南北向流量管理实践内容介绍:一、为什么使用服务网格技术二、什么是阿里云服务网格ASM三、托管的服务网格ASM产品架构四、托管模式下的优势五、东西向与南北向流量管理六、lstio入口网关的工作原理七、Demo:定义东西向与南北向流量管理八、用户在使用ASM时常见的问题一、为什么使用服务网格技术1."Dev/Ops/SRE团队将以统一的、声明的方式解决应用服务管理问题”(1)控制平面层:托管控制面组件(2)数据平面层:网格代理(3)业务应用层:应用服务实例随着功能增强,版本也会发生变化随着版本变化,应用也要随之更新由此可见,随着应用规模的增长,服务数量的不断增加,针对服务实现服务治理能力,依靠代码库这种方式会非常复杂。通过对服务治理能力的统一化、抽象化,变成一个独立的组件,就可以更好地支持更好地编程语言以及框架。帮助开发人员更加关注到业务本身,不需要过多的关注服务治理组件上。通过数据平面,可以更加详细的去观测网格数据化平面,通过控制平面去更好地管理操纵网格的行为。二、什么是阿里云服务网格ASM阿里云服务网格(Alibaba Cloud Service Mesh,简称ASM)提供了一个全托管式的服务网格平台兼容于社区lstio开源服务网格用于简化服务的治理,包括:服务调用之间的流量路由与拆分管理服务间通信的认证安全网格可观测性能力目标:尽可能地减轻开发与运维的工作负担,提升应用服务管理的能力三、托管的服务网格ASM产品架构保持兼容性,运行在阿里云上1.控制平台:声明式API/kubectl(兼容lstio): 核心组件托管、精细化流量管理、零信任安全、生命周期管理、网格诊断、混合部署。扩展与集成:链路追踪、云企业网、OPA、WASM扩展、Prometheus监控、SPIFFE/SPIRE、日志服务、GitOps2.数据平台:阿里云VPC、其他公有云或IDCASM作为业内首个一个全托管式的服务网格平台,这个控制平面的组件时运行在阿里云的资源上。通过托管的模式,可以很好的去兼容控制面的组件,架构非常灵活,也提升了结构的可观测性。很好的支持了数据面不同版本的 K8s的集群。在扩展与集成方面,ASM也整合了阿里云服务的很多能力,包括可观测性服务能力,这里涉及到了链路追踪、日志服务、云企业网等等,能支持跨地域等问题。在数据平面,在ASM也支持多种不同的集群设施,包括托管的和无服务器的k8s。四、托管模式下的优势1、托管的服务网格控制平面实例高可用、免运维、内建安全最佳实践;开发人员可以更专注于业务应用而非基础设施运维。2、增强的数据平面能力优化整合阿里云中间件云产品,提供托管的链路追踪、监控、告警、日志等可观测能力。基于WebAssembly实现统一的代理可扩展能力。3、跨集群跨区域的统一流量管理一个网格实例可管理不同环境下的多个集群,结合阿里云云企业网等,轻松实现跨地域混合云应用流量统一管理。4、支持多种基础设施的应用支持容器应用和虚拟机应用间的流量管理,适合容器化上云的平滑迁移场景。服务网格控制面组件与数据面K8s集群的生命周期管理解耦,以支持各自的升级维护、更多版本的兼容五、东西向与南北向流量管理在老的单体应用架构中,我们几乎只处理南北流量,但是对于微服务,我们必须越来越多地处理数据中心内部的流量。对于单体应用来说,不同的组件之间通过调用应用内部的方法来通信。边缘网关(Edge gateways)抽象了常见的流量协调功能,例如身份验证,日志记录和限流,但是在单体应用范围内进行的通信不需要这些活动。在服务网格中,所谓的东西向流量管理就是指在数据面,集群内服务与服务之间流量的管理。与之相对应,南北向流量就是指集群外部的客户端连接到集群内的服务,或者通过集群内的服务去访问集群外的服务。1.公共网络:公共IngressGateway、Proxy(sidcar)、Proxy(sidecar)直接通过sidecar访问外部服务2.私有网络:私有IngressGateway、Service A、Service B通过Egress Gateway将lstio 功能(例如监控和路由规则)应用于Egress流量。 Istio 网关的负载均衡作用:典型的服务网格具有一个或多个负载均衡器,也称为网关(Gateway),它们从外部网络终止 TLS 并允许流量进入网格。然后,流量通过边车网关(Sidecar gateway)流经内部服务。应用程序使用外部服务的场景也很常见,可以直接调用外部服务,或者在某些部署中强制通过专用出口网关(Egress Gateway)离开网格的所有流量。Istio 具有入口网关的概念,它扮演网络入口点的角色,负责保护和控制来自集群外部的流量对集群的访问。六、lstio入口网关的工作原理传统上,Kubernetes 使用 Ingress 控制器来处理从外部进入集群的流量。使用 Istio 时,情况不再如此。Istio 网关用新的 Gateway 资源和 VirtualServices 资源来控制入口流量,它们协同工作以将流量路由到网格中。在网格内部不需要 Gateways,因为服务可以通过集群本地服务名称相互访问。那么 Istio 网关是怎样工作的?请求如何到达它想要的应用程序?基本步骤如下:1.客户端在特定端口上发出请求;2.负载均衡器在这个端口上进行侦听,并将请求转发到集群中(在相同或新的端口);3.在集群内部,请求被路由到 Istio IngressGateway 服务所侦听的负载均衡器转发过来的端口上;4.Istio IngressGateway 服务将请求(在相同或新的端口)转发到对应的 pod 上;5.在 IngressGateway pod 上会配置 Gateway 资源和 VirtualService 资源定义。Gateway 会配置端口、协议以及相关安全证书。VirtualService 的路由配置信息用于找到正确的服务;6.Istio IngressGateway pod 会根据路由配置信息将请求路由到对应的应用服务上;7.应用服务将请求路由到对应的应用 pod 上。此外,Istio 的网关还扮演负载均衡和虚拟主机路由的角色。如图所示,可以看到默认情况下 Istio 使用 Envoy 代理作为入口代理。 Envoy 是一个功能强大的服务到服务代理,但它也有负载均衡和路由的功能,可代理的流量包括从服务网格外部到其内部运行的服务,或者从集群内部服务到外部服务。在前面章节中介绍的 Envoy 的所有功能也可以在入口网关中使用。 七、Demo:定义东西向与南北向流量管理1、创建ASM实例打开阿里云官网首页,在云计算产品,云计算基础里点击服务网格ASM进入官方首页。2、添加集群到ASM实例3. 点击管理控制台,点击创建新网格,输入实例信息点击添加按钮,可以将集群添加到实例中去,出现所管理的集群,选择与网络处于同一VPC的集群。选中集群后,点确定重要提示:将选定集群加入服务网格后,不允许再使用类似于istlioctl等命令在该集群上安装、lstio组件﹔否则将可能会导致该集群的网格能力不可用。一旦误操作之后。请先从网格中移除该集群,然后再重新添加。4.添加入口网关根据自身需要选择相应的端口5.部署应用到ASM实例操作步骤:(1) 登录容器服务控制台,在左侧导航栏中选择集群>命名空间。(2) 在命名空间页面,从集群下拉列表中选择对应的集群。(3) 在default命名空间的操作列,单击编辑。(4) 在编辑命名空间对话框中,为该命名空间添加标签,单击添加。 (5) 从Github的Istio项目库中下载Bookinfo的YAML文件。(6) 通过kubectl执行以下命令,将Bookinfo应用部署到ASM实例的集群中。kubectl apply -f bookinfo.yaml6.定义lstio资源通过定义Istio资源,可以实现服务网格ASM的流量治理、鉴权以及安全保护等功能。本文介绍如何定义虚拟服务、服务网关、目标规则这三种Istio资源,以实现相应的流量路由策略。前提条件创建至少一个ASM实例,并添加至少一个ACK集群到该实例中。详情请参见创建ASM实例和添加集群到ASM实例。 部署应用到ASM实例的集群中,详情请参见部署应用到ASM实例。 在加入到ASM实例的ACK集群中部署入口网关,详情请参见添加入口网关服务。 步骤一:定义Gateway资源1. 登录ASM控制台。2. 在左侧导航栏,选择服务网格 > 网格管理。3. 在网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理。4. 在网格详情页面左侧导航栏选择流量管理 > 网关规则,然后在右侧页面单击新建。5. 在新建页面中,按以下步骤定义服务网关,然后单击确定。(1)选择相应的命名空间。本文以选择default命名空间为例。 (2)在文本框中,定义服务网关。可参考以下YAML定义,详情请参见Istio官方示例。代码示例:apiVersion: networking.istio.io/v1alpha3kind: Gatewaymetadata:name: bookinfo-gatewayspec:selector:istio: ingressgateway # use istio default controllerservers:- port:number: 80name: httpprotocol: HTTPhosts:- "*"6. 在网关规则页面可以看到新建的bookinfo-gateway网关。 步骤二:定义虚拟服务1. 登录ASM控制台。2. 在左侧导航栏,选择服务网格 > 网格管理。3. 在网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理。4. 在网格详情页面左侧导航栏选择流量管理 > 虚拟服务,然后在右侧页面单击新建。5. 在新建页面,按以下步骤定义虚拟服务,然后单击确定。(1)选择相应的命名空间。本文以选择default命名空间为例。 (2)在文本框中,定义Istio虚拟服务。可参考以下YAML定义,详情请参见Istio官方示例。代码示例:apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:name: bookinfospec:hosts:- "*"gateways:- bookinfo-gatewayhttp:- match:- uri:exact: /productpage- uri:prefix: /static- uri:exact: /login- uri:exact: /logout- uri:prefix: /api/v1/productsroute:- destination:host: productpageport:number: 90807、在虚拟服务页面可以看到新建的bookinfo服务。步骤三:访问入口网关1. 既可以从ASM控制台查看入口网关服务的IP地址,也可以按照如下步骤从容器服务控制台进行查看。(1) 登录容器服务管理控制台。(2) 在控制台左侧导航栏中,单击集群。(3) 在集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的应用管理。(4) 在集群管理页左侧导航栏中,选择网络 > 服务。(5) 在服务页面,在命名空间下拉列表中选择istio-system,查看名为istio-ingressgateway服务所对应的外部端点信息,即是入口网关服务的IP地址。2.在浏览器地址栏输入http://{入口网关服务的IP地址}/productpage,验证路由策略。在虚拟服务中未定义Reviews微服务路由策略的情况下,3个版本之间默认的流量路由策略是轮询。因此持续刷新页面可以依次看到以下3个版本: (1) v1版本不会调用Ratings服务。(2) v2版本会调用Ratings服务,并使用1到5个黑色星形图标来显示评分信息。(3) v3版本会调用Ratings服务,并使用1到5个红色星形图标来显示评分信息。步骤四:定义目标规则通过定义目标规则,可以指定微服务在多个节点间的负载均衡策略。1. 在网格详情页面左侧导航栏选择流量管理 > 目标规则,然后在右侧页面单击新建。2. 在新建页面中,按以下步骤定义目标规则,然后单击确定。(1) 选择相应的命名空间,本文以选择default命名空间为例。 (2) 在文本框中,定义目标规则。可参考以下YAML定义,详情请参见Istio官方示例。示例说明:定义Reviews的三个版本微服务的负载均衡策略分别为,轮询(ROUND ROBIN,未定义时的默认策略)、最少连接数(LEAST_CONN)和随机(RANDOM)。 代码示例:apiVersion:networking.istio.io/v1alpha3kind:DestinationRulemetadata:name:reviewsspec:host:reviewssubsets:-name:v1labels:-name:v2labels:version:v2trafficPolicy:loadBalancer:simple:LEAST_CONN-name:v3labels:version:v3trafficPolicy:loadBalancer:simple:RANDOM3. 在目标规则页面可以看到新建的reviews目标规则。 步骤五:增加新的虚拟服务增加虚拟服务,定义新的流量路由策略,从而实现在微服务的指定版本之间按照不同的权重分发流量。1. 在网格详情页面左侧导航栏选择流量管理 > 虚拟服务,然后在右侧页面单击新建。2. 在新建页面中,按以下步骤定义虚拟服务,然后单击确定。(1) 选择相应的命名空间,本文以选择default命名空间为例。 (2) 在文本框中,定义虚拟服务。可参考以下YAML定义,详情请参见Istio官方示例。示例说明:将Reviews微服务的流量按照50%的权重分别指向v2和v3版本。 apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:name: reviewsspec:hosts:- reviewshttp:- route:- destination:host: reviewssubset: v2weight: 50- destination:host: reviewssubset: v3weight: 504、在虚拟服务页签可以看到新建的reviews虚拟服务。 执行结果在浏览器地址栏输入http://{入口网关服务的IP地址}/productpage,持续刷新,可以看到Bookinfo应用页面在v2和v3之间等权重地轮流切换,显示为黑色星形图标或者红色星形图标。 详情可参考链接如下:https://help.aliyun.com/document detail/149552.html 八、用户在使用ASM时常见的问题1.为何不能在ASM实例中部署应用?ASM控制台提供的Kubeconfig配置是用于连接ASM实例,并通过kubectl进行操作lstio CRD(自定义资源),例如虚拟服务virtualservice等。添加的ACK的操作保持不变,仍然使用ACK控制台提供的配置。2.为何不能在ASM管理的集群中部署lstio的虚拟服务等CRD资源?操作lstio资源是属于控制面,所以连接的Kubeconfig也是控制面提供的配置,使用方式与普通的kubeconfig—样3.网格有自己的连接配置,如果不用这个连接配置,直接使用集群的连接配置是否也可操作istio资源?如果想部署istio这些虚拟服务这些资源,必须到ASM平面。lstio CRD对应的资源只需要在控制平面保存就可以了,控制平面会将对应的规则转换成sidecar里的规则应用起来。
开发者学堂课程【云原生实践公开课:第四步K8s集群的弹性伸缩问题】学习笔记,与课程紧密联系,让用户快速学习知识课程地址:https://developer.aliyun.com/learning/course/698/detail/12269第四步K8s集群的弹性伸缩问题内容介绍:一、 弹性伸缩概述二、 调度层弹性伸缩三、 资源层弹性伸缩四、 典型场景介绍一、弹性伸缩概述1. 弹性伸缩的本质–容量与成本的博弈此图为容量和成本之间的一个关系,绿色线表示的是一个K8集群里边所提供的这个容量的一个曲线,有时,会进行扩容,有时,可能会进行缩容,红色线,是表示实际的、真实的集群里面所需要的这个容量是多少。有三个虚线画的这个图第一个包表示的就是真实的资源的使用量,其实已经超过实际集群所能够提供的容量,那么此时表示的意思就是容量不足,资源不足,那这个时候实际上是需要伸缩。第二个包,表示真实的这个使用量远远低于集群所需要的这个容量,叫做资源浪费,那此时需要进行就是缩容。第三个包,可以看到绿色线是一直大大超过这个红色的这个线儿,在非常短的一个时间之内,这个红色线突破绿线,然后有一个比较尖的一个尖锋,通常是一个激增的峰值容量,这个场景,就是所谓的这个峰值流量的这个到来,然后可能需要去做弹性伸缩。这个部分其实是大部分开发者理解,弹性伸缩最适用的一个场景。2. 弹性伸缩的本质是一场容量和成本的博弈,对于不同角色的人员,有着不同的意义:开发人员希望通过弹性伸缩使应用获得高可用的保障运维人员希望通过弹性伸缩降低基础设施的管理成本架构师希望通过弹性伸缩得到灵活弹性的架构应对突发的激增峰值。弹性伸缩有很多不同的组件和方案,选择适合自己业务场景的弹性方案,是建设可伸缩架构的核心因素开发人员在上线应用的时候,首先要做的是做容量规划,比如说有一个应用是一个电话本,或者在传统架构里面就是一个多副本的一个应用。那在传统架构上,可能会申请两台四核8G的ECS,把应用部署上去,在容器的场景之下,可能会生成一个两个raid卡的department。然后,分布在一个比较大的一个K8S集群之内,实现这个英文的部署。当遇到这样两个峰值的时候,那实际上的应用是需要去做扩容的。传统场景之下的开发人员,通过监控发现超过一定的这个资源使用量的时候,会进行手动的扩容,然后,当低于这个资源使用量的时候,可能会去进行手动的缩容或弹性伸缩帮助开发者解决这个问题,就是说这个手动的这个过程可以直接避免掉的,只需要配置一个HPAA policy,或者是其的这个弹性的一个策略, 就可以实现自动的这个弹性伸缩,做到无人值守的这个高科技架构的一个保障,这个是对于开发人员的一个比较大的一个优势。第二个是对于运维人员,因为知道开发人员选择去扩缩容一个应用的时候,要申请对应的这个机器,或者是要扩容对应的这个k8S集群,而在缩容的时候需要通过人工的方式去把这个节点缩回来,都是运维人员手动帮助开发人员来去实现的,之后,其实这一部分,就可以直接通过自动化的方式来解决了,可以降低整个基础设施的这个管理成本。对于整个项目的这个核心人物架构师而言的,弹性伸缩带来的是更多的在架构上的一些可能性,比如说可以通过可伸缩性架构的一些原理,去使用一些中间件,去架构更flexible的一个应用程序,这个是对于架构师的这个核心价值。3. 弹性伸缩的架构–调度与资源解耦的两层架构Kubernetes 的弹性伸缩架构分为调度层和资源层两个维度∶调度层弹性与资源层弹性。调度层弹性和资源层弹性通过 Pod 进行解耦。Kubernetes 弹性伸缩组件可以从伸缩方向和伸缩对象两个维度进行解读,其中HPAA 与 cluster-autoscaler 是开发者最常组合使用的弹性伸缩组件。HPAA 负责容器的水平伸缩,cluster-autoscaler 负责节点的水平伸缩。和传统弹性伸缩相比,在容器之下的弹性伸缩会略有不同。那传统概念上,通常会把这个资源和调度是融在一起来讲的,例如:一个集群水位超过多少的时候,调出一个node就可以了,然后,集群的水位低于多少的时候,缩容一个node就可以了。表面上看上去是没有错误,但在容器场景之下,真正的这个负载,实际上是pod,pod的总量不变的时候,不论是弹出多少个node,都是没有办法降低整个集群的负载状况的,这个是核心的一个问题。所以在容器的场景之下,核心要解决的是两个问题,一个是在段落层开头怎么做,核心就是怎么生出更多的pod,或者说怎么能够让pod的request和limit能够做到一个变化,这个是调研层的探索。资源整合探索的是许多pod会对应申请很多的request,里面的电路水位超过一定阈值了之后,需要在底层的这个资源层能够给一个更好的一个保障。这是在K8S场景之下弹性伸缩和传统场景之下的弹性伸缩是最大的一个差别,是一个两层结偶的一个架构,然后不同的层面可以有不同的这个软件来去实现对应的能力,那比如说这是社区里边典型的一个架构上层的,调度层面来说,主要是由HPA来组成的。对HPA的解析,知道可以通过metrics-server拿一些对应的监控指标,或者说可以走三条标准的链路来进行弹性伸缩,获取到对应的接口指标,然后判断说当前这个整个的pod利润比较高的时候,会扩容这方面的里边的副本。此时,核心价值是说把整个汲取的这个调度水位冲高了,当这个pop出现了这个无法调的这个状态,那会触发底层弹性,比如cluster-autoscaler节点水平伸缩组件,实际上是看pod什么时候出现无法调度,再根据这个pod状态来去模拟底层的伸缩组,到底从哪个深度里面弹出对应的这个节点,然后去生成这个新的开发思路,再去把这个pod调到对应的这个node上来去承载对应的应用的这个容量,或者是用的上层的流量来实现这个真实的整个负载的一个降低,那通过这种方式,K8s实现自己的这个弹性伸缩。二、调度层弹性伸缩1. 调度层弹性–容器水平伸缩( HPAA)容器水平伸缩(HPAA)依托于 metrics server、prometheus、external metrics adapter,通过metrics提供上层HPA弹性伸缩的判断,再去调用不同负载的scaier 接口,来实现上层建筑Deployment业务的伸缩。metrics 是一个监控数据的一个标准,标准化的一个获取方式。scaler也是上层的一个 K8S 的标准接口。这张图是弹性伸缩的一个核心的计算公式。会从监控监控的软件里面,或者是监控的接口里面,来获取每个 pod上的这个资源的这个使用量,然后再除以对应的这个阈值,来判断对应所需要的量,这个就是简单的HPA的一个核心的一个公式。2. 容器水平伸缩(HPAA)是Kubernetes中最常用的弹性伸缩方式,使用时需要重点注意如下三个问题:Request的合理设置:首先是request要做合理的设置一定要注意usage, usage并不是真实的使用量,而是真实的使用量除以request的比值,是usage,这就是为什么Request需要的合理设置。弹性指标的合理选择:HPA 的场景之下可以有三种不同的这个监控指标来去做伸缩判断判断,而且 HPA,在V2beta2 或者是 V2beta1的这个版本里面,支持多个审核指标同时生效。核心保障的内容是总的业务的稳定性。业务状态的弹性支持:发生 HPA 的时候,可能会出现一些业务的这个数据丢失,或者说出现一些业务的 pod超时,这些问题核心就是应用价格可能和HPA之间还没有那么匹配,这时可能会出现的一个原因就是 K8S发起了一个 signalkill。然后把这个信号量传给了对应的 container,一旦 container 接管了这个 signalkill,会直接销毁,如果业务里面补货的 signalkill 的时候,可以做一些退出之前的一个额外的处理,通过这种方式可以解决很多针对于弹性场景之下的一些异常的一些问题。所以,对于用HPA的这个场景,首先要判断这个业务是不是一个完全无状态的,还是说业务里面有一些状态,然后这个状态,就是偏原则性,如果是有这种实现的逻辑的话,尽可能去捕获一下 singlekill,然后来实现一个优雅退出,会更合适。3. 调度层弹性–容器定时水平伸缩(CronHPAA)容器定时水平伸缩( CronHPAA)是容器水平伸缩(HPAA)的一种补充,对于有明显的周期性负载,可以通过容器定时水平伸缩(CronHPAA)的方式提供预弹的能力,减少流量毛刺的冲击。此外容器定时水平伸缩(CronHPAA)可以和容器水平伸缩(HPAA)一起使用,从而进一步提高应用的健壮性。容器定时水平伸缩( CronHPAA),更多的是应对尖峰流量。对于很多业务来讲,更常见的是有周期性的复杂的一个状况。HOA并不一定能够及时的满足上层的一个业务数据,而且很多时候HPA内层无法做到核心的保障,会由于一些资源的生产速度问题,或者是由于底层的这个库存问题,造成Pod无法生产。证券行业,游戏行业有非常明确的这个流量激增的场景,会采用类似像一些定时的策略来去做推测,那针对这个场景,阿里云推出了一个叫做cronHPA的一个组件,可以去提供弹性场景之下的一个定时伸缩的一个策略。想要通过HD来去做峰值流量的保障,又想要通过cronHPA去做到周期性的这个弹性怎么办?cronHPA也同时对HPA做了兼容,可以把一个HPA的对象配置在cronHPA。然后,通过HPA发现底下的应用Deployment,再去做对应的扩充,而此时HPA的一些行为会和cronHPA做完整的一个整合,来实现一个更高可用的一个保障。三、资源层弹性伸缩1. 资源层弹性–节点自动伸缩( Cluster-Autoscaler)资源层弹性伸缩主要有两种,传统的节点自动伸缩( Cluster-Autoscaler)和无服务器弹性伸缩( Virtual-Node)。节点自动伸缩( Cluster-Autoscaler),整体的兼容性是最高的,应用场景也是最丰富的,缺点是弹性速度慢。节点自动伸缩( Cluster-Autoscaler)原理:当有一个作业提交,或者depend出现叛逆的pop时,会到APIserver上。APIserver会先来看当前集群里面转的容量状态,如果资源不足,无法调入状态,那会由Cluster-Autoscaler监听到对应的无法调度的一个事件,然后触发Cluster-Autoscaler弹性调度的一个判断。提供的官方文档会比较清楚的介绍这一部分的逻辑。资源生产:已经判断要生成node,就要弹出对应的ECS。生成ECS里面会涉及到的过程:首先需要有环境的初始化、网络初始化、各种镜像的这个初始化,然后会变成一个K8s node,然后当不需要的时候,进行缩容。如果是完整的创建和删除的模型,可能会导致弹性伸缩速度变慢,所以阿里云也提供叫极速模式的一个伸缩计划。伸缩计划的大致的一个概念,就是第一次的时候生成一个node,然后在移除的时候,就把node停机,此时只收存储的费用,费用是低廉,到后续的时候,有扩容的这个策略,就把这个东西弹出来,然后变成一个运形态的逻辑。相当于把中间的环境初始化的过程都缓存掉了,做到比较快速的一个扩散。2. 资源层弹性–无服务器弹性伸缩( Virtual-Node)虚拟节点(virtual Node)是一种无服务器弹性伸缩的方案,具有弹出速度快、使用简单的特点。结合无服务器自动伸缩组组件virtual-kubelet-autoscaler 与 Kubernetes-Elastic-Workload可以实现在传统Kubernetes集群中自动伸缩Serverless Pod的能力virtual Node:传统的K8S里面一个Node是有容量上限,然后这个Node上面,会有会运行一些pod,当pod的这个调度单元超过了node的时候,就需要弹出新的node或者扩容新的node去承载无法部署的这个pod,然后实现这个新的容量的扩缩容。虚拟node的概念:就是依托于一个抽象的这个概念,一个无限容量的node,只要把对应的pop调到这个虚拟机之上,就会通过轻量级的ECI容器来去承载对应的pop,实现这个无服务器弹性的一个能力。无服务器弹性伸缩( Virtual-Node)具有弹出速度快、使用简单的特点。很多业务有时候需要在ECI上部署pod,又需要在这个借助于Virtual-Node去应对一些突增的一个流量。比如,典型的一些电商的场景之下,进行快速的扩散,容量规划里面可能会有一些资源的优先会用ECS,ECS资源不足了之后,用Virtual-Node来提供一个无线的容量池,提供整体弹性伸缩。针对于这种场景,提供了无服务器架构1.0和2.0策略。3. 无服务器伸缩架构1.0无服务器伸缩架构1.0,当pod的出现资源不足,无法调动的时候,会有一个叫做vk-autoscaler的组件,去监听无法调动的pod,然后直接介入调度的流程,把对应的pod绑定到Virtual-Node上,此时Virtual-Node就能够把这个pod调动起来。绑定好pod之后,就会把对应的业务在区节点上运行起来,因为区节点也是一个pod,区节点上层的比如接入的是一个service或者其,也是当成一个标准的判断的结果,可以无缝的把流量掌握起来。弊端:第一个弊端,全局生效,没有办法定向的开启或者是关闭,就是要想开vk-autoscaler,基本上原始的节点伸缩没办法直接使用。第二个弊端,虽然可以把pod快速扩散,但是在虚拟node的上的pod没有办法优先于ECS回收。第三个弊端,无法与节点弹性伸缩混用。弊端总结:全局生效,无法定向开启或关闭无法优先回收弹性资源无法与节点弹性伸缩混用4. 无服务器伸缩架构2.0无服务器伸缩架构2.0,通过弹性负载去弥补了上面的这三个问题。弹性负载是一个类似像HPA一样的CID,可以被HPA去接管,当HPA接管弹性负载之后,会把原始的应用切割成两个单位,一个叫做原始应用,一个叫做弹性单元。弹性负载会去切割原始应用上的这个副本的数目和弹性单元上面的这个副本数目,去进行优先级的扩缩容。四、典型场景介绍典型场景介绍在线业务存在资源使用率的波峰波谷的场景,可以通过弹性伸缩节省资源。存在突增流量毛刺的场景,可以通过弹性伸缩提高健壮性。典型例子:网站、API服务、机器学习推理、大数据流式处理【Flink】等。离线计算离线业务通常规模会比较大,可以通过弹性伸缩的方式获取海量算力,并且容器化的交付方式可以降低管理成本。典型例子: Spark、机器学习训练、多媒体转码等。定时任务定时任务通常运行频度不高,因次整体的资源需求是在容量规划之外的,可以通过弹性伸缩的方式降低容量管理的复杂度。典型例子:离线定时ETL、数据分析与报表等。特殊场景某些业务对于稳定性有极高的要求,通过配置弹性伸缩的方式来保证更高的稳定性。典型例子:异地多活弹性、混合云弹性等。 通过两个调度层弹性的例子来给回顾一下HPA和CronHPA。HPA和CronHPA比较:CronHPA的yaml,除了apiversion 和kind不太一样,其地方比较类似。job分成两个部分,schedule和targetSize,targetSize是修改CronHPA的数目,schedule里面是一个类似像状态的一个策略,第一个字段是秒,第二个字段是分,第三个是小时,第四是天,下一个是月,下一个是周,然后这是标志CronHPA的一个结构,就是多了一个秒,一个字段,可以达到一个更精确的伸缩的一个策略。例子里面比较简单就是,每一分钟的第一秒,缩容每一分钟的第30秒,去做一个扩容。那在使用CronHPA之前,可以看到,这个地方现在用的是Deployment去做伸缩,没有用刚才提到的HPA去做伸缩。会带来什么问题?输入workshop vim cronhpa .yamlworkshop kubectl apply -f cronhpa . yaml.workshop kubectl get cronhpa.workshop watch -n 1 kubectl describe cronhpa cronhpa-sample.workshop kubectl describe cronhpa cronhpa-sample. 可以看到,此时的时候,上面这个已经任务已经到达succeed ,这个任务是submitted的状态。 message是说当前currentreplicas: 1,desired replicas: 3。如果get Deployment,可以看到,此时这个Deployment这个副本已经从一个副本改成了三个副本,会触发底层的这个pod的增加。可以看到,这三个部分已经都运行起来,可以看到对应的这个状态。这个时候立马又缩回成一个副本,那这个时候,其实是由CronHPA接管了整个HPA的一个状态。那此时,这个业务上面还有一个HPA在运行,输入kubectl describe hpa nginx-deployment-basic-hpa,可以看到,因为这个news3并不是由HPA触发,而是由CronHPA触发,此时的HPA发现有三个副本,资源力度是零,正常来讲,HPA会在缩容阈值到达了之后,去触发整体的这个作用,那此时是冷却的一个状态,如果刚才把定时申诉的策略时间,设置不是在一分钟之内去完成整个收缩的话,那会发现当前的这个HPA的状态,实际上是扩容了之后,立马被缩容。解决这个问题的方法,就是HPA兼容的那个方法,就是可以通过获取一个HPA对象,然后把同样的这个任务再下载一次。可以看到这个时候还是可以执行成功的,只是说在这个策略上面,已经把的这个HPA的这个内容拷进来了,这个地方,有一个明显不同的一个策略,Skip scale replicas because HPA nginx-deployment-basic-hpa current replicas:3 >= desired replicas:1,因为刚才的时候把这个副本数从一个副本扩到三个副本。也就是说HPA当前维持的副本状态是三个部分,那接下来,如果此时触发缩容,希望从三个副本变成一个副本的时候,CronHPA这边是由三个副本变成一个副本,但是HPA那边如果还是维持三个副本的话,可能会出现震荡。建议,发现HPA那边的分数比CronHPA高的时候,那其实就的这个基本全交给HPA。HPA数值比CronHPA低的时候,去接管对应的这个策略,然后并且调整HPA的一个命值,通过这种方式,可以达到一个更稳定的一个弹性。此时的department,即便刚才下发了缩容的任务,但是由于稳定性的原因,department仍旧保持着3,所以保证了当前使用CronHPA可以和HPA进行一个比较好的一个兼容。
开发者学堂课程【天池大赛算法教程及获奖选手答辩: 阿里音乐流行趋势预测—亚军答辩(一)】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/389/detail/4994阿里音乐流行趋势预测—亚军答辩(一)目录:一、 总体思路二、 算法处理三、 曾经的尝试四、 建议 一、 总体思路1.数据预处理2.分类3.预测4.方法选择5.预处理具体解题思路是借鉴的标准的时间序列的分解思想,将我们的日播放量长期趋势,中期,以及随机干扰三项,但是在最终的那个算法当中,只对长期趋势进行预测,算法分为数据预处理,分类,预测,方法选择,预处理五个环节 。以歌手为单位,对数据集进行预处理,依据编码,将所有选手进行编码,将所有的歌手进行分类,分为24个基本的类别,然后针对每一个类别选择是他的最优预测方法。最后为了提高分数,我们也对部分歌手做了附加处理。预处理这里我们使用的是数加平台,在数加平台中执行SQL语句去完成的数据处理的结果,包括从样本集当中提取出的每个歌手的日播放量序列,周播放量均值序列,月播放量均值序列以及日变化率序列。1. 日播放量序列2. 周播放量均值序列3. 月播放量均值序列4. 日变化率序列日变化率序列我们将用于最后的使用。日变化率序列我们将用于选择每个类别的最优预测方法。在此基础上,我们对歌手进行编码,编码包括月编码,周编码,我们进行编码的主要目的是大致判断歌手日周月播放量的一个变化趋势。下面以月编码为例,编码是由基本趋势和增量趋势两部分组成的,基本编码增量趋势,若当月均值高于上月,则对应的那一位为1,否则为零 例如我们可以看到4月份的均值大于三月均值,那另一位对应的就是1,5月均值小于4月均值,对应值为0, 增量趋势其实代表一个变化幅度的大小,它的变化规则是,若月均值高于上月均值,当月均值除以上月均值取整,否则上月均值除以当月均值的结果取整。例如,最后一位为无表示的是8月的均值与七月均值之间相差的是五倍以上。那么这个相差到底是增长了,还是下降了,我们从前面的基本趋势之间可以看到,综合基本趋势和增量趋势两个部分,我们可以知道8月均值是在7月均值基础上呈现一个大幅度的增长。日编码和周编码都可以使用这个方法得到,那么建立编码之后 我们就可以建立分类规则。我们建立分类,首先的是将播放量整体基本相似的歌手归为一类,我们将基本趋势后两个月连续上升的增量趋势最后一个月变化平稳的歌手分为一类,也就是第一类,将增量趋势最后一个月变化幅度较大的歌手分为一类。在最初的时候,我们只分类了八个类别。在比赛过程中,我们对类别进行了不断的验证,序列化,变成了24个基本类别。分好类之后,要把每个类别找到他们的最优预测值方法。我们寻找最优预测值的方法有两种,一种是类别最优值选择法与子序列模式匹配法。1.类别最优值选择法这个比赛要求我们对歌手60天的播放量进行一个预测,很难进行精确的预测,应该尽可能贴近9~10月份日播放量的均值水平。因此 我们选择最后的均值法以及运用百分位数进行预测的方法作为待选方法,组成候选预测方法集合。有了待选方法集合之后,针对每一类别的歌手选择最优预测方法。我们使用3~7月份的数据作为训练集,8月份的数据为测试集,便利待选预测方法集合,用当前选定的待选预测方法,得到8月份的预测值。根据大赛给我们的评判公式,对8月份的预测值进行一个评分,最高时得到的便是我们对每一个歌手得到的最优预选方法。我们使用的最优预测选择方法,就可以计算这一类歌手9-10月份的日播放量。选择最优预测值的另一种方法是,子序列模式匹配法。在第二赛季第二批数据集当中,我们通过对歌手的日编码周编码的增量模式发现,存在40多个歌手出现8月中下旬的日播放量突然成倍增长的情况。
开发者学堂课程【天池大赛算法教程及获奖选手答辩: 阿里音乐流行趋势预测—冠军答辩(一)】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/389/detail/4992阿里音乐流行趋势预测—冠军答辩(一)目录一、 赛题分析二、 规则算法三、 模型算法四、 重要的事情 一、赛题分析1.竞赛题目本次大赛以里音乐用户的历史播放数基期望赛者可以通过对同里音乐平台上每个阶段艺人的听量挖出即将成为潮流的艺人。从而实现对一个时间段内音乐流行势的准确把控。2.评测方式艺人在第 k 天的实际播放数为T,参赛选手集合为 U,艺人集合为 W,参赛选手的程序计算得到艺人在第 k 天的播放数为 S,则参赛选手对艺人的。的播放预测和实际的方差归一化方程。而艺人在第k天的权重根据艺人的播放量平方根得到。参赛选手的预测为F13.播放量第一种,播放量快速上升。第二种,十分平稳。第三种,指数下降。总体播放量,有三个明显特征。一平稳上升二播放量低于日常三周期性。当用户数目足够多,就会表现出一定的周期性。音乐播放在碎片时间多的播放量大。4. 强调:对于基本概念的把握要清晰,预测问题往往会做很多近似,在近似过程中如果不能很清晰把握系统的输入输出,自变量的因变和函变的话,最后很容易出现混淆,有很多弯路。个人经验,明确写入函数和输入输出。如果准确研究播放量的话,就是网络传播动力学的知识,现在也比较热门,并没有强的结果。根据赛题说,通过历史数据,比如星期假期这些数据,来预测。一般用两个月或四个月数据预测两个月,实际用四个月的数据就可以预测后五个月的数据。预测8-10月的函数是不同的,因为关于时间t的函数,没有办法因为预测换算f3f4,加星号是某一种特例术语。比赛中会涉及到换数据的问题,f5与f4也是不同的,它会涉及到特有的几个艺人的事情。那么最后实际求得是,用f3把数据回归出来,尽可能把 f6求出来,f6 和 f4之间的差要求出来。这个可能看起来比较基本,但是在实际操作中 f3f4 变量会很多,会推出来很多模型,融合后,可能会混淆。那么就变成求 f3f6 两个函数的问题了。求f3就是一个回归问题,有两个方法,一个是专家启动,另一个是机器学习。 二、规则算法认为构造一个非线性函数,并利用数据集求取参数。模型:利用机器学习方法获得回归函数。大胆假设,小心求证:例如,求长假的播放量修正系数或者融合模型系数。f6在比赛中也是很重要的,因为数据挖掘就是获取信息,在比赛中除了给数据的信息,数据测评的分数里面包含非常多的信息。从分数的测评当中,如果有技巧的测评一些答案提交的话,实际可以获得更多的信息,会有非常大的提升。给你的信息是没有长假的,但是预测的信息是有长假的,而且通过总的播放量可以看到,假期的播放量要低,但是具体如何低,呈一个怎样的形式,这个没有办法从数据集里获得信息,只能通过构造测评答案来获取这方面的信息。第二个,虽然前面的播放量是稳步上升的,但你不能保证它的未来走势。像这种,外部扰动带来的影响,不能通过立体数据来获取的。只能通过一些假设进行求证。另外包括后面融合模型的参数,提交参数,查看成绩好坏。这个比赛最关键性问题就是播放量突发性能否预测,前面对这个问题已经论述的非常清楚了,一些外有因素带来的。通过历史数据,是不能精确预测的。另外,如果对数据做了信息分析,很快得出不能预测的结论。所以它也是外部扰动的一项,而且外部扰动非常强,基本上不会有几十倍的增加。另外就是一个问题,题目还给了一些其他的数据,这些数据还有用。用户行为数据,在所有数据中展绝大多数,可以比较肯定的说,这个没有什么帮助,效果差。还有就是下载数据等,这些数据可能会包含一些信息,但是在一个很强的扰动背景下,这些作用都比较弱,提取也很困难。其实最后有用的数据就是艺人的播放量和播放人数,还有一些统计量。其实特别简单,模型一的爆发增长是没办法预测的,直接不看。预测一个稳定值,在八月份的回落做出来就可以了。预测这两部分,做一个v型预测。因为艺人播放量在上升,用户播放量在上升,应该是对应到单个艺人上,也是会有上升。变成求 a 的基准值,求 b 的斜率。利用历史数据,一些值做线性回归。前3日播放量的均值相对于前60日最低值的增长量求线性回归了斜率 b前60日中位数,,前7日均值,前14日中位数,30/60日最小值求线性回归 a用总体播放量的增长量求线性回归 c叠加了每个艺人星期的周期变化和节假日的修正系数。每次剔除一个影响最小的量,就会得到大概得值,不会有上升时,就可以拿来做预测。跟其他不同的是做了个叠加,有一个周期变化和节假日的增加。给你数据,让你预测是很难的。如果把数据结果图画出来,很容易观察预测的准确性。
开发者学堂课程【负载均衡入门与产品使用指南: 单 SLB 实例配置多域名 HTTPS 网站】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/380/detail/4765单 SLB 实例配置多域名 HTTPS 网站内容介绍一、单 SLB 实例配置二、单 SLB 实例操作 课程概要:本教程指导如何给性能保障型负载均衡实例 HTTPS 监听挂载多个证书,将来自不同域名的访问请求转发至不同的后端虚拟服务器组。通过配置扩展域名,您可以将多个域名绑定到同一个负载均衡服务地址上,通过不同的域名区分不同的访问来源并且使用 HTTPS 加密访问。 一、单 SLB 实例配置本教程中,需要给性能保障示例SLB1创建一个七层 HTTPS 协议监听,认证方式为单项认证。将名为阿里云虚拟服务器组 doc.aliyun-slb.top 服务器组转发至虚拟服务器组 test1,将来自阿里云 api.aliyun-slb.top 的服务器组转发至虚拟服务器组test2七层 HTTPS 监听使用的默认证书为 default域名 doc.aliyun-slb.top 使用的证书为 doc.aliyun-slb.top域名 api.aliyun-slb.top 使用的证书为 api.aliyun-slb.top1.首先登陆负载均衡控制台,查看本教程的准备工作2. 在实例中可以看到已经创建好的性能保障型,负载均衡实力 SSB13.在证书管理列表中,可以看到本次教程需要使用的三个证书 二、单 SLB 实例操作1. 添加 HTTPS 监听仅 HTTPS 监听支持挂载多证书,使用域名配置的证书解密(1) 单机操作类的监听配置向导或者单机实例 id,进入详情页面。(2) 选择负载均衡协议为 https,端口设置为443,其他配置保持默认值。(3) 选择监听使用的证书为 defalut,认证方式为单项认证(4) 添加默认服务器,设置端口和权重,健康检查,保持默认(5) 单击提交进行审核(6) 在本教程中,还需要在虚拟服务器组件下创建两个虚拟服务器组 test1和 test2(7) 将 ECS01和 ECS02实例加入到 sd 虚拟服务器组中。设置权重和端口号。(8) 将 ECS03 和 ECS04 和 ECS05 实例加入到虚拟服务器组中,设置权重和端口号(9) 在新添加的列表中看到 http 监听2. 配置 HTTP 重定向至 HTTPS通过 HTTP 方式去访问一个 HTTPS 的网站时,能够自动跳转到HTTPS 的网址,并根据 HTTPS 的监听配置进行转发,当前仅支持 HTTP 80访问重定向转发至 https 443(1)在监听详情页面点击添加监听,选择复杂均衡为 http,端口设置为80,展开高级配置(2)开启监听转发,目的监听设置为 http 443(3)配置审核提交。单击确定完成配置。3. 配置转发规则可以将来自不同域名或路径的请求转发给不同的后端服务器组,合理分配服务器资源(1)在监听列表中,点击新添加的https操作类的添加转发策略。(2)输入 api.aliyun-slb.top 域名,虚拟服务器组选择 test1,单机转发策略(3)对转发策略进行高级配置,一般保持默认值即可,输入 api.aliyun-slb.top 域名,虚拟服务器组选择 test2(4)请注意转发规则中设置的域名必须与证书和第三部中添加的扩展域名保持一致4. 添加扩展域名5.结果验证给新增的 HTTPS 监听扩展api.aliyun-slb.top和doc.aliyun-slb.top 两个域名,并分别设置不同的解密证书,实现单个 IP 地址上承载多个SSL证书(1)在监听列表,选择新建的 https 进行操作的更多扩展运营管理。(2)添加域名输入api.aliyun-slb.top,选择证书(3)扩展域名(4)注意,这里要与证书中和第二部配置转发规则中输入的域名保持一致5.结果验证将域名绑定到slb vip上,在浏览器中,分别输入域名api.aliyun-slb.top和doc.aliyun-slb.top,查看流量是否正常转发首先是 doc.aliyun-slb.top运行结果:接着是 api.aliyun-slb.top运行结果:
开发者学堂课程【走进阿里云物联网: 物联网络管理平台(LoRaWAN)介绍】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/557/detail/7667物联网络管理平台(LoRaWAN)介绍 内容介绍:一、简介二、LoRa 介绍及产品所提供的能力三、LoRa WAN 技术特点四、Link WAN 产品架构五、Alibaba Cloud Link WAN 主要功能六、硬件来源 一、简介 首先需要有一个概念,阿里云 IOT 在做的部分分别是云、管、边、端。这四个东西中会有云测的一些产品出现,包括一些服务,就像网上可以看见的智能单品、智能人居对应下图的所在行,这一行的内容对应是云环编端语言的产品能力。本次课程会重点介绍管的部分,下图中红字的部分是 LoRa,从 2G、3G 到 wifi 的这种变端,这都是管的部分。选择 LoRa 作为第一站能力的接入,可以在上面能力的接入,这个是在管能力的一个提高。边就是边缘计算,会有另外的课程来详细介绍。端就是软硬件的一个终端或者是设备,具体上讲他会偏于硬件的生态,就是硬件生态。基础上有物联网操作系统,支持做便捷的开发和能力的赋能。 二、LoRa 介绍及产品所提供的能力(1)LPWAN 家族以及 LoRa 介绍LPWAN 家族LPWAN 是物联网发展的一个新热点,具有广覆盖、低速率、低功耗、低成本的特点。主要技术有:eMTC、NB-IoT,LoRa,SigFox,RPMA, HaLow 等。应用领域:在智能城市、智能农业、智能工业、智能园区等领域有非常广泛应用场景。LoRa 在全球免费频段(即非授权频段)运行,包括433、868、915MHz 等,允许运营商或企业自行建设符合其标准的网络,在IBM、思科、法国 Orange,Google 等重量级厂商成立的联盟推动下,技术成熟。在学习 LoRa 之前,先来了解一个名为 LPWAN 家族的内容。它的全称叫 LowPower WAN,是一个低功耗的连接技术,是一个家族。它有一些特征:是非常适合在物联网上的连接(现处于是物联网发展的热点);它的覆盖率很广,像以前的 WiFi 可以覆盖到家里,但这种 Low Power 使用理由就是覆盖广并且低功耗。LPWAN 家族虽然也具有缺陷,但它在物联网连接里面是可以被忽略的。就目前技术传输的距离非常远并且具备通讯能力的,在以前是2G、3G、4G 这种广为应用。可以看到再上图中的白色区域中,左上角之前是空白的。然后这种 LoRa 方式就可以达到把数据量较小的但传输距离远的功能,LoRa 刚好满足这个距离远但牺牲了传输速率的连接需求。这种存在的技术都称之为 LPWAN,常见的有运营商使用 eMTC 、NB-IoT,是属于授权频段。也有像 WiFi 一样可以组网的,像,LoRa,SigFox,RPMA, HaLow,这几个技术可以自由组建网络,连接网络,与 WiFi 相像。但这些技术应用环境很广,在农业、城市都可以使用。所以认为在未来物联网这种无论是授权还是非授权的这种低功耗技术都会是一个热点。LoRa 在业界是国际标准,这个国际标准是定义在 MAC 层,但连接是在 FHDR 层上。解释说明内容:假设两个终端点对点传输,通过 FHDR 层就可以完成通讯功能,但在 MAC 层就会定义它的交换组网的方式,所以国际上有一个联盟名为 LoRa Alliance。这个联盟就会定义它的规范,也是一个开放性的联盟,任何人都可以加入。所以会有企业在联盟中贡献提供标准的能力,通过一年时间,提出了中国的 LoRa 标准。所以在所有具体的技术中,LoRa 可以彼此互联互通,联盟成员也是可以免费共享在上面会有(2)阿里巴巴在 LoRa 联盟的贡献阿里巴巴是 LoRaWAN 联盟董事会成员阿里巴巴通过一年的时间推出了 LoRaWAN 中国标准截止目前共申请32项专利,联盟成员免费共享所有专利中,2项技术标准被 LoRa 联盟采用,完善了全球标准和协议制定 三、LoRa WAN 技术特点首先它是心状组网,跟点对点传输不大一样。心状组网具体来讲就像是家用的 WiFi 路由器,但点对点就是,在以前的一些 WiFi 组网的时候,由于价格较贵,所以用点对点的传输方式,这就是最大的不同。所以心状组网是 LoRaWAN 技术的最大特征。但它在传输上面也没有抛开 LoRa 的传输能力,它的基础特点还是在 LoRa 上。第一个特征就是低功耗,如果有一个温湿度传感器用的是是5号电池,放了四节,那可以达到两年到四年的一个续航,因为温度的产级量平均比较低,具体上是半个小时产一次,平均十五分钟下来,可以保证很多年都不用产一次,所用功耗相当低。第二个是覆盖面广,它的体感概念是,比如一般家用路由器天线做的再好,它的通讯距离也就是五十到一百米的距离,通常十几到几十米以外,如果房子大一点可能还需要两个以上的路由器。但是在 LoRa 的网端上面,它的通讯范围基本上是以公里起跳,通常是三到五公里的通讯距离。这个距离很容易把园区覆盖完,就可以完成更多的事情。第三个就是高容量。可以发现它的覆盖很大但对容量如何,这个的解释是 LoRa 本身不像是 WiFi 网络中的一种具有连接特性的,它其实是没有连接的属性,不常连接;而它的容量是依照业务模型。所以具体来讲,如果做的是烟感的话,它可能每个小时报两次,报完后会陷入休眠,直到下一次苏醒,一次就大概可以承受两万到三万的烟感,这个容量很高。一般的 WiFi 大概也就只有十几个而已。第四个是高渗透,LoRa 的层次一般具体来说是-137~143dBn,具体看各个厂商做到的程度,但都是这样的量级。这个量级是有一个体感势,一般路由器大概是-100~110dB,所以它的穿透力是比较差的。到143dBn 就穿透大约六到八层,数据上是每6dB 穿透能力就会多一倍。-140到-110中差的有三十 dB,它的传输距离就会加大很多,渗透性也会很好。第五个是低成本。LoRa 在前几年还处于价格偏贵的,用量较少;但这两年,这个模块变得相当便宜,低于五块美金以下,说明它的成本是越来越低的。可以在天猫等地方看到产品,或是一些公益商、合作伙伴会有相当多的解决方案来说硬件,具体是已经在大量部署了。 四、Link WAN 产品架构查看产品结构示意图,可以看到即使寻址是 LoRaWAN 1.0.2或是1.1版本去完成的,具体的是把网关、资讯链路和安全都实测在云测上面,是在公有云版本的内部 serve。对于合作伙伴来说开发这些东西,需要提高对应的 SDK,这个东西对于所要合作的伙伴,是要开发 SDK,从上面获取源代码,直接移植为 LoRa 标准网关。节点上也是,可以通过 SDK 快速使 LoRa 的硬件变为 LoRaWAN 的硬件,就是在 FHDR 层叠加了一个 LoRaWAN 的 Mac 层,是这个节点变成 LoRaWAN 相容的,这就可以轻松的记录到这个平台。这个产品在阿里云平台可以完成一件事情。这个事情就是在,如下图中的红色框中,这是一个阿里云所有的控制台。用户可以开通对应的账号来使用该平台,目前提供免费的方式就是可以监督网关,一些的终端可以免费使用这些基础的网络组件。可以发现这些的界面为了使用它是相当的简单,它是希望每一个人可以像组建 WiFi 网络,甚至更简单的方式去把LoRa文件组建起来。另外,提供的 API 服务是提供给运营商或者是管理有更大容量需求的网关,可以通过 API 服务集成到自己的系统。当数据从端测到了云测的后,如何把数据取回?先说明用户做的是把协议栈做交互时,用户数据本身被加密的数据,所以这个本身是作为管道能力,因为它没办法解开,没有钥匙。但是会提供两个管道,让用户把数据取回。第一个管道是最通用的叫做 MQ 服务,就是阿里云提供的一个服务,它与 MQ 消息队列,它具体就是 Mqtb 的 topic 可以通过上下型来完成 topic 的订阅。然后再接上自己的,就是可以搭建一个物联网的应用服务器,去完成数据的订阅,消耗量,就像之前提到过的可以做一个烟感的应用,可以订阅数据和下行的一个控制,这就是标准的 Mqdb 的一个接口。还提供阿里云 Link 物联网平台的 path 开发服务,可以自己完成设备的管理、脚本或者是一些物模型。通过物联网平台,阿里云 IOT 本身的内部可以打通,可以轻松的使用平台,以更快的速度使产品落地,这就是阿里云 IOT 提供的物联网服务 五、Alibaba Cloud Link WAN 主要功能通过这个平台可以完成三件事。第一个就是可以组网,将网关接到平台上面,把整个配区的网关整理起来在进行网络的管理。第二件事是可以管理入网的权限,也就是开通所谓的凭证。将通讯配置配到凭证上去,具有凭证的就可以使用网络,就可以把能使用网络的人做一个分配管理。第三个就是可以完成通讯的能力,节点就是通讯的工具。任何节点只要具有入网的凭证,就可以在网络中进行通讯。具体上使 LoRaWAN 的 classA、classB、classC 模式。采用的入网配置使 otea,是 LoRaWAN 标准的路由入网方式 六、硬件来源买硬件至少需要有网关、骁龙 LinkWAN 的节点或终端。在阿里云 IOT 页面的左下角有一个 Link WAN 的广域物联馆,点进去后可以看到至少三十家以上供应商所提供的一些软硬件产品。需要网关、终端等这些硬件就可以连接到 Link WAN 平台。具备硬件和服务功能之后,就可以用来做物联网服务。
开发者学堂课程【走进阿里云物联网: 边缘计算(Link IoT Edge)介绍】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/557/detail/7666边缘计算(Link IoT Edge)介绍内容介绍:一、产品二、快速搭建三、接入四、计算五、应用 一、产品(1)企业痛点当一个企业将全部设备搬入云端,随着设备增加需要面对环境不稳定以及成本大幅增加的问题。边缘计算领域主要是解决在物联网应用中当一个企业设备端网络不一定实时保持高可靠的状态下有可能出现异常导致网络延时增加甚至网络中断等问题,同时设备端中存在大量的设备通信异构以及协议私有化的问题从而导致设备端的成本增加,阿里云的边缘计算产品就是为了解决用户的高可靠性、网络异常、以及设备经济性的问题。(2)功能定位功能定位包括设备接入(提供设备接入工具,将各厂商提供的各种协议及数据格式的设备转换为标准统一的设备模型)、就近计算(一定资源要求下的计算在边缘就近计算,在脱机情况下,计算不被终止)以及数据清洗(在边缘计算节点中将设备上报的原始数据进行数据聚合加工,将有效数据上传云端存储及计算)三大部分。设备接入主要是用一种高效的方式将设备端的不同的厂家、不同类型、不同通信方式的设备集成起来,然后进行就近计算(包括函式计算、流式计算还有一些规则计算等的计算逻辑),同时也提供一些本地暂存功能以应对网络不稳定的情况,当网络不稳定的时候数据可以先保存在本地的数据库或存储设备之中,当网络恢复之后再将之前存储的一些缓存数据打包上存到云端,同时还可以在边缘端进行数据清洗的工作,数据清洗可以减少数据上传的数量,进而减少云端资源的消耗,降低上云的成本。(3)产品定位阿里云边缘计算专注于提供物联网安全防护下的设备连接服务、设备管理服务、设备联动服务,赋能各类物联网场景和行业开发者,实现云到边缘的辐射。边缘阿里云的策略是云边端一体化,云上的功能与边缘的功能存在着一定的对应关系,云上有安全、连接、存储、计算、智能的功能,边缘也有同样的功能,但云上与边缘的功能定位不是完全类似的。由于边缘端的性能是受限的,所以不可能完全提供云上的这些工作与能力。边缘是一个云和设备之间的桥梁,它通过把云的能力下沉到边缘端来解决用户设备端和边缘端的一些问题。 (4)产品核心核心能力包括可视化的脚本形式的编程以及 IFTTT 的可视化编程、流式计算的容器、FC 容器、算法容器、可以无缝衔接 ET 大脑、人工智能 MaxCompute 的训练模型。在云端进行模型训练,导入本地的模型运行环境然后再推理出模型执行的动作,最后由设备端来实现这个动作。同时也包括设备连接和设备控制类的工作,它能快速地集合物联网的设备,也能通过云通道把本地的边缘端的设备数据上传到云端,在云端进行设备的管理与设备的存储。二、快速搭建(1)软件安装安装主要是在边缘端上安装网关 SDK,其中包括设备驱动下载的框架以及函数计算的框架,如果在业务中需要用到这些功能时则需要进行二次开发。其次需要在云端创建设备的物模型,当设备连上云端后需要用物模型来进行对设备的管理,也可以通过 openApi 来进行设备数据的调用与开发服务。软件安装首先需要从云端获取 Link Edge 的软件以及安全证书,然后将软件和安全证书同步安装在硬件载体(硬件载体可以是 X86/ARM/MIPS 等多款芯片)中,然后再将其连接到互联网,这就是一个完整的在边缘端软件安装的步骤。(2)设备驱动在软件安装之后就可以使用软件中提供的一些功能,比如设备驱动。设备驱动包括连接/数据转换代码、设备安全证书以及通讯协议相关硬件三大部分。而设备驱动现在可以支持 WIFI、ORA、BLE、ZIGBEE、MODBUS、OPC-UA、MQTT、CRAB 等。完成设备接入边缘计算节点则需要三步骤,首先通过驱动开发工具二次开发驱动代码,如果协议存在硬件模组要求则集成模组,然后安装数据加密及设备身份识别的安全证书,最终将边缘计算节点连接设备与本地局域网/广域网连接。(3)数据上下行数据上下行包括原始数据通过驱动程序转化成标准物模型的数据结构之后可以自动地传输到云端,云端可以自动入库、存储并永久地固化下来。同时控制指令可以通过云端的属性设置接口,通过驱动转化成设备私有协议的指令后,在设备端上执行这个指令。 三、接入(1)数据标准阿里云 ICA 联盟将物联网中的各类设备抽象成为标准的物模型,边缘计算支持开发者像搭积木式一样,快速完成一款设备的功能描述,我们也提供完全自定义的能力,创建设备的“属性”(Property)、“服务”(Service)、“事件”(Event),系统将自动为该设备生成一份JSON格式的物模型描述(Thing Specification Language,即TSL),用于实现设备之间的互联互通和智能分析。数据接入首先有一个数据模型标准化转换的过程。由于在设备端的数据都是通过不同协议转化、存储与标准化的,在云端不能通过不同协议来完成,这样会增加工作量,所以阿里云提供了一种物模型的方式来把设备的数据进行标准化,从边缘端把设备的数据进行物模型的转换,然后在云端就可以通过物模型的调用方式进行应用。任何应用与系统都可以通过同样的方式来调用设备的数据。物模型包括多个不同维度的信息,如设备当前的状态、设备的详细信息、设备的属性与服务以及设备的事件。通过设备影子以及设备之间的互联物通,将设备的物模型与设备关联起来。(2)设备接入Link IoT Edge 提供 ModBus 和 OPC-UA 两种通用协议的接入,同时还提供WebSocket 的接口,也可以通过原始 API 的方式来提供给客户使用,客户也可以通过各种原始 API 来进行驱动程序的开发。(3)设备调试阿里云提供了设备影子的实时日志的调试,可以通过日志来判断算法的执行的过程或者是设备通信驱动执行的过程,同时也提供了从云到端的一体化的调试能力,还可以模拟设备和真实设备的分别处理,为客户提供快速的调试模板,提高了调试的效率。(4)数据开放当数据存储在云端之后,便提供了开放的 API 接口,可以查看设备的运行状态,也可以调用设备的能力来控制设备,同时可以查看设备的历史数据和实时数据。其包括运行状态(设备上报的属性值,支持在控制台查看设备实时状态和历史数据,提供获取设备状态和历史数据的API接口。)、服务调用(云端下发到设备的控制指令,支持在控制台搜索设备的服务调用记录,提供设备属性设置、服务调用的API接口。)、事件管理(设备上报的各类事件,如信息、故障或告警类事件,支持在控制台管理设备的所有历史事件,提供事件订阅和查询的АPI接口。)。 四、计算(1)函数计算函数计算指的是用户可以用脚本语言的形式开发业务逻辑,令 Link IoT Edge 提供函数运算的框架,可以使用用户的业务逻辑来运行在边缘端。在这个模式中,为其提供了云端一体的开发环境,可以在云端开发函数计算的脚本代码,也可以用可视化编程的方式,提供了标准物模型控制的 SDK 和 API,这样可以通过一些简单的调用来访问设备的数据和控制设备。IFTTT 是一种规则计算的形式,它是一种简单的规则计算,可以用可视化的形式来进行拖拽的方式或者通过选择的方式来生成一些业务逻辑,不需要额外的开发工作量。(2)流数据分析流数据分析主要是面向大量数据,用阿里云云端的流数据分析的能力来处理数据,其中会有可以预制的组件来提升开发效率,例如窗口应用可以在预定的时间内自动选出该时间段内窗口的最大值、最小值以及平均值。在云端中则集成在 LA 产品中,可以通过 Seek 语句或者通过可视化编排的方式来生成流数据分析,然后将该流数据分析下发到边缘实例中,再通过此边缘实例执行流数据分析,在边缘端生成一个结果。边缘端可以运用此结果,也可以将此结果输出到边缘或云端的数据库之中。(3)API 人工智能在边缘中将会提供一个人工智能运用的框架,在云端通过训练生成一个设备模型,然后将此模型导入到本地的运算框架之中,本地可以通过此模型来预测设备的一些状态,从而进行对设备的控制,最终由设备端来执行对设备的控制指令。五、应用(1)家居全屋-函数计算在未来酒店中,顾客在入住时会进行人脸的录入,录入在前台后就可以通过人脸进入到楼道的闸机或者进行开门等,而本地的操作则需要一个本地的边缘网关来承载,如果运用其他手段则会增加网络的延时性,而运用边缘网关则可以快速地响应本地数据的处理以及人脸识别,在此基础上则可以快速地打开门、闸机,也可以同步更新“天猫精灵”来实现对本地设备的控制,如打开空调、打开电视等功能。同时也可以设置一些运行规则,如什么时间段模拟什么场景、怎么操作等。(2)工业生产-流数据分析此场景中通过 Modbus 协议采集了工业生产的生产数据,通过边缘网关进行分析预测,得到本地的设备的损耗信息、提前预警。通过流式计算可以处理大量数据,在出现温度预警或其他的紧急情况下,本地边缘端可以通过自动控制逻辑来进行实时的响应,从而提高响应的效率。(3)能源发电-PAI 智能在风力发电效率提升的场景中,风力发电是一个有非常多的实时数据的场景。在这种场景下,对大型发电设备进行提前预警或发电效率的提升,它对最终的经济收益的影响是非常大的。通过云端的 MaxCompute 功能将风机的数据从边缘端Modbus采集到之后导入到云端的 MaxCompute 功能之中,可以计算出风机的发电模型,通过优化风机的发电模型来得到控制的优化逻辑,提高优化效率,最终将模型导入到本地边缘网关之中,通过边缘网关根据模型来控制风机的曲线与控制逻辑,最终提高风机发电的效率。
开发者学堂课程【云原生实践公开课: Gitops 最佳实践】学习笔记,与课程紧密联系,让用户快速学习知识课程地址:https://developer.aliyun.com/learning/course/698/detail/12276Gitops 最佳实践内容介绍:一、 GitOps 概述二、 应用中心介绍三、 部署应用四、 GitOps 交付实践一、 GitOps 概述1.什么是 GitOpsGitOps 是一种应用持续交付的方式,它的核心思想是将应用程序的声明式编排甚至基础架构编排都存放在 Git 源仓库中,实际上任何能被描述的内容都可以被存放在Git 源仓库中。GitOps 主要应用场景是在云原生环境下应用的持续交付,相反云原生环境也为GitOps 交互模式的发挥提供了一些基础设施的条件,如下所示:(1)使用GitOps交付模型的基础条件:不可变基础设施。声明式的容器编排。2.GitOps交付模型的特性:Git 作为应用变更的唯一入口。拉式流水线。可观测性。3.GitOps工作流程∶应用管理员提交应用变更到Git.GitOps 引擎定期检测Git端应用更新,若有更新则开始拉式流水线。GitOps 引擎拉取应用更新并交付到实际运行环境。GitOps 引擎定期检测应用的实际运行状态和Git端描述的状态的差异性并报警或自动处理。4.GitOps的好处︰研发效能提升。安全审批和审计.应用运维效率提升。更快的平均恢复时间。二、应用中心介绍应用中心是用于 Kubernetes 的声明式的 GitOps 持续交付工具,基于 开源工具Argo CD开发。Argo CD 包括三个组件,第一个是API,第二个最主要的就是操作这个应用,负责增删改查,主要是管理这个原仓库,例如添加 git 类型的原仓库,以及可以添加HIB类型的原仓库。作为原仓库去进行管理创建删除以及配对的速度管理都在rap上。原生的 Kubernetes 没有一个完整的应用的概念所有应用的子资源,部署下去就分散到集群里去。Argo CD 把这些所有的子资源全部描述在一个里,这里就是一个完整的应用的概念。 1. 安装和使用(1) 第一步安装控制器(2) 添加集群2.数据源仓库管理阿里云应用模板n Git仓库Helm 仓库3.集群管理登录GitHub,打开需要部署的仓库因为是公共的仓库,所以不需要密码直接可以登录三、创建和部署应用使用应用中心创建应用应包含以下几部分配置:1.基础配置应用名称,如 guestbook应用同步策略,如 none 或 automated2.源仓库配置源仓库类型,如gi或 helm源仓库地址,如httos:llgithub.comhaoshuwei/book-examples其他信息,如果是Git类型源仓库,则还需要配置修订版本信息子目录信息,本示例中配置修订版本为‘master`分支,子目录为"examples/guestbook/helm`;如果是 Helm 类型源仓库,则需要选择 Helm Chart 名称及其版本号3.目标集群配置目标集群的API Server地址或目标集群的名称,https://192.168.0.32:6443或appcenter目标集群的命名空间,如 guestbook4.guestbook 应用资源拓扑healthy:表示应用是否正常运行。synced:表示处于同步状态,即 git 端和实际运行环境中的版本是一致的。sync ok:在部署应用的动作是否成功完成并返回。刷新后查看四、GitOps交付实践GitOps 模式更新应用 guestbook :1.开发者创建开发分支 feat/guestbook-v2并更新应用2. 开发者请求合并分支 feat/guestbook-v2到 master3.应用管理员审批步骤2中的合并请求,若应用更新没问题则合并请求4.应用中心自动检测 Git 端应用 guestbook的更新5.若检测到更新,则将其同步部署至实际运行环境 代码示例:apiversion: v1kind: Servicemetadata:annotations:kubectl. kubernetes.io/last-applied-configuration: >{"apiVersion":"v1","kind"":"Service","metadata": {"annotations":{}"labecs":{"app" :"guestbook" ,"app.kuberncreationTimestamp: "2020-10-20T14:38:42z'labels:app: guestbookapp. kubernetes.io/instance: guestbooktier: f rontendname: frontendnamespace: guestbookresourceversion: '307457784"selfLink:/api/v1/namespaces/guestbook/services/frontenduid: 1f1382d3-5841-493d-9689-8edada3ead22spec:clusterIP: 172.17.8.69externalTrafficPolicy: clusterports:- nodePort: 30020port: 80protocol: TCPtargetPort: 80selector:app: guestbooktier: frontendessionAffinity: Nonetype: NodePortstatus:loadBalancer: {}手动刷新后
开发者学堂课程【分布式消息中间件 MQ 开发教程:MQ 消息查询】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/364/detail/4351MQ 消息查询MQ 消息查询介绍当一条消息发送到 MQ 服务当中过后,随时可以通过控制台查询他。提供了三种查询方式进行 topic 查询。使用 message key 进行查询以及使用 message ID 进行查询。1.首先查询某 topic 在一段时间内的消息生产情况。Topic 查询Production_Topic 2016-08-12 12 : 50至2016-08-12 13: 20点击搜索可以看到最近半个小时内所有的消息。2.使用 Message Key 进行查询,Message Key 查询 Key 是指发送消息时,设置到消息对象中的 Key 字段。限制: 一个 Key 查询出的结果集合不超过64条。Production_Topilc MyKey输入 topic。输入一个 K。可以查到设置为 K 的消息。3.使用 message ID 进行查询输入 topic,输入名字 IDProduction_Topic 707C8CC3524400D87E9638EB85180173可以查询到消息那些详情信息,包括所属 topic 设置 K、一些用户属性等,也可以进行消费验证。Message ID:707c8CC3524400D87E9638EB85180173Topic: Production_TopicConsumer ID:CID_HTTP_ONSMIONITOR_FOR_PUB30.9.76.186@73683#14159488#-474924211#575162252339864点击确定为了方便用户定位问题,也提供了一个消息轨迹功能。点击消息轨迹。4.新建查询。可以根据 message ID,根据 message key,根据 topic 来查询消息,从生产到发送到消费的整个全年的过程。5.演示使用 message ID 查询消息位置 Topic: Production_Topictopic 是所要查询的消息的主题Msgld:CC3524400D87E9638E885180173msgid 是由发送方 Send 方法返回的32位 Hex 字符串时间范围: 2016-08-12 12: 51 至 2016-08-12 13: 21 可以看到查询完成,点击查看详情,查看轨迹,可以看到消息何时被发送,何时存储,消费成功。
开发者学堂课程【分布式消息中间件 MQ 开发教程:MQ 介绍】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/364/detail/4349MQ 介绍内容介绍:一、MQ 的由来二、MQ 产品总览三、MQ 三种发送方式四、MQ 三种方式发送消息比较五、MQ 消费模式六、HTTP 接入七、事务消息八、消息过滤九、顺序消息十、MQTT 介绍十一、MQTT 应用场景介绍十二、消息轨迹-快速定位问题十三、MQ 中继十四、总结-MQ 阿里双11使用的消息中间件十五、MQ 广泛应用于各行业十六、MQ+ARMS 物联网解决方案一、MQ 的由来MQ 产品简介阿里内部产品名:MetaQ、Notify开源社区产品名:RocketMQ阿里内部1000+核心应用使用,每天流转几千亿条消息,稳定可靠多次经过双11阿里交易、商品、营销等核心链路真实场景验证消息队列 MQ 产品解析:消息队列以及 MQ 是阿里巴巴集团中间件技术部自主研发的专业消息文件,基于高可用分布式集群技术的企业级互联网架构的核心产品。 MQ 的历史超过九年,为分布式应用系统提供不竭于削峰平谷的能力,同时具备海 量消息堆积,高通透可靠从事等互联网业务所需的特性,是阿里巴巴双11使用的核心产品。阿里内部有上千个核心应用使用,每天流转几千亿条消息,稳定可靠,并且MQ 多次经过双11案例交易、商品营销等核心内容的真实场景验证。MQ 也有很多特色功能,包括顺序消息、事务消息、定时消息,同时支持广播消费与集体消费、消息过滤消息轨迹等。二、MQ 产品总览MQ 是一种支持万亿级数据洪峰的分布式消息引擎,是一种面向消息系统的高性能、高可靠、低延迟的分布式消息系统,可以提供面向终端场景的安全的、可靠的、高效的消息传输服务。也是一种面向广和网络环境下跨语言跨平台的应用互联互通的专有解决方案。为了达成这些目标,MQ 提供专有云输出专业版、企业铂金版、物联套件公共云服务-同城多机房多份备份公有云、金融云。MQ 提供管理控制台,提供多协议接入,提供运维系统以及远程运维服务。用户在控制台上可以做到发布/订阅管理、授权管理、消息查询、生产与消费报表、监控报警、回溯消费、消息轨迹、OPEN API、mqadmin 命令集。同时通过运维系统可以做到统计监控安装不属于升级产品配置诊断排查。在遇到使用问题也提供一定的运营服务,用户可以通过的热线电话得到远程支持,也可以通过反馈工单性故障处理同时。甚至提供现场的专家服务。在产品层面,MQ 也支持多协议接入,包括 TCP 协议 SDK 接入、HTTP 协议简单接入、MQTT 协议物联接入。在客户端使用方面,MQ 提供三种消息发送机制,包括同步可靠、异步可靠、oneway 方式、Topic、消息订阅。消息类型只支持普通消息、定时(延时)消息、事务消息、顺序消息。运维系统包括统计监控、安装部署/升级、产品配置、诊断排查。运维服务包括客户热线电话/远程支持、工单/故障处理、现场专家服务。三、MQ 三种发送方式MQ 的三种发送方式,第一种是可靠同步发送,是指消息发送方发送出去后会再收到接收方发回响应,之后才能发送下一个数据包的通讯方式。如果需要发送三条消息,首先需要发送消息一,得到消息的同步响应,然后发送消息二,得到消息二同步响应,最后发送消息三,得到调节三的同步响应。第二种模式是可靠的异步发送,异步发送是指发送方发出数据后,不等接收方发送响应,接着发送下一个数据包的通讯方式。MQ 异步发送需要用户实现异步发送,回到接口。在执行消息的异步发送时,应用不需要等待服务器响应即可直接返回,通过回到接口,接着服务器响应,并对服务器的响应结果进行处理。同样,如果需要发送三条消息,首先消息发送出去,不需要等待响应,立即发送消息二、同时立即发出消息三,通过异步的方式来接收这三条消息响应。第三种方式是弯位方式,也叫单向发送,单向发送特点是为此负责发送消息,不等待服务器响应,且没有回调函数,触发即止发送请求不等待应答。此类方此方式发送消息过程耗时非常短,一般在微妙级别。同样,如果需要发送三条消息可以并发地进行消息,三个消息发送,而无需等待服务端响应。四、MQ 三种方式发送消息比较适用场景:1.同步发送:此种方式应用场景非常广泛,例如重要通知邮件、报名短信通知、营销短信系统等。2.异步发送:异步发送一般用于链路耗时较长,对RT响应时间较为敏感的业务场景,例如用户视频上传后通知启动转码服务,转码完成后通知推送转码结果等。3.单向发送:适用于某些耗时非常短,但对可靠性要求并不高的场景,例如日志收集。发送 TPS同步发送:快异步发送:快单向发送:最快发送结果反馈同步发送:有异步发送:有单向发送:无可靠性同步发送:不丢失异步发送:不丢失单向发送:可能丢失五、MQ 消费模式1.集群消费模式MQ 是基于发布订阅模型的消息系统,在 MQ 消息系统当中,消息订阅方订阅关注Topic 以获取并消费消息,订阅方应用一般是分公司系统,以集群方式部署有多台机器。MQ 约定以下概念,首先,集群 N 个约定使用相同 ID 的定位只属于同一个相对集群,同一个集群下的定位,消费模型必须完全一致。这些订阅者在逻辑上可以认为是一个消费节点。集群消费,当使用集群消费模式时,MQ 认为任意一条消息,只需要被集群内的任意一个消费者处理即可。2.广播消费模式当使用广播消费模式时,MQ 会将每条消息推送给集群内的所有注册六、HTTP 接入使用 HTTP 协议有以下有以下几个优点,首先消息对 HTTP 接入模式的最大优势是跨语言,跨网络,可以解决异构网络环境下的服务相互访问屏障。对于没有提供相关操作消费SDK的环境当中,使用 HTTP 方式记录更方便,同时消息对面 HTTP。接触方式在使用上简单上手快。HTTP 接入应用的场景: 首先,接入方的应用场景主要依托于客户的业务场景,假设客户的业务场景或者部分模块是基于 HTTP 协议,并且需要通信服务,可以使用 MQ 服务。目前提供的消息队列服务提供了 python 和 python 和 PHP 的事例相关方法相关的使用方法,请参考,具体的示例程序。七、事务消息MQ 事务消息:帮助用户实现类似 X/Open XA 的分布事务功能,通过 MQ 事务消息能达到分布式事务的最终一致。半消息: 暂不能投递的消息,发送方已经将消息成功发送到 MQ 服务端,但是服务端未收到生产者对该消息的二次确认,此时该消息被标记成为暂不能投递的状态。处于该状态的消息,即为半消息,半消息回查,由于网络闪断,生产者应用统计的原因导致某条事故消息,确认丢失。MQ服务端通过扫描,发现某条消息长期处于半消息状态时,会主动向消费者询问该消息的最终状态,来决定对该消息是一个 commit 或者 rollback 的操作该过程也就是消息回厂过程。 事故消息使用的场景是能够帮助用户实现类似于二分差异的分布式事务功能,通过MQ 事务消息能达到分布式事务的最终一致。八、消息过滤MQ 允许消费者按照 Tag 对消息进行过滤,确保消费者最终只消费到他关心的消息类型。从客户下单到收到商品这一过程会生产一系列消息,比如订单创建消息 ( order) 、支付消息 (pay) 、物流消息( logistics )。这些消息会发送到 Topic 为 Trade_Topic 的队列中,被各个不同的系统所接收,比如支付系统、物流系统、交易成功率分析系统、实时计算系统等。其中,物流系统只需接收物流类型的消息、(logistics) ,而实时计算系统需要接收所有和交易相关( order、pay、logistics )的消息。MQ 提供的消息过滤是直接在 MQ 服务端完成的,通过服务端消息过滤,提高消息投递的有效性,降低消费端业务系统的压力,也能提升整体的服务性能。九、顺序消息顺序消息︰MQ 提供的一种按照顺序进行发布消费的消息类型。顺序消息由两个部分组成,顺序发布和顺序消费﹔顺序消息类型一共分为两种,全局顺序和分区顺序。顺序发布∶对于指定的一个 Topic,客户端将按照一定的先后顺序进行发送消息。顺序消费︰对于指定的一个 Topic,按照一定的先后顺序进行接收消息,即先发送的消息一定会先被客户端接收到。全局顺序︰对于指定的一个 Topic,所有消息将按照严格的先入先出的顺序,进行顺发布和顺序消费。分区顺序︰对于指定的一个 Topic,所有消息根据 sharding key 进行区块分区,同一个区块的消息将按照严格的先入先出的顺序,进行顺发布和顺序消费。sharding key: 顺序消息中,区分不同区块的关键字段。sharding key 于普通消息的key 是完全不同的。 1.全局顺序使用全局顺序的业务应该是对性能要求不高,所有的消息都必须严格按照先入先出的原则进行消息发布。2.分区顺序MQ 分区顺序消息适用于如下场景,性能要求高,以 sharding key 可以作为分区字段。在同一个分区中,严格按照先入先出的原则进行消息发布与消费的场景。举例说明,首先,如果用户注册需要发送验证码,以用户ID作为sharding key,那么,同一个用户发送消息都会按照先后顺序来发布和订阅。再比如,电商的订单创建订单ID作为 sharding key,那么同一个订单相关的创建订单下,那么同一个订单相关的创建订单、消息、订单、支付消息,订单退款消息,订单物流消息都会按照先后顺序来发布订阅。阿里集团内部的电商系统均使用此种分区数据消息,既能保证业务上的顺序,同时又能保证业务的高性能。十、MQTT 介绍MQ 支持标准的 MQTT 协议,应用方无技术捆绑,可以无缝迁移。可以支持移动端 MQTT 消息和 MQ 消息的相互流转。无需自己维护 MQTT 服务端,稳定性和可靠性更高。完全兼容任何支持 MQT T标准协议的 SDK。终端数据采集支持顺序,例如同一辆车、同一台设备采集的数据有序。典型场景物联:车联网、智能电器、智能穿戴等社交:即时通信、社群类视频互动:弹幕、直播红包、投票、广告推送:APP推送、终端推送十一、MQTT 应用场景介绍MQTT 支持主流的 Java ios android 的平台,能够非常方便的应用于车联网领域、IM通讯领域、视频直播领域、智能家居领域、金融、物流等领域。十二、消息轨迹-快速定位问题消息轨迹指的是一条消息从生产方发出到消费方消费处理整个过程中的各个相关节点的时间、地点等数据汇聚而成的完整内幕信息、消息轨迹这一产品功能的使用场景在于在生产环境的消息收发不符合预期,是可以使用消息轨迹工具排查问题。通过消息的属性,找到消息的实际生活状态,帮助诊断问题。如图所示,是一个线上的一个消息查询结果,可以看出,从生产者到消费者的全面的状态,都可以在控制台上进行查询并可视化展示。如果在业务上发现有一条消息一直没收到,业务方如果根据业务日志里的信息判断某一条消息一直没有收到,此时可以使用消息轨迹工具来进行确认的情况。通过以下步骤,首先收集怀疑的消息和信息。MessageKey 、MessagelD 、topic,以及大概的发送时间范围,然后进入 MQ 控制台,根据余额信息新建查询任务,查询相关的消息轨迹。第三步,查看结果并分析判断原因。如果轨迹显示尚未消费,则可以去订阅管理页面查询,确认是否有堆积导致消息商务消费。如果发现消息已经消费,请根据消费端的信息,找到对应的客户端机器与时间登录查看相关日志。十三、MQ 中继MQ 中继功能为用户提供一种跨网络、跨防火墙、跨 NAT 甚至跨不同的云产云厂商的一种互联互通的解决方案。十四、总结-MQ 阿里双11使用的消息中间件消息丰富MQ 提供4种消息类型︰普通消息、定时消息、事务消息、顺序消息MQ 提供3种消息发送方式︰可靠同步/可靠异步/Oneway管理多维具有消息查询、消息回溯、消息轨迹、堆积监控报警功能服务健壮99.9999976%数据可靠性99.99999999...%以上服务可用性消费失败定时重试多机房多份存储性能优越百亿级堆积能力低延迟、毫秒级投递支持高并发生能集群支持十五、MQ 广泛应用于各行业MQ 产品在金融领域、互联网领域、网络里面都有完整的解决方案,尤其在金融领域方面,通过专有云输出在各大银行批的渗透,逐步替换金融领域的 IBMQ,同时也提供MQTT物联网组件,来覆盖物联网、车联网等场景。云方案提供商、物流、IM、大型企业、移动应用、监控、车联网、电力、物联网、电商、视频互动、金融十六、MQ+ARMS 物联网解决方案MQ 海量接入包括:MQTT 协议、808协议、三级推送、消息订阅、鉴权认证、设备状态IAAS 阿里云飞天平台的应用和数据库框架包括: 分布式服务框架 EDAS、分布式事务TXC、分布式数据库 DRDS通过 MQ 的海量接入,将汽车电器终端、手机、WEB 端、其他设备的所有数据支持多种协议的形式,发送到 MQ broker 端,ARMS 可以对其进行一个业务上的监控,包括日志、网关、日志模块、数据存储、实时计算、监控展现等,同时也提供丰富的报表可视化展示以及一些高级的支持。
开发者学堂课程【企业级分布式应用服务 EDAS 使用攻略:IDEA-Tomcat 插件安装】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/359/detail/4218IDEA-Tomcat 插件安装内容介绍一、安装 IDEA-Tomcat 插件二、配置 Pandora(taobao-hsf.sar)一、安装 IDEA-Tomcat 插件1.下载插件在安装 IDEA-Tomcat 插件前,首先应进入 EDAS 官网:https://www.aliyun.com/products/edas 。网站最下端打开 EDAS 开发者指南,点击其中的“1.1.2 IntelliJ IDEA 安装 Ali-Tomcat”,然后点击下载地址,下载插件,该插件的下载地址如下网址:https://edas-public.oss-cn-bangzhou.aliyuncs.com/install.package/tomcat/taobao-tomcat-7.0.59.tgz2.将下载的插件解压到指定位置,并打开解压压缩包的内容。3.打开 IntelliJ IDEA,点击工具栏中的的 Run,点击 Edit Configurations 按钮,然后在 default 下方点击 Tomcat Server,再点击 Local。在 Server 页面下的 Application server 下点击 Configuration,在左侧新建一个文件tomcat2,指向文件 tomcat-7.0.59.tgz 的地址,根据提示点击“OK”,对本机安装的 IDEA-Tomcat 插件安装完毕。二、配置 Pandora(taobao-hsf.sar)1.下载 PandoraPandora 的下载地址:https://edas-public.oss-cn-hangzhou.aliyuncs.com/install_package/pandora/unauth/taobao-hsf.tgz2.将下载的 taobao-hsf.tgz(Pandora 的包)放置于某一位置,保留 taobao-hsf.sar3.通过 IDEA 的 Configuration-Server 界面配置 Pandora 的目录,即把 taobao-hsf.sar 放入该页面的 VM Location 中,即“Dpandora.location=D:\edas-develop\taobao-hsf.tgz”(D:\edas-develop\taobao-hsf.tgz 为本机中 Pandora 包的目录地址)。4.点击 Apply(应用),键入本机文件 edas-demo ,通过 Run 重新启动本机应用,显示本机1099端口已被使用(是因为演示案例的计算机配置了1099端口),回到edas-demo 文件,在 Tomcat Server Settings 中将“JMX port”中的端口修改,再次启动。通过控制台的 Local 可以发现插件和配置已经正确加载。
开发者学堂课程【企业级分布式应用服务 EDAS 使用攻略:HSF 基础知识】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/359/detail/4219HSF 基础知识内容介绍:一、配置文件示例二、HSF 标签清单三、HSF jvm 参数(全局参数)配置前面已经介绍了开发工具的配置及开发环境的搭建,接下来我们将学习 HSF 的项目开发。在进行 HSF 项目开发前,首先应 JAVA 意义开发的技能,包括 Spring 框架、Maven项目管理工具、通用日志框架的使用以及 HSF。一、配置文件示例1.服务发布者配置文件实例:<bean id="impl"class"com.taobao.edas.service.implSimpleServiceImpl"/>//声明了一个服务器接口类型的 bean,与Spring 通用的 bean 完全相同<hsf.provider id="simpleService"interface="com.taobao.edas.service.SimpleService"ref "impl"version="1.0.1"group="test1"clientTimeout="3000">//通过 hsf.provider 说明服务发布者的基本信息,首先定义了服务发布者的接口(com.taobao.edas.service.SimpleService),接口的实现包括 version、group 等属性,通过属性 clientTimeout 定义服务器超时时间。</hsf.provider>注:interface 属性和 ref 属性是必须填写的,version、group 和 clientTimeout 如果不填写会有一个默认值。在项目开发中,version 和 group 最 好要设定一个值。2.Consumer 配置文件示例<hsf.provider id="service"interface="com.taobao.edas.service.SimpleService"version="1.0.1"group="test1"clientTimeout="3000">//相对于 provider 配置文件示例,少了接口的实现。主要声明了 Consumer 主要消费哪个接口,还显示 version、group 等属性,通过属性 clientTimeout 定义服务器超时时间。</hsf.provider>注:interface 属性是必须填写的,version、group 和 clientTimeout 如果不填写会有一个默认值。在项目开发中,version 和 group 最好要设定一个值,且 interface、version 和group 的值必须与 provider 配置文件示例中的值一致(区分大小写),否则使用Consumer 校用 provider 配置文件时,可能会找不到地址。二、HSF 标签清单1.Consumer 配置标签清单(1)interface:必须配置 [string],为需要调用的服务的接口(2)version:为需要调用的服务的版本,默认为 1.0.0(3)group:为需要调用的服务所在的组,默认为 HSF (4)methodSpecials:可选配置,为方法配置超时时间,即通过 clientTimeout 声明的接口的超时时间,可以通过 methodSpecials 声明超时时间(5)target:主要用于单元测试,即制定一台 provider 启动的 IP 地址。但生产环境下,不建议设置此属性,因为若在生产环境在 provider 出错,会导致服务出现异常,无法调用。(6)connectionNum:可选配置,主要用于连接到 Server 的连接数,不需要开发者特殊关心,如果需要特殊设置,可联系现场的架构师,以选择合适的值(7)clientTimeout:客户端设置接口中所有方法的超时时间,单位是毫秒。Provider、consumer 中超时时间设置的优先级:客户端 MethouSpecials> 客户端接口级别>服务端 MethouSpecials> 服务端接口级别(8)asyncallMethods:异步调用的方法名列表及异步调用方式,不建议开发者使用,特殊需要可联系专业的架构师选择合适的值(9)maxWaitTimeForCsAddress:一般不需要设置标签配置示例:<hsf.provider id="service"interface="com.taobao.edas.service.SimpleService"version="1.0.1"group="test1"clientTimeout="3000">target="10.1.6.57:12200?_TIMEOUT=1000"maxWaitTimeForCsAddress="5000"<hsf.methodSpecials><hsf.methodSpecials names="sum"timeout="2000"> </hsf.methodSpecials></hsf.consumer> 相较于之前的 Consumer 配置文件示例,多了 target 和 methodSpecials 调用事例,声明了一个单独的方法 sum,并给这个方法设置了一个超时时间2000毫秒,如果调用该方法的时间超过2000毫秒,就会忽略调用 sum 方法,直接返回上面设定的接口级别的3000毫秒的设置。2.Provider 标签配置清单interface、version、group、methodspecials与Consumer一致。(1)serializeType:可选配置,序列化的属性,默认为 hessian,一般无需调整(2)corePoolSize:设置服务核心线程池及对应属性,一般也无需调整(3)enableTXC:若客户需要开启分布式事务,则需要开启这个属性(4)ref:必须配置,为发布的 HSF 服务的 spring bean id(5)methodSpecials:声明方法的超时时间标签配置示例:<bean id="impl"class"com.taobao.edas.service.implSimpleServiceImpl"/><hsf.provider id="simpleService"interface="com.taobao.edas.service.SimpleService"ref "impl"version="1.0.1"group="test1"clientTimeout="3000">enableTXC="ture"serializeType="hession"><hsf.methodSpecials><hsf.methodSpecials name="sum"timeout="2000"/><hsf.methodSpecials></hsf.provider>相较于先前的 Provider 配置文件示例,多了 enableTXC 和 methodSpecials 属性。以上介绍了 Consumer 和 Provider 配置文件示例,仅部分标签需要开发者关注,其余标签根据实际应用场景参照架构师的建议使用。三、HSF jvm 参数(全局参数)配置1.-Dhsf.server.port指定 HSF 的启动服务绑定端口,默认值为122002.-Dhsf.serializer指定 HSF 的序列化方式,默认值为 hessian3.-DdefaultHsfClientTimeout指定 HSF 的客户端超时时间 ms,默认为30004.-Dhsf.server.max.poolsize指定 HSF 服务端最大线程池大小,默认值为600,一般情况下用户不需要调整,但如果要进行压力测试,可能需要将该值调大。实际生产过程中,如果-Dhsf.server.max.poolsize 超过600,一般是 HSF 启动端的业务逻辑出现了问题,即从 Consumer 调用的请求服务端不能及时处理导致超过默认值,说明需要开发者优化代码,找到解决方法,而非去加大该参数的值。5.-Dhsf.server.min.poolsize指定 HSF 服务端最小线程池大小,默认值为50
开发者学堂课程【企业级分布式应用服务 EDAS使用攻略:EDAS 应用部署、启动和停止】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/359/detail/4213EDAS 应用部署、启动和停止内容简介:一、启动应用二、停止应用一、启动应用应用创建好后进行发布应用。点击应用名称或者点击管理都可以进入到管理页面。第一部要部署应用。部署应用意味着已经开发好了一个 war 包。可以看到应用正在部署中。部署成功后启动应用的按钮就可以点了。应用发布了一个 shi.app 的一个服务,此时 Shi.app 服务需要指定一个分组。分组在服务市场,服务分组。首先,要创建服务组,然后才能发布,否则服务会发布不成功。创建完成后回到管理页面启动应用。可以看到应用正在启动中。查看服务列表可以看到,已经发布的服务。再点击组别,可以看到详情还有方法,参数和输出类型等等。二、停止应用停止应用,点击停止应用,即可以停止。查看服务列表中服务已经消失,因为应用已经停止。
开发者学堂课程【阿里云 API 网关使用教程:如何生成和使用 SDK】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/406/detail/5240如何生成和使用 SDK 内容简介一、sdk 的文档目录设置二、sdk 的使用如果是 API 的开放者的就可以在开放 API 的目录下面找到 sdk 文档,自动生成了这个页面。这里出现的 sdk 就是基于分组生成的,生成该某一个分组在线上所有 API 的 sdk。然后如果说是一个调用者,或者说自己要去通过 app 来认证的方式来测 API ,你可以在调用 API 的这个目录下找到一个应用管理的这个地方。然后我们点进去看一下应用管理。以 test 为例,它显示出来它已被授权的所有 API ,点击 sdk 生成链接。这里生成的 sdk 是这个应用所有已经被授权的这个 API 生成的 sdk ,里面包含 API 相关文档、库文件、说明文档、SDK 等 一、sdk 文档目录的设置目前 API 网关 JavaSDK 已在 github. 上开源需要注意的一-点是,所有 API 和文档都会按照 Group 分组。下文中所有出现的{{group}}都是指 API 所属 Group 的名称。代码文件的层级结构如下:●SDK 文件夹。sdk JavaSDK 文件夹,包含每个 Group 的所有 API 的接口调用代码■SyncApiClient {roup}java 包含对应 Group 所有 API 接口的同步调用方法■AsyncApiClient {{group}.java 包含对应 Group 所有 API 接口的异步调用方法●SyncDemo. <{roup}}java 同步调用示例代码●AsyncDemo {{group}.java 异步调用示例代码。doc。ApiDocument ({groupl}.md对应 Group 的 API 接口文档。lib■sdk-core-java-1.0.2.jar sdk 的core 包, 为本 sdk 的依赖包■sdk-core-java-1.0.2 sources.jar 上述依赖包的源码。Readme.md 本 SDK 使用指南。LICENSE 版权许可二、sdk的使用2.1环境准备1.阿里云 API 网关 Java SDK 适用于 JDK 1.6 及以上版本2.您需要准备-对授权密钥供 SDK 生成鉴权和签名信息,即 AppKey 和 AppSecret 重要提示: AppKey 和 AppSecret 是网关认证用户请求的密钥,这两个配置如果保存在客户端,请妥善加密。3. 在 pom.xml 中添加如下依赖把 pom 引入事先准备好的文件里2.2引入 SDK 的 API 接口调用类、1.把 sdk 文件夹中 AsyncApiClient *. java和SyncApiClient *. java文件复制到您的项目文件夹中;2.修正这些类文件的 package;2.3创建 ApiCllent要提交请求至阿里云 API 网关,您首选要创建一个 ApiCLient 对象。您可以参考(A)SyncDemo. *。java 中的示例代码,使用 newBuilder()获得一个ApiCLientBuilder 对象来构建您的 ApiCLient :我们对这个 API client 进行了初始化,就是这个 test client ,然后在正式调用的时候,需要把里面的 key 和 secret 换成自己 app 的对应的 key 和 secret。接下来我们就可以发起这个调用了,在 SDK 中会把每一个 API 都封装成一个方法。用这个 putbody 简单做一些演示,在数组地方输入一些参数,然后我们发起调用进行运行。
开发者学堂课程【阿里云 API 网关使用教程:如何调用 API】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/406/detail/5237如何调用 API调用 API 的三要素要调用 API 需要三个基础条件:1、AP:您即将要调用的 API , 明确 API 参数定义。2、应用 APP :作为您调用 API 时的身份,有 APPkey 和 APPsecret 用于验证您的身份。可以理解为是账号和密码,然后当请求 API 的时候呢,需要用这个 key 和 secret 来做一个签名计算,然后到达网关之后,网关会对这个请求者进行依据这个 key 和 secret 来进行那个身份认证和权限认证。(只要在云市场购买 API 服务,然后它就会自动给创建一个 app ,然后并且授权,就是方便用户的使用)3、API 和 APP 的权限关系:本 PP 想调用某个 API 需要具有该 API 的权限,这个权限通过授权的功能来建立。如果你是开放 API 的用户。需要有一方来操作这个授权,如果是开放API的用户,你同时有你的 API 和你的应用。那么就可以直接操作,把你的API授权给你的app了,如果你是一个使用者,你并没有自己的 API ,你要调用的是其他人的一篇,那么你需要把你的那个应用 ID 告知服务的提供者,让其来操作授权。4、操作授权:首先需要用应用 ID ,然后请这个服务的拥有者操做一下授权。(注意我们这个授权是分环境的,虽然把这个API 发布到了三个环境上。但只对线上的环境做了授权,应用在授权了线上之后,他对预发和测试仍不具备调用的权限)在应用详情里可以看到应用的基本信息这个页面有一个 sdk 文档自动生成的链接,然后我们可以在这个页面里生成在这个 app 有权有权调用的所有 API 的 sdk
开发者学堂课程【使用 API 扩展应用功能: 使用天气 API 在应用中添加天气信息】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/393/detail/5025使用天气 API 在应用中添加天气信息内容介绍:一、简介与相关资料说明二、订购获取易源天气 API 免费版使用权限三、编码调用 API 制作简单天气预报 H5 界面一、简介与相关资料说明易源数据作为一家专业的 api 数据提供商,在阿里云数据市场创建初期即合作入驻阿里云数据市场,见证并参与了阿里云数据市场的建设发展。是数据市场 api 使用人数最多、用户最为认可的服务商。我们发现在云市场 API 实际使用上还是缺少一个"HELLOWORLD"为更好服务于用户,特此制作包含完整 api 使用流程的演示"H5天气预报”二、订购获取易源天气 API 免费版使用权限(一)演示内容:·实操视频·讲解 PPT·H5 天气的源代码(请求 api 数据部分)与 demo(二)源码开发环境与相关技术框架:·开发环境:MacOS、Intellij IDEA、chrome·开源技术框架:PHP、Node、Webpack、Vuejs、Echarts、mint-ui 等等(三)获取流程:1.注册并登录阿里云2.到数据市场选购 API,这里为直接查看易源数据的天气预报 AP3.完成购买,这里为免费订购易源数据的天气预报 API4.在 api 测试界面确认订购授权有效,实际测试数据是否满足需求5.查看自己的密钥,准备着手开发测试(四)选购 API 注意事项:·数据是否满足业务需求·API 描述是否详尽清晰·API 的用户数量如何,一般用的多的在稳定性、易用性、服务上会好些·是否有额外的增值服务提供。比如易源数据提供额外的 SDK 、部分数据提供离线数据如股票历史等·用户评价如向·售前售后服务如何。例如有部分服务商客服旺旺长期不在线·API 价格因素考虑。这里需要注意 API 是复杂商品,不一定只看便宜。比如返回信息丰富、数据覆盖厂,调用灵活实用性强等都需要考虑·另外一定要实际测试货比三家。服务商一般都会提供免费或者便宜的测试套餐,可以在测试界面实际使用测试后在决定使用那家的三、编码调用 API 制作简单天气预报 H5 界面(一)demo 需求:●查询特定城市的天气预报●可以搜索添加城市到我的收藏●使用 H5 在手机上展示(二)调用易源天气 API 的数据:●查询地名对应的 id:用于搜索城市列表●id 或地名查询7天预报:用于获取天气预报信息(三)实现思路:1、利用 PHP 作为代理访问阿里云接口数据(阿里不支持跨域无法使用is直接调用,同时为了保密授权的 APPCODE ,所以需要 PHP 代理中转2、PHP 实现为通用代理(proxyAPl.php),透传所有参数,仅仅是添加 request 头 Authorization 用来做阿里鉴权3、考虑是 Demo 展示。PHP 尽量简单仅实现 GET 方式访问数据;is 部分将 API 数据 请求独立出来(apiStore.js)方便阅读理解 4、展现部分使用了 Vueis、Echarts、mint-ui 等 is 库5、使用 node、Webpack 打包应用header String 'Content-type: application/json;charset=utf-8 ’);//设置返回头$error = '{"showapi_res_code":-1,"showapi_res_error":“参数不对”};if(is_array($_GET) && isset($_GET["url"])}//判断请求中是否有接口地址参数{$url = $_GET["url"];$query = $_SERVER["QUERY_STRING"]; //取查询串$query = remove_querystring_var($query, key "url");//移除url参数 echo request (url $url. “?”.$query,$appcode);} else {echo ‘{"showapi_res_code":-1,"showapi_res_error":“请传入接口地址ur"}';}Scurl = curl_init();curl_setopt($curl, option:C LOPT_C STOM EQ EST,$method);curl_setopt($curl, option:C LOPT_ L, $url);curl_setopt($curl, option:C LOPT_HTTPHEADE , &headers);curl_setopt($curl, option:C LOPT_FAILONE 0 , Value false);curl_setopt($curl, option:C LOPT_ ET NT ANSFE , value true);curl_setopt($curl, option:C LOPT_HEAD , value true);return {weather:{ },//当前天气对象areaSearchList:[ ],//当前搜索地区的结果列表selected:'101290101,//默认显示昆明这里正式环境可以使用ip、gpsfavoriteArea:["prov": “云南”…}],//收藏的地区列表loadingWeather:false,//正在读天气的标示loadingSearchList:false, / / 在读搜索地区的标示loadError://读取错误信息methods:{getWeatherByAreaId[areaId]//返回异步请求的pro ise方便使用数据的地方处var ts=this;ts.LoadingWeather=truerequest({ url:"http://saweather.market.alicloudapi.com/area-to-weatherareaid:areaId || ‘101290101’,//地名参数 如果没有传默认使用昆明对应的needIndex:"1",//需要指数参数needMoreDay:"1"//需要7天天气参数}).done(function(data){if(data,showapi_res_code==0//接口系统正确let business=data.showapi_res_bodyif(business.ret_code==0){//接口业务成功business.day=business.fl.index;let index= 1,temp=[ ];while(true){var day=business['f' +(index++)];If(day){Temp.push(day);
开发者学堂课程【互联网安全-DDoS攻防原理及实战:DDoS 攻防之 HTTP Flood】学习笔记,与课程紧密联系,让用户快速学习知识课程地址:https://developer.aliyun.com/learning/course/356/detail/4191DDoS 攻防原理之 HTTP Flood内容介绍一、HTTP 协议二、HTTPS 协议三、SSL&TLS四、CC 攻击五、传统应用层防护原理六、移动 APP 防护难点七、HTTPS 攻击介绍一、HTTP 协议1.Hyper Text Transfer Protocol(超文本传输协议)2.HTTP 是基于 TCP/IP 协议的应用层协议。它不涉及数据包(packet)传输,主要规定了客户端和服务器之间的通信格式,默认使用80端口。3.平时使用的 web server 浏览器向 web 服务器发起 request 请求,由互联网上的各种 web server 对我们的请求进行应答二、HTTPS协议HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的 HTTP 通道,简单讲是 HTTP 的安全版。即 HTTP下加入 SSL 层,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要SSL。三、SSL&TLSTLS 是 SS L的新一代协议。(1)首先客户端会发起请求(a.支持的协议版本b.支持的加密及压缩算法 c.产生一个随机数 d.hello)(2)服务端对请求进行回应并将 a. 确定的加密协议版本及加密的算法 b. 服务器的证书c.服务器随机数 d.hello 回应给客户端。(3)客户端回应服务端的证书,使用证书中的公钥进行加密、编码然后通知服务端握手结束。(4)服务端生成秘钥,通知客户端编码改变、握手结束。(5)随后客户端和服务端就用对称加密方式进行数据传输。四、CC 攻击1.CC 攻击---普通的 http flood(1)CC 攻击是 http flood 的一种(2)CC 攻击利用代理服务器向网站发送大量需要较长计算时间的 URL 请求,如数据库查询等,导致服务器进行大量计算而很快达到自身的处理能力而形成 DOS。而攻击者一旦发送请求给代理就主动断开连接,因为代理并不因为客户端这边连接的断开就不去连接目标服务器。因此攻击机的资源消耗相对很小,而从目标服务器看来,来自代理的请求都是合法的。因为代理能进行正常的服务器响应。(3)攻击者发送大量的 HTTP flood 请求。受害者忙于对这些请求进行应答。消耗自己无法再对正常用户的 Http Get flood 请求进行回应,然后造成服务攻击。(4)攻击表象:利用代理服务器向受害者发起大量的 HTTP get 请求。主要请求动态页面,涉及到数据库访问操作。数据库负载以及数据库连接池负载极高,无法响应正常请求。2.CC 攻击二---代理发起的 http flood如图就是一个模拟代理发包,可以填域名,端口号,填间隔、填总数,填伪造的 IP 地址,然后发包。代理攻击原理:攻击者向大量的服务器发送请求。然后由代理服务器转向受害者进行请求,受害者无法承受如此多的请求,而失去响应。3.CC 攻击三---僵尸网络的 http flood跟代理服务器发起的 HTTP,get 相比,由僵尸控制的攻击端破坏性更大,发出的攻击更加真实和复杂,因为他是他是以所有的僵尸网都作为真实的请求源,黑客可以自定义的类型更加的丰富。大量的僵尸网络 IP 地址向受害者发起攻击。4.CC攻击四---变异 CC 和轮回 CC 有几种攻击方式:(1)无限 CC:循环的请求某些页面。(2)动态 CC:专打 ASP PHP 等动态页面。(3)无缓冲 CC:穿透 cache(4)HTTP 空 GET 请求:不请求 URL。(5)循环下载 CC:使用真实的协议栈循环下载文件。5.CC 攻击五---循环下载文件循环下载文件工具软件示例:指定某个 URL 下载指定文件。左下侧是攻击协议方式6.CC 攻击六--- ARME FLOOD利用 web 服务器漏洞进行攻击,攻击程序会给被攻击的 APACHE 发送一个报文,它的 RANGE 字段为依据协议,服务器必须对这个报文的每一个 R ANGE 都要使用multipar/byterange 作出回应,导致服务器的资源被耗尽。7.CC 攻击七---利用爬虫 get 请求用户打开 web 标签时,Google 等爬虫就会去抓取大文件,把这些文件指定到被攻击者的服务地址上去,也会对被攻击的 web 服务器进行大量的抓取,导致 web 服务器遭受攻击。8.CC 攻击为什么难防?(1)对于攻击:①因为 CC 攻击来的 IP 都是真实的,分散的。②CC 攻击的数据包都是正常的数据包。③CC 攻击的请求,全都是有效的请求,无法拒绝的请求。(2)对于业务:①防 CC 的办法就是封 IP,有可能封掉正常访问用户的 IP②防 cc 的算法要么挑战(挑战就是二次验证,来表明它是正常的访问口端),要么限速,都可能影响体验,爬虫,和在线实时性③防护的源随机,离散,难以用单体设备的方案存储如此大的数据。④客户体验与终端误判,是 CC 攻击的防御难点。(3)Port 80和443里面的业务比我们想象的要复杂80端口是 http 协议的默认协议端口,443端口是 https 协议的默认协议端口五、传统应用层防护原理1.浏览器向服务端发送请求,服务端并不直接回答而是发出一个问题,然后客户端来回答,服务端认可以后向客户端发出可以访问的通知,客户端正常访问交互。2.僵尸网络:攻击者向服务端发送请求,对于服务端发出的问题,攻击者只会发出 get 请求而不会对二次验证进行处理。3.在验证页面,防护设备会使用 JavaScript 等脚本语言发送一条简单的运算请求,或者在验证页面生成一个验证码,以检查访问请求是否由真实的浏览器/用户发出的六、移动 APP 防护难点1.在移动 APP 中,http 支持的协议是不完整的,对服务端的跳转、计算等等都不是特别完备,很多请求协议都不能做出响应。如果在在这个时候开启防护可能对 APP 造成误杀2.当移动 APP 接口遭到应用层 DDoS 攻击时,如果不开启防护设备,则大量的僵尸程序请求会耗尽服务器资源,导致正常应用请求访问缓慢或无法访问;而如果开启防护设备的现有防护方法,则会直接将正常应用的访问请求当作僵尸程序发起的请求丢弃,正常用户依然无法访问。七、HTTPS 攻击介绍目前针对 HTTPS dos 的攻击主要由传统的 tcp ddos 和针对 ssl 协议的 dos;已知的针对 ssl 协议的 dos 有:(1)pushdo 僵尸:建立 tcp 连接后,就向 ssl 服务器发送大量垃圾报文,以此消耗服务器的计算资源(2)Thc-ssl-dos 工具:在同服务器完成 ssl 握手后,立即发送重协商请求,在重协商结束后,再次发送协商请求,如此已知继续,造成 dos。如果服务器禁止了重协商,则建立多个或多次连接,以和服务器进行多次ssl握手,消耗服务器资源。(3)Thc-ssl-dos 攻击概述攻击过程分析:在上述报文的交互过程中,可以清晰地看到 SSL 服务器的资源如何在被耗尽。SSL 客户端通过发送一条 clienthello 消息来初始化一次新的握手,该消息大约100字节左右,不需要加密。 服务器端响应 clienthello 消息需要连续发出三个消息,server hello、certificate、serverhellodone ,这三个消息一般在3000字节左右,需要用高级加密标准 AES 或流加密算法簇 RC4 进行加密后再发送。每次重握手,ssl 服务端发送的数据比客户端多了30倍,同时还要进行加密,从而导致服务端 CPU 计算资源大量占用。
开发者学堂课程【精通 Spring Cloud Alibaba:注册中心设计 Ap 与 CP 区别】学习笔记,与课程紧密联系,让用户快速学习知识课程地址:https://developer.aliyun.com/learning/course/634/detail/1009注册中心设计 Ap 与 CP 区别内容简介:一、 Nachos 与 Eureka 区别二、面试过程中面试官会问到注册有哪些?一、 Nachos 与 Eureka 区别最大区别:Nachos 支持两种模式 CP/Ap 模式,从 Nachos1.0版本开始,注意模式就是 Ap 模式。首先下列地址是Nachos不同版本升级的具体介绍https://github.com/alibaba/nacos/releases就视频中当前最高版本是1.1.4版本(是在2019年10月24日发布的)现已经更新到2.0.3版本,更新日期为2021年7月28日。(1)1.1.4(2019.10.24)#182运行状况检查字段和保护阈值混淆#1409与 Istio 作为服务发现后端集成#1507建议 shutdown.sh 脚本仅关闭当前目录中的节点,而不是所有节点。#1665 DataSync 始终未在网络分区#1671"客户端版本"标头未在来自 nacos 客户端#182运行状况检查字段和保护阈值混淆#1409与 Istio 作为服务发现后端集成#1507建议 shutdown.sh 脚本仅关闭当前目录中的节点,而不是所有节点。在此处设置新的线程池,但不打开通告程序任务,是否添加 executor.execut(new Notifier());(2)查看1.0.0版本这是 Nacos 的 GA 版本,可以投入大规模生产环境。我们在此版本中引入了几个重要的新功能和优化,其中大部分已在以前的 RC 版本中发布。我们花了大约一个月的时间来稳定和优化这个 GA 版本,其中我们修复了几个错误并适应了一些默认行为。我们还进行了压力测试,以测量Nacos的性能和容量。即将发布一篇文章,介绍 Nacos 1.0.0带来的变化细节,请关注我们的聊天组和邮件列表。 [#1041]Nacos 1.0.0 识别 Nacos 0.8.0 的数据文件[#1033]nacos 控制台实例数和集群数异常。[#1029]nacos dubbo 双重消费者注册错误[#1008]NullPointerException 发生在群集初始化而不设置 dom 时 [#998]将"服务器模式"更改为"实例默认值" [#986]属性使用可能无法关闭流[#981][通知]Nacos 集群管理在 Apache SkyWalking 中被拒绝实现[#974]ArrayIndexOutOfBoundsException 可能会在调用 taskDispatcher.addTask 时引发 [#973]cluster.conf 文件句柄未释放[#961]"checkTask NPE"在群集未初始化时发生[#948]Api GET /实例应返回 404(如果未找到匹配的 ip)[#946]将默认服务器模式更改为 AP[#938]客户端击败处理器任务丢失[#923]Nacos 1.0.0 兼容 nacos-client 0.5.0[#911]添加保留的元数据键[#910]持久性实例不应发送客户端节拍[#870]关于 Nacos 的命名空间和租户设计[#869]客户端异常消息令人困惑 [#866]BeatInfo 计划属性可能存在内存可见性问题[#865]校验和值不正确[#839]重构 API 网址 [#811]ApiCommands.updateIpPublish countDownLatch 超时问题[#809]实例字段"有效"应弃用并替换为"正常"[#803]纳科斯前端功能回归计划及落地 [#801]Nacos 使用 nignx 作为电流限制的最佳实践文章。[#757]"域"一词应替换为"服务" [#745]支持 CP、AP 或混合服务器运行模式[#744]应存储和控制服务器的确切状态[#725]nacos 注册表会如何进行多环境部署吗?[#677]支持临时实例和持久实例[#651]删除旧的 API 条目"API命令"[#650]重构服务器列表管理以使其与一致性协议无关[#634]增加全局一键使能开关和数据查询使能开关[#629]服务器数据需要在开放流量之前预热[#502]注册临时实例以及持久性实例 [#501]构建 muilt 集群时运行状况检查模式配置 whit nacos sync + nacos[#479]应使用标准属性语法显示和编辑元数据[#327]通知 ACM 开发工具包 RAM 角色名称并访问配置 ?[#269]需要在命名模块中支持服务组[#745]支持 CP、AP 或混合服务器运行模式的详细介绍:CP 模式提供强一致性、数据持久性但网络分区容错能力。AP 模式提供最终一致性和网络分区容错性,但提供数据持久性。混合模式为某些数据提供 CP,为其他数据提供 AP。服务级别信息和群集级别信息始终通过 CP 协议进行操作,因此在 AP 模式下无法对其进行编辑。 二、面试过程中面试官会问到注册有哪些?Eureka、Necos、concul、Zookeeper面试官主要会问到的核心:1.Eureka 与 Zookeeper 实现注册的区别?2.Eureka 与 Zookeeper 实现注册的区别?在明白上述区别之前,需要先了解一些概念:A. CAP定律概念:一致性(C):在分布式系统中,如果服务器是集群的情况下,每一个节点同一时刻查询的数据必须保持一致性的问题。就下图所示,左边的为主,右边的为从。需要先进入到主,在从主进入到从,同步的过程中存在延迟,在保证一致的情况下,主和从都在做读,必须保持他们都是正确的,不能错误,一旦出现错误的情况说明违背了一致性原则。可用性(A):集群节点中,部分节点出现了故障后仍然可以继续使用。当左侧第一个出现问题后,就可以转移到中间的。分区容错性(P):在分布式系统中网络存在脑裂的问题,部分的 Serve 与整个集群失去联系无法形成一个群体。在了解分区容错性之前,我们先了解脑裂,假设在 Zookeeper 当中一个zk1,一个zk2,,以及zk3,正常情况下,在这三个中只会有一个节点是主节点,这是一主多从的,但这时有一个 zk2领导,突然有一个网络分区,有时候所在的服务区节点不可能在同一个地区里面,可能跨地区、跨网络,这就会导致在后面两台 zk3、zk3的节点可能访问不到 zk2领导的节点中,这就会导致在整个集群当中有多个集群,这就是一个错误。所以说分区容错性几乎是无法避免的,在这中结果下,我们只能选择取舍,取舍:只有在 CP/AP 平衡点。采用:Cp 情况下 虽然我们服务不能用给,但是必须要保证数据的一致性。Ap 情况下 可以短暂保证数据不一致性,但是最终可以一致性,不管怎么样,要能够保证我们的服务可用。一般情况下,大多数的注册中心都是Ap。
开发者学堂课程【实时数仓 Hologres 实战课程: 快速上手 Hologres(一)】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/904/detail/14389快速上手 Hologres(一)目录:一、如何购买 Hologres二、Hologres 的一些基本操作三、Hologres 相关概念四、连接工具五、创建基本表六、Hologres 数据类型简介七、Hologres 常见的基本设置八、性能调优实操演示一、如何购买 Hologresl 登录阿里云官网:aliyun.com/l 搜索交互式分析产品便可以找到 Hologresl 进入到 Hologres 购买产品页面后用户需要选择自己购买的商品类型(包年包月:按量付费)l 选择相应的地域,将与在阿里云购买的其他产品放在同一个地域下,如此有益于将数据传送造成的损耗降到最低,提高系统性能。l 用户需要根据自身的实际情况来选择对应的规格(服务器有提供多种规格)l 购买的最后一步,用户在购买页面输入一个实例名称便完成了整个购买流程。二, Hologres 的一些基本操作(1)如何查看购买的 Hologres?回到交互式分析页面,点击管理控制台 (2)进入管理控制台后,用户可以进行哪些基本操作?可进行的操作如下:Ø 管理² 实例配置(查看用户信息)² 用户管理(添加和删除用户操作)² DB管理(查看已经创建的类和进行一些基本操作)² 监控告警(查看实例的实时使用状况,如 CPU 用量和实例内存用量)Ø 升配Ø 减配Ø 清除Ø 续费三, Hologres 相关概念l 实例∶使用和管理数据库存储服务的实体,一个实例可以看作是多个数据库的合集l 数据库︰一个模式的合集,用户所有的操作,包括表、函数等都是在数据库里完成。系统会在用户完成实例申请后默认创建一个"postgres"的数据库,该 DB 仅用于运维管理,实际业务需要新建DBl 表∶表是数据存储单元。它在逻辑上是由行和列组成的二维结构,列的数量和顺序是固定的,并且每一列拥有一个名字。行的数目是变化的,它反映了在一个给定时刻表中存储的数据量。l 外表:外表是数据实际存储在其他系统里,但是通过 Hologres 来访问的一类表。Hologres 完全兼容 postgres 的 foreign data wrapper。目前内部支持直接访问 MaxComputer 中的数据四, 连接工具Hologres 兼容 PostgresQL 生态,提供 JDBC/ODBC Driver,可以连接 PG 的开发工具都能直接连接 Hologres,也提供 Holostudio 和 HoloWeb 开发平台。Hologres SQL 概览Hologres 的 SQL 目前兼容开源的 PostgresSQL 11,因此用户可以参照 Postgres 官方文档来编写自己的查询任务https://www.postgresql.orgldocs/11/index.html 五,创建基本表创建表Hologres建表语句是PG的一个子集CREATE TABLE [IF NOT EXIST5] [ schema_name.]table_name ( [column_name column_type [ column_constraints,[...]]l table_constraintsl , ...])]) ;一个简单的创建表的例子如下:CREATE TABLE IF NOT EXISTS holo_test(name text,ds text,age text,price floatPRIMARY KEY ( name));分区表的创建l 分区表的创建依然兼容 Postgres 语法,分区表方便用户管理数据,并能通过分区裁剪加快数据的查找l 不能向父表插入任何数据l 只有 text/varchar 类型才能作为分区健l partition by 类型仅支持 list,切 partition list 只能有一个值l 分区表的数据不会自动删除,需要用户自己管理生命周期 begin;drop table if exists HOLO_NULTI_PART;create table HOLO_MULTI_PART(id text not null,pt text not null) PARTITION BY LIST (pt);create table HOLO_MULTI_PART_0 partition of HOLO_MULTI_PART FOR VALUES IN ( '0');create table HOLO_MULTI_PART_1 partition of HOLO_MULTI_PART FOR VALUES IN ( '1');create table HOLO_MULTI_PART_2 partition of HOLO_MULTI_PART FOR VALUES IN ('2');create table HOLO_MULTI_PART_3 partition of HOLO_MULTI_PART FOR VALUES IN ('3');create table HOLO_MULTI_PART_4 partition of HOLO_MULTI_PART FOR VALUES IN ( ' 4 ');commit; 六,Hologres 数据类型简介数据类型:数据类型别名是否支持存储大小范围说明integcrint,int4支待4字节-2147483648到+2147483647常用的整数bigintint8支持8字节-9223372036854775808到+9223372036854775807大范园整数boolcanbool支持1字节Truo / Falsc布尔类型floatfloat8支持8字节15位十进制敌字精度可变精度。不精确double precision 支持8字节15位十进制数字精度可变精度。不精确textvarchar支持可变长 可变长度字符串timestampt with time zonetimestamptz支持8字节4713 BC 到294276 AD时间戳,包含时区,解析度为1微妙/14位数。示例:“2004-10-1910:23:54+02"DateDate支持4字节4713 BC到5874897单位是一天DecimalNumeric支持可变长小数点前38位;小数点后38位需要指定precision,scale信息
开发者学堂课程【Java Spring Boot 2.6.0开发实战-1024程序员节创造营公益课:使用 MongoDB 搜索附近的人】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/903/detail/14341使用 MongoDB 搜索附近的人目录:一, MongoDB 在生活中的应用二, LBS 搜索附近的 X-解决方案三, LBS 搜索附近的 X-Redis 支持四, LBS 搜索附近的人-MongoDB 支持五, LBS 搜索附近的人—MongoDB 支持 GEO 索引六, 搜索附近的 X—SpringBoot+MongoDB 解决方案七, MongoDB 简介八, Repository 仓储层代码九, Spring Data 2.6 MongoDB 新特性十, 代码实操演示 前言:MongoDB 在生活中的应用MongoDB 可以直接用于存储当前用户或者测量的经纬度。生活中的实例:如美团,高德地图,滴滴打车,哈喽单车,饿了么等等。 一, LBS 搜索附近的 X-解决方案应用技术:1.LBS 基 1B2.MongoDB3. Redis4.Elastic Search5. MySQL: SPATIAL INDEX6. Postgresql PostGis 索引GEO 算法实例:1. Geohash,地图分割不同区域,二维坐标生成一个字符串 二,LBS 搜索附近的 X-Redis 支持1. Redis 3.2提供了基于 GeoHash 和数据结构 Zset 地理位置功能2.GEOADD:新增位置(纬度、经度、名字)添加到指定的 key;3. GEOPOS:从 key 里面返回对象的位置(经度和纬度);4.GEODIST:返回两个给定位置之间的距离;5. GEOHASH:返回一个或多个位置对象的 Geohash 表示;6. GEORADIUS:以给定经纬度为中心,半径内所有位置对象;7.GEORADIUSBYMEMBER:以给定的对象为中心,半径内所有位置对象。8. Redis 6.2版本为 Geo 新增了 GEOSEARCH 和 GEOSEARCHSTORE 指令,阿里云矩形区域查询三,LBS 搜索附近的人-MongoDB 支持1.MonaoDB 主要两种地理空间索引 2dsphere 和 2d。2.两种索引的底层依然是基千 Geohash 来讲行松建的3.值与国际通用的 Geohash 还有一些不同,具体参考官方文档。4.2dsphere 索引仅支持球形表面的几何形状查询。5. 2d 素引支持平首几石形状和二些球形誉询.6.2dsphere 索引和相应的操作符来寻我附近的人7. geoNear 命令搜索附近的点8. GeoJSON 对象类型存储位置信息经纬度信息,支持类型:9. Point 点10.LineString 线11.Polygon 多 形12.MuitiPoint 多点13.MultiLineStrina 多线14.MultiPolvaon 多面体15.GeometryCollection 地理集合 四,LBS 搜索附近的人—MongoDB 支持 GEO 索引1. GEO 地理数据相关的索引有两种 2dsphere 和 2d2。2d 支持平面搜索,2dsphere 主要支持球面3.地理位置存储为 GeoJSON Point 类型4. $geoNear 用于聚合查询5.普通查询6. db.createCollection("users")7.db.users.save( { _id: "jack", position: [0.1121-0.1211]})8. db.users.save( {_id: "musk" , position: [1.1231,1.12312]})9. db.users.ensurelndex( {position: "2d"})10.db.users.find( {position: { $near: [0,0], $maxDistance:10 })五,搜索附近的 X—SpringBoot+MongoDB 解决方案l l org.springframework.bootl spring-boot-starter-data-mongodbl /***2D圆形查询,geoNear查询点附近的所有车辆,指定半径*@param pint中心点*@param radius半径,米*@param limit限制数量*@return*/public List geoNearQuery(Point point,double radius,int limit) {List result =mongoTemplate.find( new Query(criteria.where( "location").near(point).maxDistance( radius)).limit( limit),carInfo.class);return result;} 六,MongoDB 简介1. NoSQL 排名第一,BAT 互联网公司必备2.分布式数据库,3. 由 C++语言编写,特点是高性能、易部署、易使用、存储数据非常方便,4.旨在为 Web 应用提供可扩展的高性能数据存储解决方案5. MongoDB 由10gen 团队所开发,于2009年2月首度推出6. MongoDB 开源、跨平台7.支持 Windows、Linux、OS X 和 Solaris 系统8. MongoDB 最新版本为4.0,支持跨文档事务MongoDB 优点示意图:七,MongoDB版本特性版本关键特性建议2.Xindex、writeConcern、readPreference强烈建议升级3.0Pluggable Storage Engine、Wiredtiger. improved mmapv1建议升级3.2Raft协议、文档校验、部分索引、inMemory. $lookup建议升级3.4并行复制、sharding迁移改进、collation、$facet. $graghLookup强烈建议使用3.6安全、并行性能、$lookup、Online 维护(在线添加认证)已经发布4.0分布式事务Transaction已经发布 八,Spring Data 2.6 MongoDB 新特性1.简化 Java 的 MongoDB 数据库开发 API2.提供一致的基于 Spring 的编程模型3. Spring configuration 支持 @Configuration classes or an XML namespace4.方便编写 Repository 仓储模式的 DAO 层代码5.自动实现 Repository interface 的 CRUD 常 用操作6.自动进行 POJO 和 MongoDB 文档数据的映射转换, Spring’s Conversion Service7.可以自定义扩展方法8. MongoTemplate helper class 提升 MongoDB 开发效率9. Low-level mapping using MongoReader/MongoWriter abstractions10.Java based Query,Criteria, and Update DSLs11.Log4j log appender12.Geospatial 集成13.Map-Reduce 集成14.JMX administration and monitoring15.CDI support for repositories16.GridFS 支持 九,Repository 仓储层代码public interface BlogRepository extends MongoRepository {public Blog findById (objectId id);public void delete(objectId id);public List findAll();} 十,代码实操演示首先加入 MongoDB 的依赖:org.springframework.bootspring-boot-starter-data-mongodb2,去 MongoDB 官网下载 MongoDB网址为 MongoDB.com选择社区版的 MongoDB(MongoDB Community Server)下载完之后可以在 Windows 上直接启动使用进入 bin 目录找到 mongo.exe(客户端命令)mongod.exe(MongoDB 的数据库服务命令),mongos.exe (路由器)如何启动 MongoDB?打开命令行界面:先进入 MongoDB 的 bin 目录(cd\ MongoDB\bin)后:输入一下指令:mongod.exe--port 27017 --dbpath="../data"--logpath= "../log/mongo.log注:linux 和苹果操作系统与 Windows 的操作同理在命令行界面输入一下指令可查看当前持有的数据库:show dbs在Maven Dependencies 中可添加对应的 MongoDB 修改包 :1 spring.application.name=SpringBoot260Demo2 server.port=80883 spring.datasource.url=jdbc:mysql://localhost/alibaba?useSSL=false&serverTimez4spring.datasource.username=root5 spring.datasource.password=1234qwer6spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver7spring.jpa.databaseplatform=org.hibernate.dialect.MySQL5InnoDBDialect8#mongodb9 spring.data.mongodb.database=alibaba10 spring.data.mongodb.host=localhost11 spring.data.mongodb.port=27017212 #spring.data.mongodb.username=root13 #spring.data.mongodb.password=1234qwer自定义数据仓://实体类代码展示package com.alibaba.entity;import java.io.Serializable;口@Document(collection = "carInfo")@CompoundIndexes({@CompoundIndex(name = "location_index" , def = " { ' location': '2d'}"),})public class CarInfo implements Serializable{/**车辆*/@Idprivate int id:Ipublic int getId() {return id;}public void setId(int id) {this.id = id;}/****/private static final long serialVersionUID = 1L;/**车辆*/private String car;/**经度*//**纬度*/private Double [] location;public string getcar() {return car;}Ipublic void setcar( String car) {this.car = car;}public Double [] getLocation( ) {//启动器代码展示package com.alibaba;import org.springframework.boot.SpringApplication;@SpringBootApplicationpublic class JavaSpringBoot25x14MongoDb4GeoDemoApplication {public static void main(string[] args){SpringApplication.run(JavaSpringBoot25x14MongoDb4GeoDemoApplication.java}}//controller 层代码展示//找到对应的接口package com.alibaba.api;import java.text.DecimalFormat;口@slf4j@RequestMapping( "/cars")@RestControllerpublic class CarController {@Autowiredprivate MongoTemplate;@GetMappingpublic String helto() {ireturn "Hello Java Spring Data MongoDB GEO";}@RequestMapping( " /batchupdate")public long batchUpdate() {double lat = 31.228493791366265;//维度double lon = 121.47538375749718;//经度Long nowTime = System.currentTimeMillis();for (int i = 0; i < 1000; i++) fList listCarInfo = new ArrayList<>(10000);Long nowTime] = System.currentTimeMillis();for (int j = 0; j < 1000; j++) {double max = 0.01;double min = 0.000001;Random = new Random();double s = random.nextDouble() %(max - min + 1) + max;DecimalFormatdf=new DecimalFormat("###1##0.000000");l/ system.out.println(s) ;来到浏览器进行测试:输入 localhost:8001/cars/save查看是否能够查询成功在命令行界面输入一下指令查看信息:>use Alibaba>show tables>db.CarInfo.cound()回到 Eclipse 查看后天是否返回了以下信息:更新100万汽车位置耗时:49555ms更新100万汽车位置耗时:44056ms可以在 entity 包中创建多个实体类进行测试:如创建 User,CarInfo在 controller 层中创建 UserController在 controller 层中创建 CarInfoController课后推荐:高级面试题1. Spring Data for MongoDB 映射机制2.官方驱动是什么3. MongoDB 存储什么数据? NoSQL,面向文档 JSON4. MongoDB 优缺点5.MongoDB 几大存储引擎6.数据复制的过程7.索引类型8.性能优化9.性能监控10. GEO 索引算法
开发者学堂课程【Elasticsearch 实战进阶营:实操讲解:微服务运行状态监测(二)】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/899/detail/14321实操讲解:微服务运行状态监测(二)三、Elastic Stack 技术栈1.主要概述图早期 Elastic Stack 名为 ELK,对应 Elasticsearch,Logstash,Kibana 这三个开源软件,但由于在做日志收集时 Logstash 过于重量级,因此官方又开发了各种 Beat 组件,比如 FileBeat,PackBeat 等等。随着这些角色的加入 ELK 更名位 Elastic Stack。Elastic Stack 组件的主要优点有如下几个:(1)处理方式灵活:Elasticsearch 是实时全文索引,具有强大的搜索功能。(2)配置相对简单:Elasticsearch 全部使用 JSON 接口,Logstash 使用模块配置,Kibana 的配置文件部分更简单。 (3)检索性能高效:基于优秀的设计,虽然每次查询都是实时,但是也可以达到百万级数据的查询查询秒级响应。(4)集群线性扩展:Elasticsearch 和 Logstash 都可以灵活线性扩展。 (5)前端操作绚丽:Kibana 的前端设计比较绚丽,而且操作简单。为什么要用 Elastic Stack 组件?Elastic Stack 组件在海量日志系统运维中,可以用于解决以下主要问题:(1)分布式日志数据统一收集,实现集中式查询和管理;(2)故障排除;(3)安全信息和事件管理;(4)报表功能;Elastic Stack 在大数据运维系统中,主要可解决的问题如下:(1)日志查询,问题排查,故障恢复,故障自愈;(2)应用日志分析,错误报警;(3)性能分析,用户行为分析; 四、Elastic+kibana 自有环境1、动手配置自己的 ES 运行环境(1)准备好环境## ############并并Heartbeat Configuration Example #并# ## ##并####### # ## ##并##并井is file is an example configuration file highlighting only some common options。# The heartbeat. reference .yml file in the same directory contains all the supported options# with detailed comments. You can use it for reference。## You can find the full configuration reference here ;# https://www. elastic。co/ guide/ en/ beats/ heartbeat/ index。html######## ###井林## ### ###井#井####井Heartbeat ###井 ### ##井并井### ## # ####并##井井林##井#并##井并井# Define a directory to load monitor definitions from. Definitions take the form# of individual yaml files. .heartbeat . confi配置节点be loaded.type: http # monitor type http 。Connect via HTTP an optionally verify response # Monitor name used for job name and document typename: eurekat Enable/Disable monitorenabled: true# Configure task scheduleschedule: ' @every 5s' # every 5 seconds from start of beat# Configure URLS to pinghosts: ["http: //1ocalhost:8020"]# Configure IP protocol types to ping on if hostnames are confi gured。# Ping all resolvable IPs if" mode is" all^ ,or only one IP if mode is" any.ipv4: true ipv6: trueImode: any# Optional HTTP proxy url.#proxy_ url: '# Total test connection and data exchange t imeout#timeout: 16s# Optional Authentication Credentials#uS ername :g。monitors :I# Directory + glob pattern to search for configuration filespath: ${path . config}/ monitors .d/* . yml# If enabled, heartbeat will periodically check the config . monitors path for changesreload. enabled: true# How often to check for changesreload.period: 5s# Configure monitors inline# heartbeat 。monitors ;# - type: http# List or urls to query# urls: ["http://localhost:9200" ]# Configure task schedule# schedule:" @every 10s输出地要到 es 里面2nd2no yse2s807 -“unKTe@ypJeasoTaseT3. :pJomssedDTiSeTan:aweuuasnwKey Tde:pTm :Kax τde#”pJomssed/aweuJasn JO Kay IdV JB42τa 一sTeTauapaJs uoTaesT2ua4any #sd224u : To5020Jd#、 sd224. JO (T安全地址nefep) d224、Ja47ta - TODO10Jd #[.00Z6 :wO2. sounAtte "ypJeasotaseta'ottand. ZUMnTOOOUUMJATMa0-U2-sa.] :s2soy02 23auUOS of S2Soy 4o KeJuy #:ypJeasoTaseTa "2nd2noandzno ypueasoTset3 ---# You can find the full configuration reference here :# https:/ /www. elastic。co/ guide/ en/ beats/ heartbeat/ index. html##########################并并并Heartbeat ###并 ###井#井# # ## ## #井# # # # ## ## ### # # #并# ##### Define a directory to load monitor definitions from. Definitions take the form# of individual yaml files。heartbeat。config。monitors :# Directory + glob pattern to search for configuration filespath: ${path. config}/monitors . dA . yml# If enabled, heartbeat will periodically check the config 。monitors path for changesreload .enabled: true# How often to check for changesreload. period: 5s# Configure monitors inline# heartbeat 。monitors ;# - type: http# List or urls to query# urls: ["http://localhost:9200"]# Configure task schedule# schedule:" @every 10s# Total test connection and data exchange t imeout#timeout: 16s# These files contain a list of monitor confi gurations identical# to the heartbeat。monitors section in heartbeat。yml# The 。example extension on this file must be removed for it to# be loaded 。type: http # monitor type http^ 。Connect via HTTP an optionally verify res ponse# Monitor name used for job name and document typename: eureka# Enable/Disable monitorenabled: true# Configure task scheduleschedule:' @every 5s' # every 5 seconds from start of beat# Configure URLS to pinghosts:| [ "http://localhost:8020"]并Configure IP protocol types to ping on if hostnames are configured .# Ping all resolvable IPs if mode i Sall,or only one IP if" mode is" any.ipv4: trueipv6: truemode: any# Optional HTTP proxy url.#proxy_ url:并Total test connection and data exchange t imeout#timeout: 16s主要配置顶# cluster 集群配置cluster.name: dmall_ test_ es #名字自己起,确保集群名不同cluster. initial_ master_ nodes: ["ip:port"] #初始主节点的ip和端口,填你本机ip,默认端口是9300network.host: ip #填你本机iphttp.port: 9200#绑定到传入HTTP请求的端口默认是9200transport. tcp.port: 9300 #端口绑定节点之间的通信默认是9300#该配置十分重要,没有正确配置,可能无法构成集群#这是一个集群中的主节点的初始列表,当节点(主节点或者数据节点)启动时使用这个列表进行探测discovery. zen. ping. unicast.hosts: ["ip:port"] #端口一般填 TCP 端口,如9300#以下两个配置,可能不配置也可以xpack. security . enabled: false #没置为 true 则在节点上启用 X-Pack 安全特性,false 表 示禁用 X-Pack 安全:xpack. security. transport. ssl.enabled: false #xpack ssl 配置,设置成 false 就可以。出现以下结果,代表运行启动正常"name" : "6LUo_ Ih","cluster_ name" :"elasticsearch","cluster_ uuid" : "tnCuoQs9RQOTkDevKI4y6Q" ,"version”: {"number" : "7.5.1"."build_ flavor" : "default","build_ type”: "tar","build_ hash" : "1fad4e1","build_ date”: "2019-06-18T13:16:52.517138Z","build_ snapshot" : false,"lucene_ version" : "7.7.0","minimum_ wire_ compatibility_ version" : "5.6.0","minimum_ index_ compatibility_ version" : "5.0.0"},"tagline" : "You Know, for Search"启动 kibana2nd2no yse2s807 -“unKTe@ypJeasoTaseT3. :pJomssedDTiSeTan:aweuuasnwKey Tde:pTm :Kax τde#”pJomssed/aweuJasn JO Kay IdV JB42τa 一sTeTauapaJs uoTaesT2ua4any #sd224u : To5020Jd#、 sd224. JO (T安全地址nefep) d224、Ja47ta - TODO10Jd #[.00Z6 :wO2. sounAtte "ypJeasotaseta'ottand. ZUMnTOOOUUMJATMa0-U2-sa.] :s2soy02 23auUOS of S2Soy 4o KeJuy #:ypJeasoTaseTa "2nd2noandzno ypueasoTset3 ---# You can find the full configuration reference here :# https:/ /www. elastic。co/ guide/ en/ beats/ heartbeat/ index. htmlpath: ${path. config}/monitors . dA . yml# If enabled, heartbeat will periodically check the config 。monitors path for changesreload .enabled: true# How often to check for changesreload. period: 5s# Configure monitors inline# heartbeat 。monitors ;# - type: http# List or urls to query# urls: ["http://localhost:9200"]# Configure task schedule# schedule:" @every 10s# Total test connection and data exchange t imeout
开发者学堂课程【Elasticsearch 实战进阶营:实操讲解:微服务全链路调用监控(一)】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/899/detail/14318实操讲解:微服务全链路调用监控(一)目录一、微服务全链路概念二、微服务全链路背景三、微服务全链路性能优化四、微服务全链路优势和覆盖范围五、APM 架构体系介绍六、Serve 实战配置和启动七、Agent 实战配置和启动 一、微服务全链路监控概要介绍1. 概念在微服务架构下,分布式系统变得日趋复杂,越来越多的组件开始走向分布式化,如微服务、分布式数据库、分布式缓存等,使得后台服务构成了一种复杂的分布式网络,这样一个场景下,对于用户的每一次请求调用,后端执行了多少组件间的调用无法知晓,由于分布式的调用,增加了程序调用异常的错误率,在这样的应用场景下,新的架构技术带来了新的问题。APM 主要通过从客户端和服务端进行数据采集。其中客户端数据采集方式主要分为主动式探测(俗称“拨测”)和被动式监测。相比主动式的模拟监测,真实用户体验监测可以提供全样本监测数据,避免样本偏差。服务端的数据采集都是被动方式,主要两大技术路径分别是 NPM (网络性能管理)和探针部署。NPM 属于非侵入式的技术,不会对应用性能造成影响,然而不能提供代码及的问题定位;探针部署则反之。 2. 背景随着软件开发技术架构的不断演进,采用诸如 TSF 微服务框架开发微服务已经成为一种趋势,然而随着客户业务流量的不断提升,微服务也会遇到性能上的瓶颈,对于系统如果做到高效、稳定保障系统平稳支撑业务增长,是我们需要面对的技术难题。3.性能优化(1)降低业务成本。(2)提升系统的稳定性。(3)提升用户的体验。4.优势(1)背后是 elasticsearch 集群,可承载 PB 级数据,并且大部分的企业都会部署 es 集群,技术和资源共享(2)elasticsearch 作为最常用的开源日志分析工具,APM 可与日志分析相结合(3)目前是免费的。属于 elastic basic license 中的基本功能支持多种语言,监控客户端包括java/go/python/ruby/nodejs/rail 等(4)社区还算活跃,版本升级比较快 5.覆盖范围(1)终端用户体验(2)应用架构映射(3)应用事务的分析(4)深度应用诊断(5)数据分析 二、APM:微服务全链路实时监控1.Elastic APM 架构体系 APM agent 是一系列开源库,使用与服务器端相同的语言编写,目前支持 node、python、ruby、js,java 和 golang。可以像安装任何其他库一样将它们安装到服务器端中。apm agent 会检测代码并在运行时收集性能数据和错误。此数据可 缓冲一小段时间并发送到 APM 服务器。基于 Java 采集数据,把数据经过组装合并,传到 APM Server 中APM Server 是一个用 Go 编写的开源应用程序,通常在专用服务器上运行。它默认侦听端口8200,并通过 JSON HTTP API 从代理接收数据。然后,它根据该数据创建文档并将其存储在 Elasticsearch 中。Elasticsearch 是一个高度可扩展的开源全文搜索和分析引擎。它允许你快速,近实时地存储,搜索和分析大量数据。Elasticsearch 用于存储APM性能指标并利用其聚合。Kibana 是一个开源分析和可视化平台,旨在与 Elasticsearch 协同工作。可使用 Kibana 搜索,查看 Elasticsearch 中存储的数据并与之进行交互。还可以使用 Kibana 中的专用 APM UI 或可以通过 APM Kibana UI 直接加载的预构建的开源 Kibana dashboard 来可视化 APM 数据。(basic license 就授权了 APM 功能) 三、Serve 实战APM 分为两部分,Agent 和 Server1.下载及配置 (1) 官方下载并且解压 apm serve#下载curlhttps://artifacts.elastic.co/downloads/apm-server/apm-server-7.12.0-darwin-x86_64.tar.gz #解压tar xzvf apm-server-7.12.0-darwin-x86_64.tar.gz#进入cd apm-server-7.12.0-darwin-x86_64/(2) Apm-server host:”ip+端口”(3) 搜索 output.elasticsearchvim apm-server.yml output.elasticsearch: hosts: [""](4) 配置好用户名和密码username: "elastic" password: "xxx"(5) 配置 montioring 监控#默认式 flaseMontioring.enable:true2.启动(1)CMD 进入 bos 窗口 Windows+r 输入 cmd(2)进入 apm 安装目录下,执行 Apm-server.exe(3)管理后台监控页面
开发者学堂课程【精通 Spring Cloud Alibaba:基于 nginx 部署 gateway 集群环境】学习笔记,与课程紧密联系,让用户快速学习知识课程地址:https://developer.aliyun.com/learning/course/634/detail/10119基于 nginx 部署 gateway 集群环境在配置两个网关时,配置转发的服务都是一样的,没有任何变化,相当于把2个网关把他的 jar 包打成2份,配置是完全一模一样的,没有任何变化。需要格外注意的是它的环境配置,一般网关默认情况下段号为80,但为了做区分。 Nginx 配置的两个网关可以进行环境配置如下:网关 1:127.0.0.1:81网关2 :127.0.0.1:82此时会存在一个如下服务器:Nginx 服务器 127.0.0.1:80现在成功启用一个网关81,此时可以访问127.0.0.1:81,输入/member,传递token=1,,访问并传递tokenNginx 在访问网关时,用户如何知道访问的是哪个网关?如何知道会员服务是通过网关81还是网关82进来的?原理如下:会员服务获取 IP 时是网关的 IP,包括 nginx 获取 IP 地址时也是获取的网关的 IP。假设现在不存在 nginx,会员服务获取 IP 地址是有网关的,这是不正确的。相当于获取到真实 IP 地址,之后会传递到会员服务,此时会员服务会获取到参数。但是现在有会员服务想得知是从81过来的还是从82过来的, 一旦转发到81网关的时候, 81网关会再写一个端号,会员服务此时获取到IP地址。首先在请求头中存放 serverport,相当于网关中重写了请求头,加了一个端号。此时,会员服务在获取端号,这个端号是网关的请求头传过来的。这就是访问81端号时会展示出来的原因,所以此时可以把网关配置成集群,也就是再加入一个网关,再写一个IP地址作为82,再启动一遍就有82的端号。此时,网关集群已经搭建完成,需要注意 Nginx 获取蓝牙地址也是 nginx 位,相当于网关获取到真实 IP 后会在企业中传递给会员服务。首先,在请求头中存放serverport,读取网关IP账号,此时会员服务可以进行获取。可以去把网关配成集群,写一个 IP 地址82,一个网关集群就搭建完毕。需要进行 nginx 的配置,首先在本机号里面配置一个gw.may ikt.com,然后负载均衡到两个网关。首先到 Windows System 32中找到目录 ETC,在 hosts 文件中加127.0.0.1,再去配nginx, 再次访问,传递 token 实现功能。
2023年02月
2022年11月