本人所在的单位是致力于为铁路和地铁提供技术服务和解决方案的研究机构。近年来由于地铁建设的不断扩张,线网式的管理日益受到了重视,为网络化运营的前提下,应对不同线路运营公司不同专业和不同的承包厂商,多个维度的应用的快速开发和集成,以及持续的进化的难点。需要设计新的适合场景的架构。在这样的背景下,2020年初某某城市地铁公司联合腾讯作为伙伴,一起派出人员组成了联合工作组,在线网智能运维项目中,推行以微服务为主的架构设计,业主同时提出解耦各专业厂商的应用和降低运维成本的要求。本人有幸加入在工作组中,主要负责了穗腾OS的架构设计和负责轨检专业的微服务集成工作。
联合小组最终开发出来的穗腾OS平台,它依托于腾讯云的paas。功能包括:协助各厂商接入智能运维平台,支撑了微服务的全面落地。此外还包括了地铁运维数据总线和算法/组件市场等子系统。本文着重从微服务的角度展开讨论。
2020年某某城市的地铁线网智能运维平台开始建设。它被赋予线网级的综合监控和协调管理。这就面临着去集成既有的、已建设完且正在运营着的地铁线。以前建设此类平台的做法是依赖业主的铁腕,要建设的平台一般在业主的组织下与一家家的专业厂商谈接口协议,再开发调试,串行的去适配各家的单体应用。最后上线的运行效果且不说,耦合紧,工期长,变数多,后期维护成本高。面对这些待解决的痛点,联合小组提出了微服务为主的建设方案,各专业厂商的微服务需要接入穗腾os平台。在本文中首先介绍一下微服务的技术,再介绍微服务在项目中的用武之地—穗腾OS平台,最后结合实践的经历,阐述一下微服务的设计,服务治理和运维以及开发工具链。
首先,微服务是由Martin fowler最早提出的。它是SOA面向服务组件模型的一种实现,但它与同为分布式的esb企业服务总线不同,在微服务中服务提供者(provider)和服务消费者(consumer)之间并无转换和中间层,是去集中化的。同时服务提供者也可能是其它微服务的消费者。它允许各微服务以各自独立的技术栈开发。要加入智能运维平台的各专业厂商要横向拆分功能,以细粒度的组件方式提供。采用轻量级的协议。穗腾OS支持了HTTP/REST和dubbo等。微服务有小独轻松的特点,小不仅指拆分后的微服务灵活和功能单一,还指微服务的开发团体以小规模为佳,一般厂商团队都在5~7人,他们是特性团队,对微服务有着全生命周期的负责,包括设计开发、测试部署和交付。这和敏捷方法所倡导的理念高度契合。除了对团队规模要求不谋而合外,敏捷方法和微服务的初衷都是快速上线,尽早获得用户的反馈。而相信读者也能看出瀑布式的过程模型也由于自身原因很难实现细粒度单元的快速,流畅的交付。独的特点体现在独立的部署和交付,每个微服务也独立运行在各自的进程空间中。轻是指微服务的API无关性和使用HTTP和REST协议。解决了典型的RPC存在的调用者耦合问题。同时能快速搭建访问资源类的应用服务。REST把资源URL标识且在规范的http协议下设计操作(post、delete、put、get)。最后松是指松耦合,易复用。在穗腾OS运行时,提供了一些厂商级的公共微服务,比如身份认证,数据字典查询等。只要厂商提出调用申请,联合工作组开通其权限,厂商通过token凭证等信息即可使用。不然,如果项目中空调、电源、网检、轨检都自己去开发认证鉴权功能,将是极大的浪费,也不符合软件工程的思想。
穗腾os平台是paas,也就是厂商微服务部署和管理平台,智能运维平台应用的支撑环境。为方便厂商的微服务开发人员上手,本人带领联合小组开发了系列的demo模板工程, Java技术栈和GO语言使用的SDK,都能指导厂商接入穗腾os云生态中。同时作为架构师,我在设计架构时,预见到了当微服务接入的服务越来越多时,对某些核心微服务的调用依赖便达到极限时,可能会出现雪崩效应,如果应用间触发链式反应,受其影响的全线智能运维平台可能都会瘫痪。除了在服务治理的容错上设计外,本人提出用专业的消息中间件来作为基础设施向有场景需求的厂商提供,我们梳理了重要的场景,尤其是聚合根或事件源角色的微服务。也规范了中间件的使用制度。小组最终采用了本人的建议选型了kafka作为中间件布设在车辆段(地面中心)和车载的网络中。从厂商应用的角度设计了角色主题的命名规则,也就是topic。以网检的topic为例,18-wangjian-01的格式。18指线路号,拼音指业务分类,最后为专业厂商的业务通道标识。这样消息的订阅者就可以有的放矢地领取消息了,避免了冲突。专业厂商获取专属于自己的业务范围的消息,这也是安全性的角度考虑。
下面从具体专业厂商的角度来讲解微服务实践。探讨微服务的设计或拆分,微服务的治理,开发工具链和运维。在指导轨检专业集成时,本人借鉴了DDD(domain driven design)中一些设计方法。事实上ddd的提出更早于微服务。它主张以业务领域设计来主导整个开发活动,这对领域模型准确性要求非常高。在此基础上,不同的界限上下文中允许出现重复的实体(事实上实体在不同子域中侧重面不同)。DDD是打通问题分析域和解决域的一种创新。正所谓,德不孤,必有邻。DDD和微服务相结合,就像如虎添翼。把单体程序垂直拆分细粒度单元时,识别子域很重要,每个子域内众多微服务围绕着一个聚合根,并由其对外接口。内部业务单一,内部细粒度单元则是职责单一,借鉴了设计类的单一职责原则SRP。轨检专业分车载机检和人工巡检。前者有人工智能算法配合激光相机的帧图采集,后者人工经验比重高,自动化程度偏低,但两个子域分立后有些重叠的部分。在ddd中一般用两种手段再细分,如果重叠部分是一些操作过程,那么抽取出来变成领域服务,一般领域服务命名是动词开头。另外情况就建模为对象。具体是建成实体对象还是值对象。可以再从数据的唯一性角度分析。在项目中,把里程纠正作为是机检和巡检都依赖的领域服务去实施的。
在子域或者说界限上下文中,有地方也分翻译成限界上下文。总之子域内业务是单一的,细粒度单元中职责是单一的,遵循SRP。如果不是这情况,那么的原因就是未达到细粒度的拆分标准,需要重新审视一下,重新分析过程。
在界限上下文中存在上游和下游微服务如何集成问题,这时ddd的建议是用分层的技巧。可以参考某些资料,理解下何为通用协议层和防腐层。一般上游对下游的接口用up通用的协议来设计,比如以rest对外资源接口。而下游去支撑上游业务流程调用时,要开发出防腐层。ACL的建设手段可以应用门面设计模式,或者设计隔离适配层。acl的设计可大可小,用来适配遗留或外部的系统接口。它的作用既保护好自身领域模型免受侵害,又确保不同域在未来保持分离。本人在指导厂商设计微服务时也给出了其他的参考意见。如下:一,根据io的类型是读密集型还是写密集型来分类拆分。二,消除循环依赖和让核心微服务不受非核心微服务的异常影响。即核心不要依赖非核心微服务。三,根据非功能属性拆分服务,比如复用性、资源一致性、部署升级频率、伸缩性等。项目中,轨检中建设加密狗的业务环节时,由于具体需求当时尚未敲定,于是把变动性最高的环节独立设计成微服务,后期时方案成熟即替即用。对于微服务应用中最核心的环节就是服务的治理问题。它包括服务的注册、负载平衡、配置中心、容错。而容错中又细分有限流、超时、隔离和熔断等特性的。在脱离穗腾os平台的生态前提下,最合适的开发工具链则是spring cloud全家桶。它作为Java语言的解决方案,可选的注册工具有euroka和noca(阿里bb开源的)。注册/配置中还有consule。配置中心可选 spring cloud config。方便在测试环境、类生产环境和真正生产环境集中管理,灵活切换各种配置文件。网关建设应用zuul。Ribbon是一种客户端的负载平衡,他和euroka可以配合使用。在容错方案中spring cloud全家桶中的hystrix结合设置阀值的技巧,能帮助微服务在高并发出现时,在核心微服务上包装断路器暂时中断服务,待高峰过去再自动恢复。断路器是用三种状态,有打开、关闭和半开,专门处理线程耗光时的调用问题。同时,也可以设置阈值来保护微服务不被恶意调用。然而在本项目中,穗腾os平台在支持主流的spring cloud微服务生态时,也支持dubbo的RPC协议。厂商的服务如果是基于spring cloud开发的,那么在部署时需要适应性的维护。包括:从euroka注册方式改造到穗腾os的注册方式。这时需要调整的是 pom.xml文件。同时配置中要禁用hystrix,以便让腾讯的容错特性来接管。这些上线前的技术支持,联合工作组都会派出人员悉心的帮助。当部署交付到穗腾OS平台后,厂商团队也渐渐感受到了微服务结合云的一些利好。比如使用穗腾os封装好的调用链追踪,可以图表化展示微服务的运行情况。因为每次对微服务的请求都记录了日志,随时都可以溯源。同时穗腾os还支持容器和虚拟机/集群两方式的部署。如果用docker容器的,推荐仓库式的运维的特性,让用过git的开发工程师立刻解锁新技能。用docker push/pop命令一键部署和拉取云上的容器。而对于运维工程师,也能轻松激活devops的流水线生态中的方案。
就像操作代码仓库一样, 用docker push/pop命令一键部署到云。这些都是降低了运维的成本,也提高了devops的生产力。
项目最终成功上线,应用于某某城市地铁18和22号线上,解决了地铁业主提出的解耦各厂商应用和降低运维成本的两个问题。同时许多优秀的算法和组件在平台上涌现和沉淀。随着穗腾os2.0的商业化推广,新的架构模式在轨道交通行业方案中占有了一席之地,更多的红利会渐渐回馈开发者,开启双赢模式。同时冷静客观的看待微服务技术,还是仍然存在有待改进的地方。比如调用的响应速度,分布式下的事务和数据一致性的方案较复杂,调用链追踪技术还要有待发展。所以说流行的架构也不是万能的,不能脱离场景而选择架构,希望同僚们理性分析需求场景,更希望大家能共同健全微服务的生态。
本文将主要讨论三种经典的软件架构风格,并且三种风格分别对应三个本人所负责的三个项目。首先是微内核风格是本人在开发自动售票机产品时使用。第二种管道过滤器风格是本人在开发架构地铁线网行车信号监察项目时的实践应用经历。最后再介绍一下微服务风格的架构项目,这是在2020年某某城市地铁智能运维项目中的应用。由于本人所在的单位是为铁路和地铁提供技术服务和解决方案的研究机构,故本人所阐述的项目背景也以轨道交通行业为主。软件架构风格发展到当今已经枝繁叶茂了,这极大的扩展了架构师选择架构风格的范围。本文首先宏观上罗列一下架构风格家族的成员和概念,中间详细讨论一下三种结合实践的软件架构风格。最后小结一下软件架构风格的意义。
掌握软件架构风格的相关知识是每个架构师的必修课,即使不能各个风格都经历和擅长,但通过学习达到能识别或者辨析各种架构风格也是相当必要,为日后架构工作时选择准确的风格来匹配业务场景提供帮助。宏观上由于软件风格不断垂直细分,风格与风格是之间关系也略复杂了。下面梳理一下或相似或隶属的关系。在独立构件架构风格中,包括事件架构风格、进程通信风格。在虚拟机风格中包括解释解析器风格、规则系统风格。仓库风格中包括黑板风格、超文本风格、数据库风格。注意要区分这不是数据流风格,因为数据流风格强调的数据处理的过程流环节,它包括了批处理架构风格、管道过滤器风格,稍后会重点讲。还有调用返回风格也是比较常用的,包括了主程序子程序风格、层次结构风格、面向对象风格,其中层次结构风格,又不同于层次架构风格,在后者中分了B/S,C/S和三层c/s。当两层C/S中独立出了服务器后,业务逻辑就不在与表示层耦合了,这样客户端就变成了瘦客户端。这样风格的程序是比较容易移植和方便客户端部署,增加安全性。尤其是能在某些客户端资源有限或者紧张的场景中使用。其它,还有闭环风格,C2风格以及SOA家族的分布式风格。
软件架构风格,是描述了某一特定领域中系统的组织方式和惯用模式,它定义了一个系统家族,包括体系结构定义,一个词汇表和一组约束。词汇表,包括一些构件和连接件类型。而这组约束指出系统是如何将这些构件和连接件组合起来的。反映了领域中众多系统所共有的结构和语义特性。
以微内核风格为例,通常包括微内核、插件和UI界面。仅是从语义上就很容易理解微内核和插件的约束关系。即插件是插在微内核上,当插件脱离微内核构件,微内核可以支撑程序继续工作。就像是热插拔U盘时并不影响电脑的其它工作和其它硬件。在复杂的应用系统场景中,当插件不可用的时候,可能会出现降级服务,但应用不会崩溃。大家都体验过自动售票机,简称tvm。它包括了出售单程票,充值一卡通,找零。现在的一些更先进设备,还有二维码的扫描器,一般几个硬件配合围绕着一个应用服务。但当不能收硬币时可以收纸币,不能收纸币时可以扫二维码,不能售单凭单程票,tvm就降级,降级服务为充值一卡通,打印机坏了就提醒不要发票,询问用户是否可以接受。这些TVM的应用场景很多人都经历过,本人开发tvm机内软件,就需要把各种软硬件模块抽象成插件。而主控,也就是微内核的角色,他掌握着事件循环,就像大脑来管理协调各种器官一样。tvm的界面与主控的是分离的,通过socket协议通信,所以严格来说这是界面分离式的微内核架构。界面(UI)可以把插件的状态显示,当所有的硬件插件不服务,界面(UI)还是可以查询地铁的线路信息。想必这种风格已经给大家很形象的认识了。
接下来介绍数据流风格的子风格–管道过滤器风格。通常每个构件都有输入和输出,数据在各种环节中处理(批处理风格是顺序处理的)。管道过滤器风格的特点是,在输入未处理完时,组件输出就已经产生了,最后呈现结果给外部或输出给其它构件。而这个构件就是过滤器。在此项目中之所以没有选择相似的批处理风格来架构,是因为信号数据是实时的指令流,而非纯后台作业。并且处理步骤之间并没有清晰的分界。所以,为了不延迟信号的连贯渲染,就只能用管道过滤器风格。同时也未使用管道过滤器可以并发的特性。本人在架构线网行车信号监察项目时的业务场景如下:外部信号承包商有一套信号协议,包括20多条指令,其中包括道岔、信号灯,还有轨道状态,还有其他的一些信号设备状态。而同时本公司内部也存在着一套信号协议和成熟的渲染程序。如果改造渲染程序来适配外部的信号协议将是巨大的工作量,并且伴随风险。而为了快速上线和高可靠性的质量属性要求。本人选用了管道过滤器风格实现了架构。即新开发了协议转换组件,它相当于风格中的过滤器角色。软件工作时,原有的分发数据的通信模块会直接调用新开发的组件,完成过滤转换。软件很快就成功的接入了外部行车信号的数据。为了过滤器转换处理效率提升,本人使用了内存管理算法健全和控制内存api强大的c和c++开发。当然开发中对内存管理稍有不慎时也会碰到,内存随着进程时间运行越久,占用越大,在几分钟之内就可以让进程崩溃。
最后在重点讲一下特别火的新晋的软件架构风格-微服务风格。他属于SOA大风格中。在分布式风格中webservice/ESB是与微服务有着些许类似,但ESB是企业服务总线。一个介于服务提供者和消费者之间的环节,虽然解耦了两端的依赖,但同时也是中心化和集中化了。而微服务是面向轻量级的协议,比如HTTP,还有API无关性。服务可以用各种技术栈来建设,微服务提供者本身也可以是另外一个微服务的消费者。微服务解决了典型的RPC存在的调用者耦合问题。微服务的架构风格说明它是更纯粹的分布式。有着小独轻松的特点。每个微服务功能单一职责,细粒度且灵活。独立部署和交付。微服务也是独立运行在各自的进程空间中。本人在某某城市地铁智能运维项目中,组织研发了以微服务风格为主的架构产品。具体的场景是:地铁业主要求在平台上监察各专业设备的状态,比如车载电源、车载空调轨道的损耗。而各厂商的方案不能串行的调试开发适配,业主要求解耦单体程序且降低运维成本。因为任何的软件和服务难免升级,而且不可控,一旦有耦合关系存在,厂商就要牵着业主的鼻子走。此时应用微服务风格就是好的选择,它具有的特点也有了很大的用武之地。各厂商拆分细粒度的微服务组件,自己业务自治,快速部署和方便管理。交付在业主提供的paas上。解耦的附属好处就是复用,很多公用微服务可以被集中管理,比如很多专业都用到了身份认证和数据字典查询。当一步步的健全微服务的生态时,许多组件可以市场化的。优秀的算法会慢慢的涌现。并且以各种红利的方式来回馈开发者。新的风格引出新的架构模式,促进相关领域的深度融合。
小结并回头来看,梳理出来的架构风格思维导图就像一棵硕果累累的树。它是前人的经验总结。前辈栽树,后人来乘凉,使用成果。
项目一旦选定了软件的架构风格,大家就相当于有了一定的抽象上的共识。现在的软件架构风格俨然成为一种沟通的媒介了。当越来越多的人在使用这个“标准语言”时,作为从业者就更加需要在架构风格上努力来学习和积累经验。更重要的是熟练根据需求的场景来合理的、灵活的选择架构风格。用好一个架构风格是需要不断的实践的。在架构风格比较时要注意,有时即便系统组织风格相同,但约束上不同,就是细分的另外的一种架构风格。当项目的成败也并不代表架构风格的盖棺定论。我们需要不断的论证和优化,吸取其他架构风格的优点,屏蔽架构风格的缺点。因为项目是变化的,一种风格与另一种风格可以混合应用,也并不是互斥的。
总结就是一种创新,这是我们秉持的态度。希望更多的架构师能探索和实践并分享。大家一起互相学习,共同进步。
敏捷方法是一套关于软件开发的思想方法和工具体系,通过遵循一系列的宣言、价值观和核心原则,并由此演化出来的实践方法和工具,来实现更早的和持续的交付有价值的软件,最终帮助客户最大化投资收益和提高影响力和竞争优势。本人有幸在2017年加入一个践行敏捷方法的项目组,该项目是受某石化的委托开发基于地震数据分析平台来指导石油勘探的项目。需要澄清的是这里所指的地震数据并非自然灾害中的地震,而是通过主动对地放炮。分析后来采集到的地震波数据。项目在零迭代时,就确定使用hadoop来分析hdfs格式的数据,同时应用IBM的RTC来协同完成代码管理和持续构建流水线。敏捷方法在此项目中帮助很大。本人作为高级工程师和敏捷教练的身份带领团队实践了scrum过程管理。文章先会从认知理论入手,再结合项目经历分享心得。
敏捷方法中主要的角色有三类:产品负责人,这是对产品投资收益代表的一类人,通常是甲方, product owner,po。开发团队简称dev。这里说明一下,团队人数应该在5~6人的规模,是以特性团队建立,最好成员中多为全栈工程师。第三类角色就是本人在项目中担当的敏捷教练,简称为sm。敏捷方法区别于其他开发方法有两个关键的判别:第一个就是敏捷是面向人,而非面向过程;第二,敏捷面向事实性、适应性而非预设性。
下面介绍敏捷方法的宣言价值观和部分原则。宣言包括个体和交互高于流程和工具,这是以人为本的体现,强调人与人之间的尊重。在项目中有高工和普通工程师,也有内部和外包等。大家彼此无缝沟通,没有等级的区别,直呼英文名,当工作出现问题时不必汇报上级可直接找到解答者。对于,沟通在一个项目开发过程中的重要作用是不言而喻的。很多人说,项目成功的70%是靠沟通,30%才是靠做任务。第二,敏捷倡导可工作的软件高于详尽的文档。曾几何时,许多项目中,文档在不同的角色中来回变换,改来改去消耗人力和物力,也没有拿出客户满意的结果。可工作的软件成了与客户与沟通的新媒介,及早地暴露风险,好过于项目失败。这一点与微服务的小独轻松的特点有共同之处,通过快速上线来得到用户反馈,降低了风险。客户在看到投资有了实质的反馈,可工作的软件并在迭代中逐渐完善,这是敏捷方法结合原型来改造传统开发方法的关键手段之一。第三点,客户合作高于合同谈判。这一点是体现着客户至上。当客户真正的参与进来,敏捷项目的流产风险才大大降低,负面抱怨慢慢会变成微笑。本人作为敏捷教练,在项目中强调指出:客户必须派驻人员在项目组,按时参加敏捷scrum管控会议。最后在客户理解了敏捷方法的要义后,承诺每周至少有一人常住项目组,确保会议至少有两人参加。一个成功的项目不一定要在合同上咬文嚼字,评审会上面红耳赤,谈判桌上拍案而起,人身攻击。客户也不是主宰的上帝和敌人。斗智斗勇的旧式项目经理也不可取。敏捷中我们不怕检查工作,审核进度。反而怕你作为客户一个月不闻不问,不来项目组。真正优质的客户看完敏捷的理念就立刻茅塞顿开了。紧接着第四点,拥抱变化高于遵循计划。事实上有许多软件按瀑布模型开发或结构化步骤,在开发还没有完成时,软件就已经被淘汰了。因为商界的变化莫测,永远是无法预估的模型。例如:安全软件460宣布永久免费后,一下子瞬间占领了8成的市场,这种例子在互联网圈中举不胜举。变化存在,而开发不响应又何谈为客户投资利益最大化和帮助客户提升竞争优势?在变化出现时,对需求变更做管理是自然必要的,但是不遵循旧计划才是敏捷所倡导的。当需求变化后,大家坐在一起重新审视用户故事,调整后续的迭代和排列product backlog item的优先级,风险共担是解决问题的基础。上面介绍了4个宣言,但注意一下,虽然敏捷倡导宣言左向的价值,但不可忽略右项的重要,流程、文档、合同、计划也是必要的。网上有人发问敏捷要不要写文档的人就走了极端。敏捷还有12条核心原则是对价值观的解释和实践的指导,是敏捷项目得以成功的基石。此处不一一展开原则,举例一下最小工作量原则,原文是:以简洁为本,极力减少不必要的工作量的艺术。它是帮助项目提高效率的指导,以防在开发中画蛇添足的工作浪费项目人员的精力。
敏捷发展到现在有许多流派,他们之间不是明显的分支,而是有共性的。在某石化敏捷项目中借鉴了极限编程XP它其中的tdd。倡导测试先行,每一个开发工程师,都要在提交代码前完成自己的单元测试。虽然编写给这gtest和junit的测试代码会占用开发时间,但每日构建时就能排除低级的错误了。对XP有借鉴的同时也有弃用项。极限编程中提出的结对编程被我主张排除使用,毕竟中国程序员的习惯还是要考虑在内的,否则破坏了团队的氛围有时更为危险。对于scrum的过程管理,在实践时会碰到各种问题,其中有一种较传统的工程师,他不能理解敏捷背后的理念问题,他很机械地执行每日站会,有时无精打采,无话可说,有时又滔滔不绝,超时每人2分钟,他讲4分钟。有一次我们在sprint回顾会议上终于听到了抱怨声音。他认为每日站会是一种监督工作和体罚,怕员工迟到等。这时SM敏捷教练就必须站出来了,于是我开了专题会正面解释。每日站会一般控制在15分钟,每人之所以要回答三个问题:我昨天做了什么,今天要做什么,我需要什么资源。这是在拉平小组内开发情况的信息,信息对称就消除了隐患,及时了解开发速率,就像协调1个车子的4个轮子共同前进。而sprint的评审会,这是将迭代的成果集成,汇总和向客户演示。而sprint的回顾会议更像是对轮子的一种清洁和检修。是要汇总在上一个sprint的过程中出现的制度或团队瓶颈问题,讨论对策和完善规则的。为防止大家对会议多且密有反感,我们在和领导讨论后决定在回顾会议上摆上水果和零食、茶水,这下子让头脑风暴环节的发言率提升了两倍。经过了几次sprint后,大家直接把回顾会议称为了水果会议了。本人作为SM,同时需要考虑到少部分人可能对敏捷知之甚少或没有敏捷团队的经历时,需要慢慢的转变。在实践中,后期加入dev的人员就很难对敏捷的此前细节完全了解。新加入到dev中来,仅简单培训了开发环境就开始干活了。所以,SM要抽时间给他们“补课”。比如,讲解敏捷项目中需求开发中使用3C的标准去采集用户故事,同时用invest来衡量一个好用户故事的标准。在sprint的计划启动会中一般会有两个阶段,第一个阶段解决why。由po来介绍自己排序的pbi,并解释明白哪些是近光灯范围,哪些是远光灯的代办项,所以远光灯暂时并不急于排到下一个sprint的任务中。而第二阶段就需要dev和SM一起研究how。即如何分解任务,如何建立架构模型、算法模型、技术准备等。二阶段时,当对PBI有问题时,可以找来po再解释和协调。在经过了第二阶段后,sprint的计划就会可以输出 sprint待办事件列表了。计划会实现一个由PBI到SBI的分解过程。SBI是sprint backlog item。此时的列表不仅仅是用户故事的分解,还包括许多质量属性(非功能需求的)的或者一些技术工作的任务加入。由于,由于在某石化敏捷项目中开发和交付应用了IBM的RTC协同工具,所以代码管理,定时抽取,每日构建都是自动化的。所以提交sprint的成果并不用占用一条sbi。所以在敏捷方法指导项目开发前需要准备好 devops的工具链,这样能让项目事半功倍。有人把这种技术选型、创建工程、基础设施的准备和自动化部署结合统称为零迭代。有句话说得好,磨刀不误砍柴工。同样在实践时如果估计不出团队的速率,可以牺牲第一次迭代来投石问路,这样为以后准确地制定计划提供了参考。
某石化敏捷项目最终上线受到了客户的好评,帮助了地震数据指导石油勘探方向上许多创新的探索。纵观目前的众多开发方法,能在客户、研发团队和公司管理层之间游刃有余,协调资源到位的方法非敏捷方法不可。在未来也希望更多的项目应用敏捷或借鉴其中优秀的特性,本人仅以个人经历和项目场景为探讨契机,提出观点供大家参考。下面就列出一些文中提到的术语解释。
中国恒大和山东,上港现在外战都可以了,而且俱乐部的梯队也上来了,归化也开始磨合了。现在国足和俱乐部除了一个国字,几乎差不多的,但就是这个国字,让选人出现难度,让选上场的人脚上注铅,为名声、为钱财、却不为荣誉。
–从野牛到洛国富,阿兰却还是阿兰
这么说,你大概就明白了我的隐喻。不明白,就读,桔生淮南则为桔,桔生淮北则为枳。当然,归化是终归有利于中国足球进步的。野牛还距离阿兰一样的境界有段境界。我指是他需要改正那股不该有的“锐气”。这不同于有年少气盛的韦世豪气,而是一种怀才不遇的“自以为是”。当然,我不是在攻击这种球员,反而希望国足多一些这个类型的。他们是有水平的,只是更喜欢发挥在更衣室和场面上的战术违规。在俱乐部,没有压力,也没有关注,可以到了国家队,那是责任,国之面子,技术高的让自己不甘心,看到不如自己的人场场首发,被“二桃杀了三士”。你可以理解野牛上场时的心态,就是要秀,争口气却失掉了传球的意识。而蒿俊敏也还没有学会收敛锋芒,让双输挡在自己职业生涯的高度。
看韩国有英超德比,看日本队主流球员已经都是有留洋血统的了。
而中国留洋的“星”成了单刀“黑洞”。每次武磊在国家队发挥的水准是没有国外好的。这也是正常,但是,调焦好每个球员的水平是教练的责任。不能因为他是高水平的,就一定派上场,而且能发挥好。因为,每个人都知道,不派上武磊出场,比赛输了,要担当的舆论压力。
张玉宁让留洋的经历留在自己的血液里。而我们的武球王,却盛名之下,其实下滑。
第二个球让武磊占得了美誉,可是,他说自己没碰到,是王新超的任意球破门。好,如果是怕进球被说是越位的角度,我赞美你。但事实上,你真的是没碰到。你还为国家寸功未立的状态呀。
第三场了,你还没有练习单刀,两次前车之鉴了。要不,你先看看孙兴敏的进球也算你上心了。
中国足球队的教练需要更多的是圆滑和心理学“学位”。米卢要说战术有多么牛,也未必高过里皮吧?只能是名帅之一。但是,他能让中国队忘记自己是“中国队”。
大佬们,中国队进不去世界杯,你们依然是吃香喝辣。俱乐部也能稳步提高。但是,你们的青春,你们的职业生涯有色彩吗?他人也罢,只为吴曦和张琳芃而惋惜。
看了电影总感觉思绪停不住,但又有大V公然侮辱志愿军先烈,就有了下面的文字。
首先,先收集一下未了的情节:
1)红围脖为什么不设计进彩蛋。千里,万里回家盖房子场面也是不赖的创意。
2)伍百里的牺牲,好像在电影中未交待清楚的感觉。所以,故弄玄虚,且不完整。
导演多了,线索也交待不完了吗?
下面聊些亮点吧:
兰作为电视《士兵突击》和《长津湖》的编剧,情节相似却不熟套,念念不忘,必有回响。这是让人喜欢的,共鸣的情节,因为,所谓许三多的钢七连,此刻应该j掷地有声了。你能理解电视剧中,军宣传报社有人弄错历史,诋毁七连荣誉时,那群扛着老团旗堵门讨说法的士兵的心情。
雷公,小山都是山东籍贯的。而那次战争也都是有原型的。参考如下:
钢刀有刀刃,那么能端掉陆军指挥部的,缴获美军”北极熊团旗“的,需要更有胆识的英雄。欣赏以个人的最小的牺牲去换取对敌人的最大杀伤。我不否认,艰守阵地的李根才是英雄,也佩服那冻死成冰雕的战士。服从命令是军人的天职。也正是千千万万个先辈替我们打了仗,才让我们能在红旗下,享受生活。
而我们中的甚者,哗众取宠,浅了说是不知羞耻,深了说是叛国者。国之主流思想是不容有差错的。就像,军国主义的教育就会有对外的侵略。任何毁誉英雄的行为,就是对国家的不忠。就是在试探国民的意识,那么,现在罗大V被邢拘了,中国人民永远不会包容这类人,中国这个醒龙的双眼也不会再被蒙昧了。
且看北京报对大V事件的回应:
https://mbd.baidu.com/newspage/data/landingsuper?context=%7B%22nid%22%3A%22news_8329342926969500520%22%7D&n_type=0&p_from=1
最近,中国疫情得到控制,为世界抗疫作出了表率。国家领导到基层干部全面重视,党员带头冲锋在一线,群众影响号召。大家减少外出和聚集。决胜武汉之后,全国各地又严格执行常态化的防控管理。影响是巨大的,但难不倒有着坚韧意志的中国人。
说到坚韧的意志,就不得不说央视大剧《觉醒年代》。
即便不是因为疫情让我们有更多时间品味它,也应该是因为中国共产党走过百年,回首那个时代中国人的探索和奋斗,是相当必要的。
于老一代无产阶级革命家来说,他们就像翻开一部珍宝般的影集。而对于80后,在红旗下成长过程中熏陶的碎片记忆后,更好奇的想拼出那个”胜负手”的原汁原味。而更年轻的人们可能又像是等着书画的白纸,对党的历史也更好奇。所以,在党的百年之际,用最还原历史的,慢节奏的,青春的,现代质感的……,总之,绝对不能错过。
无数的镜头中给我留下较深印象的是,陈独秀家门前到胡同口的泥泞之路,毛主席在火车上换回适合自己脚的草鞋,延年和乔年在法国没有学费也坚持原则。他们面对着现实生活的问题没有丝毫的抱怨,就像也摆在旧中国面前的未来之路问题,他们同样也当仁不让。路泥泞了可以垫砖,草鞋虽然不及皮鞋保暖,但草鞋的好处是材料取之不尽,用之不竭。生活启发着他们,他们启发着中国。《新青年》和北京大学是新文化运动的重要源泉,蔡元培的不拘一格的聘请教授进入北京大学讲坛,让北大兼收并序;仲傅和守常还有鲁迅的文章在每个不愿做奴隶的中国人心中生根发芽。由八股文到白话文,由新文化到五四运动,由改良到斗争,从斗争到革命,由革命到不怕牺牲,南陈北李,相约建党,直到奉献生命给共产党,奉献给中国。每一步都有人睡去,或者不愿醒来,同样,每一步也有人不断的觉醒。胡适先生专搞他的美国化和学术去了,吴疯子从反封建斗士彻底变成了人民的对立面,出卖了延年和乔年(陈独秀的两个儿子)。而不知不觉间,延年和乔年也由最终坚持的无政府主义变成了共产党最坚定的支持者。落伍掉队者要么苟活着被淘汰,而举火照亮前面之路者难免被火迫害。然而,那火炬如红旗一样永远不倒。因为,东方睡狮已经醒来,中国就要跳过资本主义建立有中国特色的社会主义。自己的路自己作主。党的初建成员,大都没有逃过国民党的杀害。杀伐是扼杀思想的利器吗?清朝错了,军阀错了,不得民心的国民党在几十年后又错了一次,杀伐是征服一个民族的利器吗?日本人又错了。中国共产党的路,越走越宽了,跟随他一起走路的人越来越多了,有工人,有学生,有农民,现在有着各行各业的人,全中国的人。
但这部电影让我们铭记先烈的奋斗目标和梦想。也鼓舞了当下疫情中的中国,没有什么坎儿是中国人跨不过去的。因为我们有着坚韧的意志和共产党领导的路。
敏捷是一套关于软件开发过程的思想,方法和工具体系,通过遵循一系列价值观和核心原则,并借助由此演化出来的实践方法和工具,来实现更早和持续的交付有价值的软件,最终帮助客户最大化投资收益,提高影响力和竞争优势。—概念
最后,还应记住敏捷宣言中的最后一句话:“ 尽管右项有其价值,我们更重视左项的价值”—敏捷宣言并未否定或贬损“ 右项” 的价值,在敏捷开发的价值观中承认“ 流程和工具”、“ 详尽的文档”、“ 合同谈判” 以及“ 遵循计划” 的重要性,只是两相比较,“ 更重视左项的价值”。
- 个体和互动高于流程和工具
- 工作的软件高于详尽的文档
- 客户合作高于合同谈判
- 响应变化高于遵循计划
唐宋大家八占三,进士兄弟皆学霸, 少年壮志妈姓程,大器晚成学渣爸。—本人有感而发
莫道登科易,老夫如登天。 莫道登科难,小儿如拾芥。2)三苏游京之风光时,背后的那个女人却病逝于老家。 好一句“内失良朋”摘于:
与子相好,相期百年。不知中道,弃我而去。 嗟予老矣,四海一身。自子之逝,内失良朋。3)夫妻情,父子情,兄弟情。 好一幕“兄弟归老一处”: 在苏轼弥留之际,想念遥远的兄弟,仍不怕奔波之苦难,为的是能与兄弟苏辙再续童年的记忆,并最终与家人合葬一处。 这就是著名家族三苏的故事。 在中国近代,又有一个家庭的父子三人对中国的贡献颇大。 那就是三陈:陈独秀和他的两个为国捐躯的儿子,陈延年和陈乔年。 中国历史的三苏与三陈。 想了解更多可以去看《觉醒年代》。 也借此文,向7月1日党的百年华诞献礼。
本人有一台云服务器182.254.……(公网地址),所以,在上面操练容器仓库,方便以后推送部署产品。使用者用自己的环境替换一下即可用。
docker pull registry:2
然后就看到images中存在了。
运行它的命令如下:
docker run -itd -p 5000:5000 –name dlregistry -v /home/home4dk:/var/lib/registry registry:2
1)修改文件
vim /etc/docker/daemon.json
加入内容
{
“registry-mirrors”: [“https://llpuz83z.mirror.aliyuncs.com”,”https://registry.docker-cn.com”],
“insecure-registries”: [“182.254.……:5000”]
}
2)加环境变量
这会让https变成http来访问推送
export INSECURE_REGISTRY=182.254.……:5000
3)然后再启动docker
systemctl daemon-reload
systemctl restart docker
要推送本地要有一个打好tag的镜像才行。
#从自己本地的镜像中选一个相对小的做推送实验品,空间小上传快一点
docker tag docker.io/redis:latest 182.254.……:5000/testredis:7
#上传具体命令
docker push 182.254.……:5000/testredis:7
当推送成功后可以用浏览器看:
http://182.254.……:5000/v2/_catalog
http://182.254.……:5000/v2/testredis/tags/list
同时在与容器映射的文件夹下也看到上传后的序列好的文件(从docker开始都是系统建立的)
ll home4dk/docker/registry/v2/