软件交付周期(SDLC,Software Development Life Cycle)越来越短,应用程序规模越来越大,DevOps致力于支持软件的持续构建和交付
SDLC已发展为通过若干流程、工具、方法以实现快速交付
软件交付的挑战
瀑布模型和实物交付
串行由上而下,一般不返回上阶段,交付周期一般较长,如软盘\CD-ROM
敏捷模型和电子交付
增量、迭代、敏捷模型,可多次交付(更利于更新和打补丁),如exe程序
基础设施(如服务器和网络)是静态的,需事先设置好,一般SDLA不涉及影响基础设施
云端的软件交付
软件程序从二进制变为在线服务
虚拟化技术和软件定义网络(SDN)使服务器更动态化
如Amazon Web Service(AWS)、Google Cloud Platform(GCP)这种云服务,可轻松创建和管理动态基础设施
基础设施被纳入SDLC范围,成为重要组件之一,程序被安装和运行在服务器上,不再是客户的PC机上
软件和服务交付周期缩短
持续集成
为了更高质量的快速交付,开发者和QA开始采用一些自动化技术
CI continuous integration,CI包含一系列工具的组合,如版本控制系统version control systems VCS、构建服务器、自动化测试工具
VCS帮助开发在中心服务器上维护程序源代码
CI帮助开发者和QA提升代码质量,缩短程序归档或模块打包周期,CI足以应对电子交付
持续交付
CI加上自动化部署是服务器上应用程序向用户提供服务的过程
如何将软件交付服务器?如何关闭、替换、回滚已有程序?如系统库也更新,如何升级?如何修改操作系统的用户和组设置?
基础设施包含服务器和网络,上述取决于开发、QA、预发布、生产等环境,每个环境都有不同的服务器配置和IP地址
CD continuous delivery,是CI工具、配置管理、编排工具的组合,可实现上述问题
配置管理
帮助配置操作系统,包括用户、用户组、系统库,可管理多台服务器,以便更换服务器时与所需状态或配置保持一致;支持将应用程序部署或安装到服务器中;配置管理支持自动或手动更新程序
手动触发执行-蓝绿部署基础设施即代码
配置管理工具不仅支持操作系统或虚拟机,还支持云基础设施,在云端创建并配置网络、存储和虚拟机,通过配置文件自动化设置云基础设施
配置管理比标准操作过程SOP有优势,复制环境也容易
编排
也是配置管理工具的一种,在配置和分配云资源时,更智能和动态
编排工具可管理多个服务器和网络资源,当管理员要增加应用程序实例时,编排工具可确定可用服务器,自动部署和配置应用程序和网络
编排工具超出SDLC范围,但在扩展应用程序和重构基础设施资源时有助于持续交付
微服务趋势
模块化编程
每个模块独立且可重用,可由不同开发团队维护
当实现应用程序时,应用程序只需初始化,并使用这些模块来构建更大的应用程序
模块化编程可提高软件开发速度,减少重复造轮子
包管理
Java或轻量级编程语言都有自己的模块或包管理工具
java-Maven、python-pip、ruby-rubyGems、JavaScript-npm
包管理工具允许将模块或软件包注册到集中式或私有存储库,并下载必要的软件包
MVC设计模型
不断添加新功能和逻辑时,应用程序需要更多的模块、包、框架组合,尤其是服务器端应用程序
常需要连接数据库如RDBMS、身份验证服务器如LDAP,通过具有适当的设计的HTML将结果返回用户
因此需要软件设计模型,以便应用程序中使用一组模块开发应用程序
MVC模型视图和控制器,一种流行的程序设计模型,定义了三个层次:
视图层:负责用户界面UI、输入输出I/O
模型层:负责数据查询和持久化,如加载和存储数据到数据库
控制层:负责视图和模型之间的业务逻辑
简化MVC的框架:Struts、SpringMVC、Ruby on Rails、Django
单体架构应用程序
MVC定义了每层的边界,但源代码model、表示代码view、业务逻辑controller都存在统一VCS存储库中,虽然应用程序体积变大,会变得更慢,被称为单体架构monolithic,包括构建巨型exe\war程序的代码
当添加或修改其中一个模块时,会影响很多代码,导致没人愿意维护这些代码
远程过程调用
Sun RPC remote procedure call 远程过程调用,允许远程使用模块,有利于将应用程序划分为多个进程(程序)单个程序可以有单独的源代码存储库
如RPC实现的NFS network file system网络文件系统,NFS客户端和服务器之间的CPU和操作系统版本是互相独立的
如RPC风格的编程语言,unix、c语言有rpcgen工具生成桩代码负责网络通信、Java有类似RMI remote method invocationRMI编译器生成连接远程java进程的桩代码,以调用方法并获得结果、Object C有分布式对象,.Net有远程处理功能
远程过程调用,用于客户端\服务器模型结构,不是分布式架构,出于安全角度,不建议在公共网络上使用
SOAP(HTTP/SSL)作为数据传输的Web服务,使用XML作为数据表示和服务定义Web服务描述语言(Web Services Description Language,WSDL),然后使用通过描述、发现和集成(Universal Description、Discovery、Integration,UDDI)作为服务注册来查找Web服务应用程序
RESTfull
HTTP/SSL作为RPC传输,并简化为RESTfull设计:
使用HTTP和SSL/TLS作为传输标准
使用HTTP方法进行创建、加载、上传、删除(create、load、upload、delete,CLUD),如get、post、put、delete
使用URI作为资源标识符
使用JSON作为标准数据表示
RESTfull基于HTTP支持任何编程语言
如有多个RESTfull程序,需要考虑在VCS上管理多个源代码及如何部署多个RESTfull服务器,CICD帮助构建和部署更多RESTfull服务应用程序
微服务
微服务设计关注
无状态,不将用户会话存储到系统,有助于扩展
无共享数据存储,有自己的数据存储如数据库,有助于封装后端数据库,代码重构,单个微服务中更新数据库模式
版本控制和兼容性,经常更改和更新API,应定义版本,具有向后兼容性,有助于与其他微服务和应用程序解耦
集成CICD:采用CICD流程来消除管理工作
构建微服务应用程序框架
Spring Boot、Flask
单体架构应用程序设计和微服务设计
微服务也包括接口层、业务逻辑层、数据存储,但应用程序(服务)由多个微服务构建,不同应用程序可在下面共享相同的微服务,开发者可以添加或修改现有的微服务
CICI有助于开发和部署多个微服务,但资源和复杂性(如虚拟机、操作系统、库、磁盘卷、网络)在数量上无法与单体架构应用程序进行比较,在工具和角色可以支持云上大型自动化环境
自动化工具
自动化实现快速软件交付,解决管理许多微服务的复杂性
自动化工具不是普通的IT\基础设施应用程序,如Active Directory、Bind(DNS)、Sendmail(MTA),为了实现自动化,工程师应具备编码技能尤其是脚本语言,及基础结构运维技能,如虚拟化、网络、存储
DevOps是开发和运维的结合,可实现自动化流程,如持续集成、基础设施即代码和持续交付
持续集成工具
Git VCS工具,使用git进行check in\out代码,托管git服务如Github、Bitbucket,创建保存Git存储库,并与其他用户协作
构建服务器,如jekins、Teamcity
托管服务,软件即服务Software as a service,SasS,如Codeship、Travis CI
持续交付工具
配置管理工具:Puppet、Chef、Ansible
托管Chef平台:AWS Ops Works
AWS CloudFormation有助于实现基础设施即代码,支持AWS操作的自动化:
创建VPC
在VPC上创建子网
在VPC上创建Internet网关
创建路由表以将子网关联到Internet网关
创建安全组
创建云主机实例
将安全组关联到云主机实例
AWS CodeDeploy聚焦软件部署,允许用户自定义
监控和日志工具
Amazon CloudWatch是AWS内置监控工具
ELK是流行堆栈组合,是Elasticsearch、Logstash、Kibana的组合
Logstash有助于采集日志并转为JSON格式,发送到ES,ES是一个分布式JSON数据库,Kibana可以可视化存在ES上的数据
Grafana 也是一个流行的可视化工具,与时间序列数据库连接,如Graphite、InfluxDB,时间序列数据库用于存储扁平的、非规范化的数字型数据,如CPU使用率和网络流量,时间序列数据库有内置优化,可节省数据空间,更快的查询历史数据,大多数DevOps监控功能根据后端都适用时间序列数据库
沟通工具
如使用多个DevOps工具,需切换访问不同控制台以检查CICD流水线是否正常工作,
如需考虑, 将源代码合并到GitHub、在Jenkins上触发新构建、触发AWS CodeDeploy以部署新版吧应用程序
通信工具,可以帮助集成这些DevOps工具,任何人都可查看事件并评论,如Slack、HipChat
公有云
云计算,可以轻松实现CICD和自动化工作,特别是公有云API为DevOps提供多CICD支持
Amazon Web Services、Google Cloud Platform
网友评论