.Net微服务实战之DevOps篇

技术只是基础

  该系列的两篇文章《.Net微服务实战之技术选型篇》和《.Net微服务实战之技术架构分层篇》都是以技术角度出发描述微服务架构的实施。

  如果技术选型篇叙述的是工具,那么架构分层篇讲的就是技巧,而本篇要讨论的就是原则。一直以来我会给身边向我探讨问题的人灌输一种理念,没有什么技术银弹,因为我们做的是软件工程,提供的是问题相应的解决方案,不同类型问题的解决方案是存在着本质上的差异。

  继续提供之前的源码:https://github.com/SkyChenSky/Sikiro

PS:该篇文章与.Net无关,其实主要是沿用前面两篇文章的命名,此外我认为DevOps不是简单的工具使用,应从软件工程角度进行出发。

什么才是优秀的架构设计?

  曾经有好几个同行问过我同一个问题:什么才是优秀的架构设计?我一直信奉着两句话一个定律

  • 架构服务于业务,技术服务于架构 

  • 康威定律(简单理解成组织架构的设计等同于系统架构的设计)

  架构设计其实就是一种方案取舍,在有限资源里(包括但不限人力、时间)能让团队顺利的实施技术,同时满足业务规模的需要,我认为可以称之为优秀的架构设计,简单来说两个字合适

 

架构核心要素

  核心的主要5大:性能、可用性、伸缩性、扩展性、安全性。 

  而我们所讨论的微服务,选择了扩展性,牺牲了可用性、性能,扩展性的目的就是为了快速响应需求变化降低系统耦合度提高系统模块的复用度。而微服务的调用是通过跨进程的网络通信的,跟进程内方法调用比无疑是慢了一个单位;原本单服务99.99%高可用,假如现在三个服务就是99.99%*99.99%*99.99%=99.97%。

  当然我们可以在基于微服务的通过引入其他技术提高可用性、伸缩性和安全,但是确保无疑是牺牲了性能,除了性能还会在团队开发效率与运维复杂度上会受到影响。由此可见,没有万能技术手段,而架构其实在取舍。

  引入一种技术必定带新的技术问题这是个必然结果,刚提到团队开发效率运维复杂度会受到影响,那是否有办法缓解甚至解决并提高呢?既然涉及到团队、流程这些关键字那么就应该向软件工程方向寻找方案,合适架构实施还需要合适的开发模式进行支撑的,而风靡全球的DevOps就是不二之选。

软件工程

   在行业盛传的一条公式:软件 = 软件工程 + 程序,可想而知软件工程的占据多么重要的比重。那么什么是软件工程?百度是这么解释的:

  软件工程是研究和应用如何以系统性的、规范化的、可定量的过程化方法去开发和维护软件,以及如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来的学科。它涉及到程序设计语言、数据库、软件开发工具、系统平台、标准、设计模式等方面。

  我自己重新总结了一个软件工程的通俗描述,通过多人协作、有目标、有步骤、有计划的并使用科学方法论指导开发与维护程序的这个过程。也可以用一条公式表达:软件工程 = 工具 + 流程 + 模式。

 

软件危机

  软件工程的出现目的是为了解决软件危机的。软件危机其实是当时落后的软件生产方式无法满足迅速增长的计算机软件需求,从而导致软件开发与维护过程中出现一列的严重问题的现象。那么三次软件危机是什么呢?我整理了个表格(详细可以自行百度阅读)

名称时间原因解决方案
第一次软件危机

20世纪60年代—70年代

使用机器语言或者汇编语言在特定的机器上进行软件的设计与编写,引出的“抽象性”和“可移植性”的问题高级的编程语言+瀑布开发模式
第二次软件危机

20世纪80年代—90年代

软件复杂性进一步升级,需要更好更好的“可组合性”(Composability)、“可延展性”(Malleability)以及“可维护性”(Maintainability)面向对象编程语言+设计模式
第三次软件危机2005年至今软件的发展速度已经远超于硬件的发展,体现于需求复杂度、技术复杂度、团队协作更好的工具、开发模式、与协作流程

 

   由上可见,软件的快速发展直接促使了软件工程上的进步,新的工具、新的开发与设计模式,新的协作流程也随之而生。

开发模式的发展

  我工作多年经历了多家公司,所经历的有三种开发模式,瀑布、敏捷、DevOps。那么这三种主流的开发模式也对应着三个发展阶段:

瀑布开发模式

  瀑布开发模式是在第一次软件危机1970时Winston Royce博士提出来。其思想是把项目过程划分为主要的六个阶段:需求收集、需求分析、软件设计、程序编码、软件测试、运行维护。团队划分也通过岗位职责进行划分:产品团队、开发团队、测试团队、运维团队。到目前为止该开发模式仍然用到做项目制的开发团队。

  那么其优点与劣势也很明显,优点是计划明确,职责清晰,按部就班的完成就好。缺点是周期容易拖得太长,不容易调整变更,每个人只为自己职责范围内的负责,跨部门沟通成本大(这就是为什么我在图里画了两堵墙的原因)。我自己呆过一个瀑布模式的团队,在项目立项后就会被项目经理调动资源成为团队,而开发人员只会在这一次批次负责编码与修改测试反馈的问题,基本上上线后的问题跟你无关(除非紧急严重的),其他的BUG也许是下一个批次的另外一个开发人员帮你填。

 敏捷开发模式

  准确的说敏捷开发是一种价值观和原则的体现,2001年17位IT大佬想把瀑布发模式这种重量级的开发过程替换成一种更加轻量级,可惜大家都没有达成统一意见因此把各自都认同的观念整理出来成为敏捷宣言。

  敏捷开发其实把产品、开发、测试三种岗位职责的人紧密的联系了起来,由原来长周期的大目标拆解成了一个个短周期的小目标。他之所以快,不是因为写代码快了,而是节省了很多不必要的前置条件与返工,同时小步快跑的交付也可以提高团队的士气,一个长周期项目那枯燥、乏味、痛苦的过程,谁试谁知道。

  举个例子,大家都是为公司的同个产品努力,没有什么合同谈判可言,只要需求要求相互了解清楚并且可行就可以开干了。写详细设计文档的时间,还不如花时间多沟通下需求的核心点,想办法设计得更容易满足需求。短周期的交付后,产品与客户就可以及时的查看交付效果并相应的优化与调整。(快速响应并不代表随时随地接受变更响应,可以统一归到下一个迭代周期,我不赞同拍拍脑袋的变更,自己都没清楚的功能怎么说服客户使用?

  

  敏捷开发的最大好处之一就是短周期的持续交付,这样方式能在现阶段的互联网行业得到更快速的响应与市场的抢占,同时能很好的进行技术改进与试错。但是这种”野蛮的“方式会让开发团队与运维团队形成一条鸿沟,而鸿沟的形成主要原因是运维团队希望软件的运作是可靠的,所以他们对资源的变动、新技术的使用尤为的小心、谨慎。

  我曾经呆过一个敏捷开发团队,生产出了问题运维团队会自行去修改配置,当然会越改越错了,而且一天发布次数多了,就会起争执。

DevOps

  DevOps可以看过是敏捷的扩展与延申,它的出现就是为了解决开发团队与运维团队的那条鸿沟,只要存在人工处理的方式担心的问题总会出现,同一段程序无论执行多少次相同输入的输出总是一致的,但是人的处理却不能保证,那么使用自动化改善协作的过程,鸿沟自然就跨越了,。那么开发团队与运维团队就可以为相同的目标与方向而努力。而组织架构也将演变成如下:

  

  从上图也与开头的康威定律做了一个很好的呼应。

 我是如何实施DevOps的?

 

技术

  这个角度是大家最乐意去关注的,在我们团队主要使用了以下技术,脚本什么的我就不花时间贴出来了,在我看来工具的使用,只要花点时间就能解决。

类型名称
持续集成/持续交付Jenkins
源代码管理Gitlab
云平台阿里云
软件包管理器私有Nuget
代码检查Reshaper
容器化Docker
分布式链路跟踪SkyWalking
日志系统ES+Filebeat+kibana
系统监控Prometheus

  原本代码检查想引入SonarQube代替人工检查+Reshaper,可惜于服务器资源不足。

  对于一般的团队,我建议优先从Gitlab+Jenkins搭建好完成CI/CD,其次把日志系统给完善起来,这两者完成得越早,给团队带来的收益就越高,后续才会有更多的时间来完善整套技术体系,这是一个良性的循环

  人延申出的就是团队与文化,经过上面的讲解大家都意识到软件工程就是一样多人协作的工作,只有团队目标一致,共同负责承担团队的项目,愿意一同与项目成长才能很好的实施DevOps。就像多匹马拉车一样,只有它们都有共同的目标的时候才能快速拉车到目的,如果他们一匹向东一匹西,只会让马车无法前行甚至四分五裂。

  在我的团队,因为在招聘人员的时候已经进行过了筛选,所以在合作上非常的顺利,当然我也经常在例会和业余的时候都会给大家传达思想,让团队成员真正的从实际意义上去理解现在的做法。

  对于已经成型的团队来说如何去落地呢?无非三种,激励、考核和逐步试行。如果有条件的公司可以设置奖金激励,如果有绩效考核的可以将DevOps实施纳入考核目标,如果两者都没的,那就选取团队里愿意改变的同事进行试行,使用过后都说好的那么更会有说服力。 

流程 

   为了落实了文化的改进与技术的使用的这个过程,我们需要科学的、有步骤、有计划的方式完成这项工作,并且可以让这套标准化的方式可以重复使用到其他项目上。

  在我的团队是有产品、前端开发,后端开发、测试、运维组成的。我采用了原型模式+DevOps模式:

  •   产品人员会优先使用Axure RP工具把需求整理产出原型并与需求方确认。

  •   产品确认好的原型就是我们技术的输入,技术拿到需求后会做一次需求评审,主要是排查需求疑惑和确认需求目标。

  •   需求明确后,由我使用Visual Project任务拆解与排期,任务会建立在我们的项目管理系统Redmine上,如果任务周期过程,我会拆分成多个可交付的短周期,一般会控制在2个星期内。

  •   接到任务后,大家就跟根据自己的任务使用PowerDesigner数据库设计(早期是由我独裁设计,后期团队发展壮大了,就由业务负责人各自设计),在这个阶段,如果有新的服务与新的工具库需要部署,我就会正面与运维沟通让他把自动化给完成。

  •   因为我们是前后端分离的,所以我们使用了Swagger减少了写接口文档的时间,所有任务是否完成以前端是否对接好接口为主导,前端对接好后,就会在Redmine修改自己的任务状态并新建一个测试任务给到测试。

  •   测试会根据自己写好的测试用例,进行对完成的任务进行场景测试,如果有BUG会在Redmine提给相应的人进行修改。一般会先由前端人员排查是否是他的交互上的BUG,如果确认是数据问题那么就会转给后端开发,开发人员定位BUG时,可以通过我们的SkyWalking和Kibana联合定位问题,定位问题时间一般都在2-10分钟。

  •   代码合并到测试分支后就会通过Jenkins发布到测试环境,生产环境的发布是合并到生产环境后手动确认发布的。

  除此之外,每周一会有一个例会内容不限工作,也可以分享周末去哪里娱乐了。在该迭代周期快到结束的2-3天会开一个进度会议,看看大家完成情况。因为公司没有下午茶,所以我们自己通过玩抢红包领到最大的两个的请吃下午茶,最少一星期一次。

 结束

  该篇到这里就分享结束了,也是该系列的最后一篇,我曾经认为技术与管理必须二选一,自从我成为了一个技术与团队的负责人后,终于让我认识到,一个优秀的技术思想还是需要一些管理手段才能很好的实施,而我们的技术管理无非就是软件工程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309204.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云挑战赛

文章目录第一题题目:题解:第二题题目题解第三题题目题解第四题题目:题解第五题题目题解第六题题目题解第七题题目:题解第八题题目:题解;题解赛后出第一题 题目: 【单选】filter 方法意图过滤传入的订单列…

使用C#编写STM32对接物联网平台IoTSharp发送遥测数据

在之前的文章中, 我们阐述了如何用C#在STM32上写第一个Hello world , 有朋友抱怨国内介绍文章, 都是一个 Hello world , 然后再也没有音讯, 写到这里我想提一下我的初心, 那就是告诉所有人C#无所不能&…

JavaMVC之JSON

JSON 8.1、什么是JSON? JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛。采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅读和编写…

龙芯团队完成CoreCLR MIPS64移植,在github开源

国产龙芯的软件生态之中.NET不会缺席,毕竟 C# 与 .NetCore/Mono 也是全球几大主流的编程语言和运行平台之一,最近一段时间听到太多的鼓吹政务领域不支持.NET, 大家都明白这是某些人为了自己的利益打压使用.NET技术的公司,我今天写…

来谈一谈专注力的真相

这是头哥侃码的第205篇原创在日常生活(或工作)中,你有没有遇上过这样的情况?比如你正在跟小伙伴讨论一个技术方案,聊着聊着,突然小A脑袋一抽筋,问你:“老大,咱们这周五晚…

Java访问控制修饰符

访问控制修饰符 Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。 Java 支持 4 种不同的访问权限。 default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。 使用对象:类、接口、变量…

数据结构与算法专题——第三题 最长公共子序列

一:作用最长公共子序列的问题常用于解决字符串的相似度,是一个非常实用的算法,作为码农,此算法是我们的必备基本功。二:概念举个例子,cnblogs这个字符串中子序列有多少个呢?很显然有27个&#x…

Java实现两个递增有序链表合并成一个递增有序链表和两个非递减有序链表合成一个非递增有序链表

代码如下: package sjjgniub;import java.util.LinkedList; import java.util.Scanner;SuppressWarnings("all") public class LinkList {private class Node{int data;Node next;public Node(){}public Node(int data){this.data data;next null;}}Node head nu…

职场PUA到底有多可怕?

阅读本文大概需要 5.2分钟。“小张,好好干啊,明年一定给你加薪!” 。从小张入职这家公司起,这是老板对小张第三次这么说了。小张每天干到晚上12点,任劳任怨,虽然一直没涨过工资,但是老板的不断认…

数据结构与算法专题——第二题 优先队列

前段时间玩小爬虫的时候,我把url都是放在内存队列里面,有时我们在抓取url的时候,通过LCS之类的相似度比较,发现某些url是很重要的,需要后端解析服务器优先处理,针对这种优先级比较大的url,普通的…

数据结构与算法专题——第一题 Bitmap算法

在所有具有性能优化的数据结构中,我想大家使用最多的就是hash表,是的,在定位查找场景上具有O(1)的常量时间,多么的简洁优美,但是在特定的场合下:①:对10亿个不重复的整数进行排序。②&#xff1…

Telegraf和Grafana监控多平台上的SQL Server

问题SQL Server在很多企业中部署在多个平台上(Windows,Linux和Container),需要一种能支持多平台的解决方案用于收集和展示相关的监控指标。我选择企业中比较流行的监控展示工具Grafana和监控指标收集工具Telegraf进行实现。这也是为了方便与企业中已经在存在监控平台…

酸吗?28岁程序员财务自由宣布退休!

财务自由是我们这代人的共同追求,有程序员28岁就做到了。近期的一条新闻就直接刷屏了,28岁今日头条程序员手握上亿期权宣布退休,引发一片羡慕嫉妒恨。履历如下:2008-2012就读于暨南大学政治与行政管理专业,自学编程。2…

nuget 是如何还原包的

nuget 是如何还原包的Intro一直以来从来都只是简单的用 nuget 包,最近想折腾一个东西,需要自己搞一个 nuget 包的解析,用户指定 nuget 包的名称和版本,然后去解析对应的 nuget 包并添加引用到项目, 于是就想搞明白 nug…

使用Azure AD B2C为ASP.NET Core 设置登录/注册

一,引言上次关于Azure AD B2C 讲到一些概念,有介绍到,Azure AD B2C 也是一种身份验证的解决方案,但是它运行客户使用其首选的社交,企业或者本地账户标识对应用程序和API进行单一登录访问。同样,Azure AD B2…

使用 Azure Function 定时启动云 VM

点击上方蓝字关注“汪宇杰博客”导语微软 Azure 平台的 VM 可以做到定时自动关机,然而只有 DevTest Lab 服务中的 VM 能够定时开机,普通用途的 VM 还没有上线这个功能。但是没关系,我们可以曲线救国,通过最新版的 Azure Function …

文章目录 | .NET Core on K8s学习之旅 (更新至20200618)

.NET Core on K8s学习之旅更新记录:-- 20200511 增加Ingress & Nginx Ingress介绍-- 20200515 增加Ocelot API网关集成示例介绍-- 20200525 增加Ingress实现灰度发布示例介绍1关于这个系列文章自从2018年底离开工作了3年的M公司加入X公司之后,开始了…

【Blog.Core重要升级】:封装服务扩展层

昨天有群里小伙伴咨询了一个问题:关于如何在Blog.Core项目中,实现多资源终端的问题,比如这样:一个AdminMvc的管理后台(MVC项目),一个WebApi项目,一个ConsoleApp的控制台项目&#xf…