首页 文章 精选 留言 我的

精选列表

搜索[devops],共3911篇文章
优秀的个人博客,低调大师

DevOps之旅:运维人员阅读源代码的实用技巧

作者简介 陈晨,基础架构工程师,目前就职于中国银联。主要负责IaaS平台、容器平台以及运维管理平台的建设工作。本文将着重介绍运维人员学习源代码的一些技巧。 一、准备阶段 1.制定计划 读源码和读书一样,必须有时间计划,deadline是第一生产力。 合理的制定计划可能需要你先全局掌握一下代码的结构,以及各个函数的重要程度、难易程度。 2.选择一本好书 作为学习资料,书一定是最好的。 网上资料太零散,学习起来可能不系统; 较为系统的书一般都会将开源代码的配置、集成进行详细的讲解;然后会介绍一些通用模块,最后再对每一个组件或者流程进行代码的跟踪分析。 在选书的时候,也应该注意选择。 可以通过书的各个章节介绍,来看该书是否按照这样的逻辑去讲述。 例如,笔者当初学习openstack的时候,根据目录选择了这样一本书:他的四个篇幅分别是基础-安装-代码-二次开发。这就是一个非常好的循序渐进的书。 3.选择一个好的IDE 笔者除了Java以外,全部使用Vim。当然,这完全取决于每一个人的习惯。 笔者一般比较喜欢轻量级的IDE,因此推荐一些轻量级的: Vim Sublime SourceInsight IDE的全称是集成开发环境。如果只是要将代码运行起来,只需要编译器或者解释器。代码完全可以在纯文本上进行编辑。 IDE提供更多的开发辅助功能,使得开发人员专注于代码的逻辑。 最常见的如自动纠错、代码补全、函数查询等功能。C的很多IDE还自动生成makefile,也省去很大的繁琐内容。 不过,IDE的功能性和简约型永远是一个悖论。 读者在选择IDE的时候,应当选择一个符合自己需求的IDE,不要过分追求功能强大。 一般来说,我们使用IDE可能有哪些辅助性的需求呢: 测试工具的集成 自动打包 代码定位 定制化、插件丰富 错误检查 调试 项目模板 4.下载完整版本库 完整的代码库是指反映代码迭代过程的各个历史版本。这样做有很多好处: 你可以获取代码的修改记录。 你还可以获取到完整的测试代码,当你要提交patch的时候,你可以借助版本管理工具生成针对不同版本的patch。 二、初识代码 1.阅读项目文档 大部分的开源项目都会对其架构有一定的描述,通读一下会让你项目有一个比较深入的认识。 重点关注类似Getting started、Example之类的文档,从中学习如何下载、安装、使用该项目所需要的知识。 比如openstack,官网上的网络拓扑讲解是最全面、准确的: 2.分类文件 分清楚代码库的各个文件的作用。 在恰当的时候,对所有文件做一个总体把握,有助于后续阅读代码的时候的优先级的选择。清楚哪些是核心、哪些是可以定制的。 如下是笔者收藏的nova的源码文件的部分内容: /nova/api/auth.py:通用身份验证的中间件,访问keystone; /nova/api/manager.py:Metadata管理初始化; /nova/api/ec2/__init__.py:Amazon EC2 API绑定,路由EC2请求的起点; /nova/api/ec2/apirequest.py:APIRequest类; /nova/api/metadata/__init__.py:Nova元数据服务; 。。。 。。。 刚开始写注释的时候,其实有的东西自己也不是很确定。这样的注释也没有最终能让你对代码的所有文件的关系有非常清晰的了解。 不过不要紧,在初期的时候就尝试去做这样的事情是有好处的,这可能是你掌握源码整体结构的第一步。 3.掌握开发框架 框架存在的目的就是简化开发。但是也会让代码不那么直观。 举个例子,很多用spring开发的开源软件,如果你连spring都不懂,你就会发现连代码入口都找不到。因为在开发框架下的代码都被“劫持”啦! 我们举个例子,spring+springmvc+mybatis开发web应用的时候。如果理解了这三个基础框架,你就可以很清楚的知道如下文件的作用: 所有的url对应的controller都在com.dc.controller中 所有的数据接口都在com.dc.dao中 所有的实体对象都在com.dc.entity中 所有数据接口和sql语句对应关系都在com.dc.dao.mapper中 所有的服务定义都在com.dc.service和com.dc.service.Impl中 更具体的,当我看到这样一个函数: 马上就知道是spring中的一个处理url路径时/的controller函数。 所以,如果确信开源代码使用了成熟的开发框架,请一定先熟悉该框架。 三、熟悉代码行为 1. 组件执行流程 较为复杂的系统都是分组件的,分别熟悉各个组件,理清他们之间的关系。 例如,openstack的执行流程图: 虚拟机启动过程如下: a. 界面或命令行通过RESTful API向keystone获取认证信息。 b. keystone通过用户请求认证信息,并生成auth-token返回给对应的认证请求。 c. 界面或命令行通过RESTful API向nova-api发送一个boot instance的请求(携带auth-token)。 d. nova-api接受请求后向keystone发送认证请求,查看token是否为有效用户和token。 2. 利用示例代码和单元测试 示例代码可以帮助你学会使用相关开源项目的API。 大部分的开源项目在开发的过程中,为了验证其实现的功能,都会写很多单元测试代码。这些代码其实是非常好的示例代码。 读单元测试的好处太多了,这里给大家罗列一下知乎网友总结出来的好处: 由于一个单元测试一般也就是几个小时的开发工作量,你很容易就能读懂相关的代码。 每个单元测试都是可以独立运行的,这样节省你跟踪调试的时间。 单元测试在很大程度定义了软件的功能,可以帮助你快速掌握项目的相关API。 如果你修改的开源项目的代码,你可以通过修改单元测试来验证你的修改是否正确。 注1:原文链接https://www.zhihu.com/question/19637879/answer/13545260 如果该项目有提供现成的example工程: 首先尝试按照开始文档的介绍运行example,如果运行顺利,那么恭喜你顺利开了个好头;如果遇到问题,首先尝试在项目的FAQ等文档里查找答案。 再次,可以将问题(例如异常信息)当成关键词去搜索,查找相关的解决办法,你遇到了,别人一般也会遇到,热心的朋友会记录下解决的过程。 最后,可以将问题提交到项目的邮件列表,请大家帮你看看。在没有成功运行example之前,不要尝试修改example。 运行了第一个example之后,尝试根据你的理解和需要修改example,测试高级功能等。 3. 跟踪分析 复杂的开源软件几乎没有一个是一个流程走到底的,这个时候就需要我们选择一个主要流程。 例如,在openstack中,笔者一开始就画了大量功夫去梳理创建虚拟机的流程。 第一步,从代码入口处沿着创建虚拟机这条流程进行一行一行的注释: 当该流程基本注释完成,自己也有所掌握后,抽丝剥茧,总结出更为直观、简介的表现方式: 当你逐渐理解了一个或者两个主要流程后,一般会发现其他的分支流程都十分类似。这就为掌握整个流程打下了很好的基础。 4. 对需要详细了解的函数进行排序 在安排自己深入阅读时,应该根据预估的工作量进行合理安排。 一般来说,初始化、读取参数等都是次要的,也是相对简单的。而核心模块就复杂的多。 还是以haproxy为例,main函数中最核心的代码就是run_poll_loop()。 笔者曾经尝试从init()函数开始,但是发现很多初始化的数据压根就不知道干什么,看过一遍后就都什么都记不得了。 但是直接从主函数开始,不断的发现对一些参数进行处理的时候,反向追踪他的初始化过程,则更容易理解。 四、掌握数据状态 1. 掌握数据流 从数据流的角度来讲,所有的代码逻辑都是在加工数据。 比如说openstack,从最初用户输入的虚拟机名称、配置等数据开始,openstack的代码逻辑对数据进行加工、处理、过滤、选择等内容,最终传递给libvirt,进行虚拟机的最后创建。 因此,掌握数据的组织方式,对理解代码逻辑是很有帮助的,也是二次开发的前提条件。 所以,在学习代码的时候,不断询问自己,我掌握数据的组织方式了吗?我掌握数据在整个流程中不断加工的流程了吗? 2. 使用debug观察数据状态 前面说到细化研究某一个流程的时候,一定要注意研究数据传递的方式和内容。数据流是理解流程的基础,扩展数据流也是二次开发常用的技能。 例如,在eclipse通过debug打断点,获取流程中某个点的数据内容: 3. 使用标准输出观察数据状态 笔者有时候也喜欢直接使用console进行输出,打印对象的一些信息。这个用于验证某段代码有没有被执行、或者查看某个数据的时候,也十分有效。 例如,通过chrome的标准输出查看javascript的输出: 五、举一反三阶段 1.研究底层调用 研究底层调用往往是运维的常用手段。比如在openstack的运行初期,我们对openstack的源码不熟悉,怎么办呢? 直接研究openstack的底层调用。Openstack底层都是调用libvirt的接口,创建虚拟机等基本操作我们都研究了个遍。 因此,对于大多数openstack的问题,我们都能直击问题现场,进行恢复和排查。 那研究底层调用对理解源代码有什么好处呢? 笔者在基本熟悉了openstack的所有底层调用之后,带着这样的问题去看源码“代码究竟是如何从入口逐渐运行到我所知道的那个底层调用的呢?”,笔者很快就梳理了代码的执行流程。 2. 学会在社区或者stackoverflow提问题 社区里面的热心人是相当多的。 当然笔者认为,提问也需要一定的技巧,这里引用知乎网友的话: stackoverflow很多人问问题有一个共性,就是对提出的问题先发表自己的见解,描述自己的思路,自己达到了什么地方,这是对各位回答者的尊重。 你在阐述自己所能达到的地步,你表明了你已经做出了什么样的努力,这是你对问题的诚意。 这样回答者才会觉得有回答的价值,或许是想起自己过去也曾经小白却努力的岁月,或许是觉得你有相助的价值,或者等等。所谓自助者人助罢了。 原文链接:http://www.zhihu.com/question/24228283/answer/27102646 3. 学会画流程图 流程图可以更方便的展现代码执行的逻辑。忽略不重要的代码,强调主要的函数。 概要设计中常用的框图: 思维导图: 作者:陈晨 来源:51CTO

优秀的个人博客,低调大师

DevOps:软件架构师行动指南2.5 更多阅读材料

2.5 更多阅读材料 美国国家技术与标准研究所的云定义是SP 800-145这个专门出版物的一部分[NIST 11]。 针对不同类型的内存以及网络连接的延迟数据源自http://www.eecs.berkeley.edu/~rcs/research/interactive_latency.html。 Jeff Dean的主题发言列出了新数据中心的问题[Dean]。 James Hamilton(来自AWS)在他的报告中给我们展示了大规模发生的故障,报告获取链接如下:http://www.slideshare.net/AmazonWebServices/cpn208-failuresatscale-aws-reinvent-2012。 可以在http://memcached.org/访问Memcached系统的网站。 Hadoop分布式文件系统

优秀的个人博客,低调大师

【DevOps】第二步:Docker镜像打包上传至仓库

镜像仓库 镜像仓库有好些地方可以存,大部分的公有云均提供免费的镜像仓库,常见如下: 腾讯云:https://console.cloud.tencent.com/tke2/registry/user/self?rid=1(需登录) 阿里云: https://cr.console.aliyun.com/cn-hangzhou/instances/repositories(需登录) 自建私有仓库,参考之前的一篇文章docker私有仓库搭建 Docker Hub:不涉及私密的或者你想公开的镜像可以上传到https://hub.docker.com/。 打包上传shell脚本 统一打包流程,每个项目中添加make.sh脚本文件,一个典型的make文件如下: #!/bin/sh echo "开始制作镜像..." image_tag=`date +%Y%m%d` #_%H%M echo "当前时间:$image_tag" docker build -t ccr.ccs.xxx.com/abc/api:v${image_tag} . echo "制作镜像成功!" echo "登录" docker login echo "镜像版本提交" docker push ccr.ccs.xxx.com/abc/api:v${image_tag} echo "镜像最新版本提交" docker tag ccr.ccs.xxx.com/abc/api:v${image_tag} ccr.ccs.xxx.com/abc/api:latest docker push ccr.ccs.xxx.com/abc/api:latest 注:Dockerfile和make.sh在同一目录下。 docker build 命令用法 docker build [OPTIONS] PATH | URL | - 命令参数 命令, 缩写 描述 --add-host 增加自定义主机和IP映射(host:ip) --build-arg 设置构建时的变量 --cache-from 用于缓存资源的镜像 --cgroup-parent 可选的容器上层cgroup --compress 使用gzip 压缩构建context --cpu-period 限制CPU CFS(完全公平调度程序)周期 --cpu-quota 限制CPU CFS(完全公平调度程序)配额 --cpu-shares , -c CPU共享(相对权重) --cpuset-cpus 允许执行的CPU (0-3, 0,1) --cpuset-mems 允许使用的内存 (0-3, 0,1) --disable-content-trust true 忽略镜像验证 --file , -f Dockerfile名称 (默认 ‘PATH/Dockerfile’) --force-rm 始终移除中间容器 --iidfile 镜像ID写入文件 --isolation 容器隔离技术 --label 设置镜像metadata信息 --memory , -m 内存限制 --memory-swap 交换限制等于内存加交换,“-1”:启用无限制交换 --network 在生成期为RUN指令设置网络模式 (API 1.25+) --no-cache 不使用缓存 --output , -o 输出(格式:type=local,dest=path) (API 1.40+) --platform 如果支持多平台,则设置 (experimental (daemon)API 1.32+) --progress 默认auto,设置进度输出类型 (auto, plain, tty). --pull 总是尝试拉取最新的镜像版本 --quiet , -q 不输出构建过程,成功时直接打印镜像ID --rm 默认true,构建成功后删除中间容器 --secret API 1.39+ Secret file to expose to the build (only if BuildKit enabled): id=mysecret,src=/local/secret --security-opt Security options --shm-size Size of /dev/shm --squash experimental (daemon)API 1.25+ Squash newly built layers into a single new layer --ssh SSH agent socket or keys to expose to the build (only if BuildKit enabled) --stream (experimental (daemon)API 1.31+ ) Stream attaches to server to negotiate build context --tag , -t 镜像名和tag,格式为‘name:tag’ --target Set the target build stage to build. --ulimit Ulimit 选项 参考已有的范例,Dockerfile和shell脚本只需要简单熟悉一下即可编写。这一步很关键,是自动打包的根本。make.sh脚本灵活,可执行配置文件的替换,多镜像版本的生成等自定义操作。相比自动化构建平台基于Dockerfile和git commit来构建更具灵活性。 jenkins job配置 源码管理 jenkins会将git项目拷贝至job目录下。 构建触发器 jenkins定时检测代码变动(这里是每分钟检测一次),如果发现有代码提交记录,则触发下一步的构建。 构建 构建包括2部分: SSH site: SSH的主机地址 Command: 在主机上执行的命令 构建日志 打包流程 提交代码 jenkins每分钟检测git仓库分支的代码变动 若有代码提交记录,触发下一步构建 构建过程调用项目的make.sh文件,执行镜像打包上传 参考 https://docs.docker.com/engine/reference/commandline/build/

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册