月度归档:2015年10月

Docker and  DevOps

DevOps三个基本点:

A708EDF9-C993-44F9-9940-C69CB3D8AE8F
一、系统性能;
强调整个系统的性能,而非将性能局限于特定的工作领域里,这个工作领域可以大到一个部门(例如开发和IT运维)或者小到一个个人贡献者(例如开发者,系统管理员等)。   重点是由IT推动的的业务价值流,换句话说,它始于需求定义(比如被业务或IT部门定义),进行开发构建,又交给IT运维,最后价值以一种服务的形式交付给客户。   实践第一个基本点的结果——决不传递一个已知缺陷至下游,决不因小失大,总是致力于改进流程,执着于深刻理解系统需求(根据戴明的理论)。
二、缩短和放大反馈回路;
创建从右至左的反馈回路,几乎所有的流程改进计划的目标都是缩短和放大反馈回路,以便可以持续进行必要的修正。   应用第二个基本点的结果——包括理解和回应所有内部和外部客户,缩短和放大所有的反馈回路,必要时,非常容易的嵌入客户需要的知识。
三、持续性探索和学习;
打造一种文化用来促进两件事情——持续不断的探索精神,勇担风险的精神以及从成功和失败中来学习的能力,同时也得谨记:重复和实践是融会贯通的前提。   这两件事情对我们来说同等重要,探索精神和勇担风险的精神可以确保我们持续改进,它甚至意味着我们可能到达了之前曾未到过的危险区域,因此这也迫使我们去学习,掌握并融会贯通那些技能,因而使得我们能够顺利离开危险区。   第三个基本点的结果——分配时间去改进每天的例行工作,培养一种奖励冒险精神的风气,同时主动引入故障到系统中,从而提高弹性。
参考:《The Phoenix Project》

DevOps的应用领域:

领域一:
将开发延伸至生产中——包括拓展持续集成和发布功能至生产,集成QA和信息安全至整个工作流,确保代码和环境可在生产中直接部署。
领域二:
向开发中加入生产反馈——包括建立开发和IT运营事件的完整时间表用于帮助事件的解决,使得开发融入无指责的生产反思,尽可能使得开发可以自助服务,同时创建信息指示器用来表明本地的决策如何影响全局的目标。
领域三:
开发嵌入到IT运维中——包括开发投入到整个生产问题处理链,分配开发资源用于生产问题管理,并协助退回技术债务,而且开发为IT运维提供交叉培训,增加IT运维处理问题的能力,从而降低升级问题的数量。
领域四:
将IT运维嵌入至开发——包括嵌入和联络IT运维资源至开发,帮助开发创建为IT运维(部署,生产代码的管理等)使用的可重用的用户故事,定义一些可以被所有项目共用的非功能性需求。
参考:《DevOps Cookbook》
 0A5B305A-5BEA-4883-B80C-308CED35ED42
参考:
Advertisements

使用getBeansOfType实现Bean的自动查找

典型的使用场景:
消息的接受者会出现多个不同的实现,因为他们每个实现只处理一种消息类型,比如处理订单支付完成的、处理订单退款的等等。在一个系统中一般只有一个全局的消息接受者,此消息接受者接受所有发给本系统的消息,这个全局消息接受者再根据消息的Tag的不同分配给不同的消息实现类去处理。
问题:如何实现全局消息接受者自动根据TAG的不同自动分配任务呢?
解决方案一:
最简单的方法是使用IFELSE判断,根据每一种TAG进行判断,然后再调用消息的实现类。
优点:简单易实现;
缺点:但是这种方法明显不优雅,每次新增一种消息的实现类都需要修改全局消息接受者,很容易出错。
解决方案二:
定义一个消息的处理接口,所有实现类都继承此类,再定一个 全局消息处理工厂类,工厂类中定义一个Map属性,用于初始化所有消息接口的实现类信息,key为实现类的TAG,当需要根据TAG找实现类时就可以直接从Map中查找。
如何初始化所有消息接口的实现类信息?使用applicationContext.getBeansOfType(YourInterfaceClass.class);
优点:每次新增实现类只需要继承接口,不需要进行TAG消息的查找,不易出错,同时也让相同功能的类能够高度集合。
缺点:初始化Map是在工厂Bean初始化的时候实现,当实现类的bean很多时,bean的初始化会比较耗时;
122024DD-A93E-42E0-93C4-6183DFC66B12
工厂类:
552D5980-3711-41F4-A924-C0F82EE12E52