IoC(Inversion of Control):
控制反转是Spring框架的核心。其原理是基于面向对象(OO)设计原则的The Hollywood Principle:Don't call us, we'll call you。所有的组件都是被动的,所有的组件初始化和调用都由容器负责。用来减低计算机代码之间的耦合度。借助于“第三方”实现具有依赖关系的对象之间的解耦。把复杂系统分解成相互合作的对象,这些对象类通过封装以后,内部实现对外部是透明的,从而降低了解决问题的复杂度,而且可以灵活地被重用和扩展。把各个对象类封装之后,通过IoC容器来关联这些对象类。这样对象与对象之间就通过IoC容器进行联系,但对象与对象之间并没有什么直接联系。如果软件系统引入了Ioc容器之后,对象A和对象B之间失去了直接联系,所以,当对象A实例化和运行时,如果需要对象B的话,IoC容器会主动创建一个对象B注入到对象A所需要的地方。对象A获得依赖对象B的过程,由主动行为变成了被动行为,控制权颠倒过来了。控制反转(IoC)的技术促进了松耦合。当IoC被使用,一个对象依赖的其它对象不会通过自己创建或者查询以来对象,而是以被动的的方式被传递。
应用场景:
在应用开发中,当我们在设计组件时,往往需要引入和调用其他组件的服务时,这种依赖关系如果固化在组件设计中就会导致组件之间的耦合和维护难度的增大,这个时候如果使用 IoC 容器,把资源获取的方式反转,让 IoC 容器主动管理这些依赖关系,将依赖关系注入到组件中,那么这些依赖关系的适配和管理就会更加灵活。
是一种 Web 应用程序开发的手段,它采用客户端脚本与 Web 服务器交换数据,把服务器负担的一些工作转嫁到客户端,利于客户端闲置的处理能力来处理,减轻服务器和带宽的负担,从而达到节约ISP的空间及带宽租用成本的目的。 Ajax不必采用会中断交互的完整页面刷新,就可以动态地更新 Web 页面。
REST是一个依赖于资源、表示和动作的三轮车。
资源是Web平台的基本元素。在进行REST工作时,第一个任务是识别资源并找出它们是如何相互链接的。每个资源在Web平台上都有一个唯一的标识符,称为通用资源标识符URL,Web上最好的例子是统一资源定位器。引用资源的URL数量没有限制。
动作是一个HTTP动作,如post、get-put、delete、options等。使用URL,可以为通信确定目标服务器的标识,但HTTP谓词只告诉需要在主机上执行哪些操作。客户机可以在主机上触发许多操作。
表示确定向客户展示这些资源的方法。REST支持所有格式,没有任何限制;因此可以使用任何格式来表示资源。根据客户机和服务器处理格式的能力,可以使用JSON、XML或任何其他格式。接口就是可以通过服务端部署的机器提供出来的URL地址进行动态的数据交互。通常是前后端协商定义数据接口格式(一般就是JSON格式)形成文档。接口遵循RESTful规范,基于这个风格设计可以更简洁,更有层次,更易于实现缓存等。
RESTWeb服务确保能够对用户进行身份验证,并授权允许其访问和使用的资源。确保信息从收集之时起到存储之时以及以后提供给被授权人时的保密性和完整性。HTTP带有一些继承的身份验证机制,它允许基本的、摘要式的和自定义的身份验证。
xgboost是梯度提升树的一种高效系统实现,是对GBDT进一步的改进,包括对代价函数进行了二阶泰勒展开,在代价函数里加入了正则项,借鉴了随机森林的列采样方法,支持并行计算等。传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。与CatBoost不同,XGBoost不能独自处理分类特征,它只接受与随机森林类似的数值。
AdaBoost是基于boosting的思想,通过多个弱分类器的线性组合来得到强分类器,训练时重点关注被错分的样本,准确率高的弱分类器权重大。在训练过程中,它不改变所给的训练数据,而是不断改变训练数据权值的分布,使得被误分类的数据再后一轮的分类中受到更大的关注。同时采用加权多数表决的方法,加大分类误差率小的弱分类器的权值,使其在最后的表决中起更大的作用,减小分类误差率大的弱分类器的权值,使其在最后的表决中起较小的作用。
CatBoost是Category 和 Boosting的缩写,最大的特点就是可以直接处理类别特征,不需要任何预处理来将类别转换为数字。catboost的基模型采用的是对称树,同时计算leaf-value方式和传统的boosting算法也不一样,传统的boosting算法计算的是平均数,而catboost在这方面做了优化采用了其他的算法,这些改进都能防止模型过拟合。最大的特点对category特征的直接支持,甚至支持字符串类型的特征。
随机森林算法通过随机的行采样(bagging)和列采样(feature bagging)构造不同的训练集,建立一个决策树森林,利用加权平均方式或多数表决的方式得到最后的预测结果,能够并行学习,对噪声和异常数据具有很好的过滤作用。行采样和列采样都是为了减小模型之间的相关性使基学习器变得不同从而减小集成模型的方差,但这种随机性会导致随机森林的偏差有所增加(相比于单棵不随机树),因此随机森林的单棵树都会采用很深的决策树,并不进行剪枝操作,以减小每棵树的偏差,这使得每一棵决策树就是一个精通于某一个窄领域的专家(因为我们从全部特征中选择部分来让每一棵决策树学习),这样在随机森林中就有了很多个精通不同领域的专家,对一个新的问题(新的输入数据),可以用不同的角度去看待它,最终再通过投票或平均得到结果。这也正是群体智慧的体现。
GBDT是以决策树(CART)为基学习器的GB算法,xgboost扩展和改进了GDBT,xgboost算法更快,准确率也相对高一些。GBDT是基于boosting的思想,串行地构造多棵决策树来进行数据的预测,它是在损失函数所在的函数空间中做梯度下降,即把待求的决策树模型当作参数,每轮迭代都去拟合损失函数在当前模型下的负梯度,从而使得参数朝着最小化损失函数的方向更新。GBDT可以看作是AdaBoost的一个推广,AdaBoost是通过错分数据点来识别问题,通过调整错分数据点的权重来改进模型,GBDT是通过负梯度来识别问题,通过计算负梯度来改进模型。
欧几里得距离指 m 维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。欧氏距离越小,相似度就越大,欧氏距离越大,相似度就越小。适合于特征数据量较小的情况。欧氏距离能够体现个体数值特征的绝对差异,所以更多的用于需要从维度的数值大小中体现差异的分析,如使用用户行为指标分析用户价值的相似度或差异;当我们分析用户的活跃度,以登录次数和观看时长作为特征时,余弦距离会认为(1.1,0)和(10,100)两个用户余弦距离很近,显然2个用户活跃度有着极大的差异的,此时我们更要关注绝对差异,应当使用欧式距离。
皮尔逊相关系数(Pearson Correlation Coefficient)是余弦相似度在维度值缺失情况下的一种改进。是比欧几里德距离更加复杂的可以判断人们兴趣相似度的一种方法。该相关系数通过将两组数据与某一直线拟合的思想来求值,该值实际上就为该直线的斜率。其斜率的区间在[-1,1]之间,其绝对值的大小反映了两者相似度大小,斜率越大,相似度越大,当相似度为1时,该直线为一条对角线。
余弦相似度是两个向量在空间中的夹角大小,其计算严格要求"两个向量必须所有维度上都有数值",衡量的是维度间取值方向的一致性,余弦相似度更多的是从方向上区分差异,而对绝对的数值不敏感,更多的用于使用用户对内容评分来区分用兴趣的相似度和差异,同时修正了用户间可能存在的度量标准不统一的问题(因为余弦相似度对绝对数值不敏感)。余弦夹角可以有效规避个体相同认知中不同程度的差异表现。当一对文本相似度长度差异很大,但内容相近时,如果使用余弦相似度的话,他们之间的夹角可能很小,因而相似度高。
Tanimoto 系数是一个计算交集和并集的比率的方法,主要用于计算符号度量或布尔值度量的个体间的相似度,因为个体的特征属性都是由符号度量或者布尔值标识,因此无法衡量差异具体值的大小,只能获得“是否相同”这个结果,所以Tanimoto系数只关心个体间共同具有的特征是否一致这个问题。这种方法适用于:数据表示为0、1这种二值化,而非有数量大小的情况。
Hash-based itemset counting(散列项集计数)
基本思想:压缩候选k项集,使用散列函数将项集加入到对应的桶中,定义最小支持度阈值,认为一个其hash桶的计数小于阈值的k-itenset不可能是频繁的。
Transaction reduction(事务压缩)
基本思想:删除不可能对寻找频繁项集有用的事务
不包含任何频繁k项集的事务不可能包含任何k+1项集。因此这些事务在其后的考虑中,可以加上标记或删除。
Partitioning(划分)
基本思想:分而治之
项集在DB中是频繁的,它必须至少在DB的一个划分中是频繁的
扫描1:划分数据库,并找出局部频繁模式
扫描2:求出全局频繁模式
事务数据库D的任何频繁项集必须作为局部频繁项集至少出现在一个分区中,这是显然成立的。因此我们将事务数据库划分为n个非重叠的分区,对于每个分区找出局部频繁项集;然后再次扫描数据库,评估每个候选集的支持度,从而最后确定全局的频繁项集。
Sampling(采样)
基本思想:选取原数据的一个样本,在样本利用Apriori挖掘频繁模式。
牺牲一些精度换取有效性。对于事务数据库随机抽样,产生样本S,然后在其中搜索频繁项集。这样因为我们抽样得到的只是一部分数据,所以会在一定程度上丢失一些全局频繁项集。为了解决这个缺陷,我们可以使用更小的最小支持度阈值,在S上来找到更多的频繁项集,从而尽可能的保证少丢失;或者再次扫描数据库,找到丢失的频繁模式。
FP-growth算法
FP-growth算法只进行2次数据库扫描。它不用生成候选集,不使用候选集,直接压缩数据库成一个频繁模式树,最后通过这棵树生成关联规则。解决了Apriori算法产生大量候选集以及频繁扫描事务集的缺点。两个步骤完成:
①利用事务数据库中的数据构造FP-growth;
扫描数据库一次,得到频繁1-项集,把项按支持度递减排序,再一次扫描数据库,建立FP-growth。
②从FP-growth中挖掘频繁模式。
根据事务数据库D和最小支持度min_sup,调用建树过程建立FP-growth;
Leanote私有云笔记采用Kubernetes基于docker进行分布式管理和部署,由四个节点组成,一个master节点,三个salve节点,在master上部署K8s的关键组件和mongo server,三个salve节点复制同步mongoDB,将leanote的负载均衡自动部署在node3。
DevOps是提高软件开发、测试、运维、运营等各部门的沟通与协作质量的方法和过程,DevOps强调软件开发人员与软件测试、软件运维、质量保障(QA)部门之间有效的沟通与协作,强调通过自动化的方法去管理软件变更、软件集成,使软件从构建到测试、发布更加快捷、可靠,最终按时交付软件。DevOps(development &operations)是一组过程、方法与系统的统称,用于促进开发、技术运营和质量保障部门之间的沟通、协作与整合。DevOps目的:为了按时交付软件产品和服务,开发和运营工作必须紧密合作。
工具:
GitHub、Git/SVN、Docker、Jenkins、 Hudson、Ant/Maven/Gradle、Selenium、QUnit、JMeter等。
应用领域:
将开发延伸至生产中--包括拓展持续集成和发布功能至生产,集成QA和信息安全至整个工作流,确保代码和环境可在生产中直接部署。
向开发中加入生产反馈--包括建立开发和IT运营事件的完整时间表用于帮助事件的解决,使得开发融入无指责的生产反思,尽可能使开发可以自助服务,同时创建信息指示器来表明本地的决策如何影响全局的目标。
开发嵌入到IT运维中--包括开发投入到整个生产问题处理链,分配开发资源用于生产问题管理,并协助退回技术债务,并且开发为IT运维提供交叉培训,增加IT运维处理问题的能力,从而降低升级问题的数量。
将IT运维嵌入至开发--包括嵌入和联络IT运维资源至开发,帮助开发创建为运维使用的可重用的用户故事,定义一些可以被所有项目共用的非功能性需求。
REST:
REST是一种用于设计松散耦合的Web服务的体系结构样式。它主要用于开发轻量级、快速、可扩展和易于维护的Web服务。RESTful应用程序使用HTTP请求发布数据(创建/更新)、读取数据(进行查询)和删除数据。因此,REST将HTTP用于所有四个CRUD(创建/读取/更新/删除)操作。REST将Web定义为分布式超媒体(超文本中的超链接)应用程序,其链接资源通过交换资源状态表示进行通信。其余的体系结构风格为构建分布式和松散耦合的应用程序提供了指导原则。REST本身不是一个标准,而是一种体系结构样式,它使用诸如http、xml/html/json/gif(资源表示)、text/html、text/xml和image/jpeg(mime类型)等标准。
SOAP:
SOAP简单对象访问协议是一种协议,主要依赖XML来提供消息传递服务。SOAP使用不同的协议进行通信,如http、smtp或ftp。REST是一种体系结构风格,它使用现有的HTTP操作和方法;并且不创建任何新的标准。
好处:
REST比SOAP Web服务更灵活。它比SOAP有以下好处。
•SOAP只对消息使用XML,REST支持不同的格式;
•REST消息的大小较小,占用的带宽较小;
•REST在性能方面更好,具有更好的缓存支持;
•访问REST Web服务不需要第三方工具。REST的服务学习使用更容易。
•REST客户机(浏览器)和服务器之间的耦合较少;可以轻松地进行功能扩展和更改。SOAP客户机与服务器紧密耦合,如果在任何一端进行更改,集成都将中断。
•REST支持开发一个高度安全和复杂的API,它支持不同的协议。REST开发具有出色性能和对CRUD操作支持的轻量级API时会更好。
•云客户端可以是计算机、移动电话等硬件,也可以是操作系统、浏览器等软件。它是云计算系统的服务对象。最终用户通过客户端向云端发送请求并接受云计算服务。
•云应用程序使运行软件成为一种服务。这些应用程序在云计算系统而不是在用户本地运行,由云计算系统为其分配资源并维护其运行状态。用户通过网络获取运行结果。
•云计算平台是云应用程序运行的平台。它为云应用程序分配和调度计算资源。
•云基础设施实现了对软硬件的虚拟化,使云计算平台不用关心处理器、存储器、数据库、网络设备、软件等应如何组织。
•云服务器指实际的计算机软硬件,包括多核处理器、面向云计算的操作系统等等。这些软硬件能够提供云计算服务。
基本特征
•灵活性:可以在花费代价很小的情况下,为用户快速的重新配置资源。
•应用程序兼容性:用户可以和调用本地API一样调用云端软件提供的API。
•低花费:云计算采用“租用”的方式使用第三方服务供应商提供的硬件资源,用户既节省了购买硬件的费用,又节约了配置软件的时间。
•硬件设备位置无关性:云计算通过网络组织各种硬件资源,用户只需要通过Web访问这些资源,不必关心到底使用了哪些硬件设备,也不必关心这些硬件设备在何处。
•资源共享:区别于以前资源和用户一对一的服务方式,云计算环境下网络上的资源可以以一对多的方式为用户提供服务,提高了资源利用率,实现了资源共享。
•可靠性:云计算系统可以为用户分配冗余的资源,能够进行灾难恢复。
•可扩展性:云端的资源可以动态地扩展,省却了用户的配置工作。
•易维护性:对于最终用户来说,只进行Web访问,不用安装客户端,易于维护。
•可测量性:云系统通过在与服务类型相适应的抽象级别上利用度量功能,自动控制和优化使用的资源。它将提供可分析和可预测的计算平台。云计算系统为用户提供的各种资源量可以按照每个用户或每个应用的使用天数或月数、年数来计算。
•随需应变自助服务: 消费者可以单方面提供计算能力,而不需要与每个服务提供者进行人工交互。
•异构访问: 通过网络获得功能,并通过标准机制进行访问,这些机制促进异构瘦客户机或胖客户机平台的使用。
•资源池: 提供者使用的的计算资源池多租户模型为多个使用者提供服务;根据用户需求动态分配和重新分配不同的物理和虚拟资源
Django是一个开放源代码的Web应用框架,由Python写成,继承并简化了MVC架构。MVC中的Controller部分基本全由Django完成。View部分被分割成两部分,即:负责HTML渲染的模板和负责显示逻辑的视图。所以Django又被称为MVT(Model-View-Template)框架。这个Django除了MVT框架的核心部分(O/R映射工具、URL分配器(Dispatcher)、视图、模板系统)之外。还有管理界面、缓存系统、国际化支持、表单处理等机制和功能。
使用Django开发Web应用站点时,需准备一个承载着Django实例及数据库设置等内容的工程,然后通过在该工程中新建几个应用或者调用外部应用,或者将二者结合起来进行开发。由于每个应用的本质都是Python程序包,所以只要按功能(模型、视图、模板等、)对这些包进行分析,完全可以拿到其他工程中重复利用。
Dubbo (开源分布式服务框架),阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,Dubbo是一个远程服务调用的分布式框架,致力于提供高性能和透明化的RPC远程服务调用方案以及SOA服务治理方案。Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡以及服务自动注册和发现。
特点:
微服务可以按照业务功能本身的独立性来划分,如果系统提供的业务是非常底层的,如:操作系统内核、存储系统、网络系统、数据库系统等等,这类系统都偏底层,功能和功能之间有着紧密的配合关系,如果强制拆分为较小的服务单元,会让集成工作量急剧上升,并且这种人为的切割无法带来业务上的真正的隔离,所以无法做到独立部署和运行,也就不适合做成微服务了。
能不能做成微服务,取决于四个要素:
参考DDD中的设计策略“界定的上下文”(Bounded Context),划分出系统中不同的领域模型(上下文)。每一个领域模型拥有自己独立的数据库(或其他持久存储)
DDD中其他对于划分服务有参考价值的设计策略
–上下文映射(Context Map)
–共享内核(Shared Kernel)
–客户-供应商(Customer-Supplier)
–顺从者(Conformist)
–防崩溃层(Anticorruption Layer)
–隔离通道(Separate Way)
–开放主机服务(Open Host Service)
判断良好服务的标准
–自身保持高内聚,有自己独立的领域模型(上下文)
–封装内部变化,通过API对外暴露功能
•只有本服务自身的代码可访问本领域模型的数据库
•其他系统只能通过本服务暴露的API间接访问本服务的数据
–与其他服务保持松耦合,能够独立修改和部署
•依赖本服务的其他系统不必同时修改和部署
–能够实现服务自治,可独立进化
同一个领域模型(上下文)之上可以有多个发布单元,但是只有一个是服务
–常见的发布单元划分方式:一个服务、一个定时任务、一个管理后台
Dubbo 关注于服务治理这块并且以后也会继续往这个方向去发展,Spring Cloud 关注的是微服务的全套解决方案,服务治理也只是微服务生态的一部分而已。
1.注册的服务的区别
Dubbo是基于java接口及Hession2序列化的来实现传输的,Provider对外暴露接口,Consumer根据接口的规则调用。
SpringCloud的服务发现是基于Http协议来实现的,Provider对外暴露的是应用信息,Consumer发现的是应用的信息,当调用的时候随机选择一个Provider的IP地址,应用名称,然后依据Http协议发送请求。
2 . Server集群服务信息同步的区别
Dubbo使用Zookeeper做服务发现和治理。
SpringCloud使用Eureka做服务发现和治理,它是一个专门用于服务发现和治理的框架,EurekaServer节点间的服务信息同步是基于异步Http实现的。
3 . 服务更新机制的区别
Dubbo使用Zookeeper做服务发现和治理,订阅Zookeeper下相应的znode。当节点发生变化,Dubbo每次更新都同步全量数据。
Eureka在启动时向Server进行一次全量拉取,获取所有的可用服务信息,之后默认情况下都是进行增量拉取。
4 . 服务更新反馈机制的区别
Dubbo订阅Zookeeper下相应的节点,当节点的状态发生改变时,Zookeeper会立即反馈订阅的Client,实时性很高。
Eureka Server在接收到Client的更新操作,或者移除服务信息时,仅仅会将更新消息存放入recentlyChangedQueue中,不会主动的反馈其他Client。其他Client只有在拉取服务增量信息时才会感知到某个服务的更新,延时最大为30S,也就是拉取周期。
5 . 服务信息回收机制的区别
Zookeeper对服务信息的维护实时性和一致性比较高,但也可能因为网络问题或者集群问题导致服务不可用。
SpringCloud的服务信息回收仅基于心跳超时,与长连接无关。
6 . 节点性质的区别
Dubbo只有Consumer订阅Provider节点,也就是Consumer发现Provider节点信息。
Eureka不区分Consumer或者Provider,两者都统称为Client,一个Client内可能同时含有Provider,Consumer,通过服务发现组件获取的是其他所有的Client节点信息,在调用时根据应用名称来筛选节点。
7 . 使用方式的区别
Dubbo使用Zookeeper作为服务发现和治理的组件,所以需要搭建Zookeeper集群作为依赖。
SpringCloud使用Eureka作为服务发现和治理组件,在Spring应用中整合Eureka还是很简单的。
Service Mesh(服务网格)是一个用于保证服务间安全、快速、可靠通信的网络代理组件,是随着微服务和云原生应用兴起而诞生的基础设施层。通常作为一组轻量级网络代理实现,这些代理与应用程序代码部署在一起,应用程序无感知。Serivce Mesh可以看作是一个位于TCP/IP之上的网络模型,抽象了服务间可靠通信的机制。但与TCP不同,它是面向应用的,为应用提供了统一的可视化和控制。为了保证服务间通信的可靠性,Service Mesh需要支持熔断机制、延迟感知的负载均衡、服务发现、重试等一些列的特性。
可以将它比作是应用程序或者说微服务间的 TCP/IP,负责服务之间的网络调用、限流、熔断和监控。对于编写应用程序来说一般无须关心 TCP/IP 这一层(比如通过 HTTP 协议的 RESTful 应用),同样使用 Service Mesh 也就无须关系服务之间的那些原来是通过应用程序或者其他框架实现的事情,比如 Spring Cloud、OSS,现在只要交给 Service Mesh 就可以了。
1、API的实现技术应该避免产生与客户端的耦合
–例如Java RMI,要求客户端必须使用Java语言,耦合很强
–应该选择与具体技术不相关的API实现方式,以保证技术的选择不被限制
2、普通场合应优先选择基于HTTP的RESTful API
–基于HTTP协议,互操作性好,各种编程语言都支持
–可伸缩性好
–松耦合
–易于测试
–易于形成统一的编程风格
3、在特殊场合可以选择二进制的RPC协议
–对低延迟、实时性要求极高
–服务的API极少变化,因此松耦合不重要
–可选的二进制的RPC协议:
•基于Google Protocol Buffer数据交换格式的各种RPC协议
•基于Apache Thrift协议的各种RPC协议,例如唯品会的OSP
4、不建议选择基于HTTP的RPC协议
–紧耦合
–可伸缩性差
1、3个角色
–产品负责人:负责投资回报率;产品开发过程中为整个团队提供支持;负责解决所有问题;与客户沟通了解需求;保持产品列表现状
–scrum主管:确保规则运行;为团队提供指导;清除障碍;避免一切外界干扰;Scrum主管既是老师又是裁判
–团队成员 :完成各项艰苦工作的人。
2、3个会议
–计划会(发布 & 冲刺)
–每日例会
–回顾会
3、3个表格
–产品列表
–冲刺订单
–产品增量