DevOps架构入门

DevOps(Development和Operations的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

它是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。

它的出现是由于软件行业日益清晰地认识到:为了按时交付软件产品和服务,开发和运营工作必须紧密合作。

从定义来看,其实devops就是为了让开发、运维和QA可以高效协作的流程。(可以把DevOps看作开发、技术运营和质量保障(QA)三者的交集。)

 
DevOps

DevOps对应用程序发布的影响

在很多企业中,应用程序发布是一项涉及多个团队、压力很大、风险很高的活动。然而在具备DevOps能力的组织中,应用程序发布的风险很低,原因如下 [2] :

(1)减少变更范围

与传统的瀑布模式模型相比,采用敏捷或迭代式开发意味着更频繁的发布、每次发布包含的变化更少。由于部署经常进行,因此每次部署不会对生产系统造成巨大影响,应用程序会以平滑的速率逐渐生长。

(2)加强发布协调

靠强有力的发布协调人来弥合开发与运营之间的技能鸿沟和沟通鸿沟;采用电子数据表、电话会议和企业门户(wiki、sharepoint)等协作工具来确保所有相关人员理解变更的内容并全力合作。

(3)自动化

强大的部署自动化手段确保部署任务的可重复性、减少部署出错的可能性。

 
 

与传统开发方法那种大规模的、不频繁的发布(通常以“季度”或“年”为单位)相比,敏捷方法大大提升了发布频率(通常以“天”或“周”为单位)。


实现DevOps需要什么?

硬性要求:工具上的准备

上文提到了工具链的打通,那么工具自然就需要做好准备。现将工具类型及对应的不完全列举整理如下:

代码管理(SCM):GitHub、GitLab、BitBucket、SubVersion

构建工具:Ant、Gradle、maven

自动部署:Capistrano、CodeDeploy

持续集成(CI):Bamboo、Hudson、Jenkins

配置管理:Ansible、Chef、Puppet、SaltStack、ScriptRock GuardRail

容器:Docker、LXC、第三方厂商如AWS

编排:Kubernetes、Core、Apache Mesos、DC/OS

服务注册与发现:Zookeeper、etcd、Consul

脚本语言:python、ruby、shell

日志管理:ELK、Logentries

系统监控:Datadog、Graphite、Icinga、Nagios

性能监控:AppDynamics、New Relic、Splunk

压力测试:JMeter、Blaze Meter、loader.io

预警:PagerDuty、pingdom、厂商自带如AWS SNS

HTTP加速器:Varnish

消息总线:ActiveMQ、SQS

应用服务器:Tomcat、JBoss

Web服务器:Apache、Nginx、IIS

数据库:MySQL、Oracle、PostgreSQL等关系型数据库;cassandra、mongoDB、redis等NoSQL数据库

项目管理(PM):Jira、Asana、Taiga、Trello、Basecamp、Pivotal Tracker

在工具的选择上,需要结合公司业务需求和技术团队情况而定。(注:更多关于工具的详细介绍可以参见此文:51 Best DevOps Tools for #DevOps Engineers)

软性需求:文化和人

DevOps成功与否,公司组织是否利于协作是关键。开发人员和运维人员可以良好沟通互相学习,从而拥有高生产力。并且协作也存在于业务人员与开发人员之间。

出席了2016年伦敦企业级DevOps峰会的ITV公司在2012年就开始落地DevOps,其通用平台主管Clark在接受了InfoQ的采访,在谈及成功时表示,业务人员非常清楚他们希望在最小化可行产品中实现什么,工程师们就按需交付,不做多余工作。

这样,工程师们使用通用的平台(即打通的工具链)得到更好的一致性和更高的质量。此外,DevOps对工程师个人的要求也提高了,很多专家也认为招募到优秀的人才也是一个挑战。

========================================================

DevOps :Development和Operations的组合词。
它是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。 ——来自百度百科


 
头像

接下来,我将把我搭建该技术框架的入门过程记录下来:过程中遇到很多坑,只要硬着头皮上就没什么能把你阻挡,让我们一起go!go!go!
需求:在日常开发过程中,需要频繁的修改业务逻辑,然后需要部署到服务器上供QA测试。这个过程对于大多数开发人员来说不是难事,但是这个重复性的过程很浪费开发人员的时间,我们希望达到,只要我们将改好的业务逻辑代码commit & push,自动部署更新到服务器上并启动。就可以测试了。
首先写一个自动部署的服务:

/*
* @Author: Hifun
* @Date: 2020/1/3 16:07
 */
package main

import (
    "fmt"
    "io"
    "net/http"
    "os/exec"
)

func reLaunch() {
    path := `../deploy.sh`  // shell脚本
    cmd := exec.Command("/bin/bash", "-c", path)
    err := cmd.Start()  // 这里引入了"os/exec"包,来操作外部的命令和可执行文件
    if err != nil {
        fmt.Printf("Execute Shell:%s failed with error:%s", path, err.Error())
        //return
    }
    fmt.Printf("Executing command: %v ...\n", path)
    cmd.Wait()
}

func firstPage(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "<h1>Hello ,this is auto deploy server!</h1>")  // 给前端展示
    reLaunch()   // 这里利用的简单的异步操作
}

func main() {
    http.HandleFunc("/", firstPage)   // 绑定方法
    http.ListenAndServe(":5000", nil)   // 添加监听
}

这里使用url的方式来实现自动部署:他的方便之处在于:强大的github支持一种服务Webhooks,这个在后面说。
reLaunch方法里调用了外部shell脚本,来帮我们执行操作:杀掉当前已经运行的服务进程(如果存在的话)-> 拿到最新的代码 -> 启动服务.

#!/bin/bash
kill $(pgrep webserver)
cd ~/devops/
git pull https://github.com/hifuny/devops.git
cd webserver/
chmod 777 webserver
./webserver &

准备好了之后,我们把服务传到服务器并启动,在git里配置Webhooks.入口如图:


 
image.png

然后,我这里新建一个测试用的业务逻辑的服务:

/*
* @Author: Hifun
* @Date: 2020/1/3 11:48
 */
package main

import (
    "io"
    "net/http"
)

func firstPage(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w,"<h1>Hello! ,this is my firstPage!</h1>")
    w.Write([]byte("Show!"))
}

func main() {
    http.HandleFunc("/", firstPage)
    http.ListenAndServe(":8000", nil)
}

业务逻辑服务写好后传到服务器并启动,我们能通过url访问:


 
image.png

看到已经启动成功。
然后我们在本地修改我们的业务逻辑代码,测试一下之前的自动化工具:

io.WriteString(w,"<h1>Hello! ,i am changed by deploy!</h1>")
    w.Write([]byte("Success!"))

执行commit, push
可以看到我们的脚本已经自动执行:


 
服务器截图

然后再访问我们之前的业务逻辑的服务:


 
image.png

已经成功更新了!
在整个过程中有以下几点是需要我们准备的:
1.go为我们提供了良好的跨平台的特性,因此我们只需要在windows中打包对应得Linux的可执行二进制文件就好了。设置的方法在我的上一篇教程里。

2.要掌握一定的关于shell脚本的基础命令。
3.对git的基本使用。
4.对Linux系统关于文件权限的基本了解。
5.在实际操作的过程中可能会遇到各种问题,要有探究到底的勇气和信心。



作者:Hifun丶
链接:https://www.jianshu.com/p/149ce7fc4604
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

作者:给你一颗小瓜子
链接:https://www.jianshu.com/p/c5d002cf25b9
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

posted on 2020-07-07 11:19  专注30  阅读(259)  评论(0)    收藏  举报

导航