istio回归「单体应用」对我们的启发

大家好,我是Z哥。

这次分享给大家的是一篇与技术相关的文章,但是我想表达的核心观点并不仅限于技术范围。

我们中国有句古话,分久必合,合久必分。

很多事物的发展都逃不开这个规律。如今,这件事也正在分布式、微服务概念大行其道的软件开发领域里发生。

就在这个月5号,在近些年大热的Service Mesh中被热炒的istio宣布回归到单体应用架构。

可能有的人对istio不是很了解,我稍作下介绍。

istio是一种以sidecar模式为应用程序建立网络通信的技术框架,基于其搭建的通信网络具有负载均衡、服务间认证、监控等功能。这些功能都是微服务系统中必不可少的。

它亮点就在sidecar模式的无代码侵入上,配合上“黄金搭档”——docker,让它成为了近两年火热的Service Mesh概念的带头大哥之一。

这个框架的设计非常整洁,各个模块的职责清晰,被不少人视作“高内聚、低耦合”的范本。但是它的每个模块都是单独维护的,其中Mixer的模块甚至是单独一个进程来运行。

就这些简单的分离,其实也是“分布式”、“微服务”的「分治」思想的体现。

此时,作为Service Mesh的领头羊宣布回归单体应用,虽然对它自身来说只是一个架构调整而已,但间接给国内各种炒作微服务概念的人敲了一下警钟。

身边有不少人或者企业其实在盲目的追求微服务架构,觉得少了这个就不好意思说自己在互联网企业做技术一样。

并且有一些还在追求更细粒度的微服务拆分上乐此不疲。原本一个应用程序就能搞定的一件事,非得拆成4个、5个程序相互协调才能完成。这样真的划算吗?要打上一个大大的问号。

其实类似这样的事情在我们的生活中很常见,但是在生活中我们却理性得多。

想象一下,假如现在你要去倒垃圾,那么需要做以下这几件事。换上衣服、给垃圾分类、下楼走到垃圾桶前倒掉。

你会请3个人分别帮你换衣服、做垃圾分类以及下楼去倒掉吗?我想肯定不会,这不是搞笑么。

别笑,过度的服务化拆分就是这么变扭的一件事。一个叫ChangeClothesService、一个叫WasteSortingService,一个叫DumpRubbishService……

那么,如何判断当下的系统是否过度拆分?你可以试着回答以下几个问题。

  1. 各个部分是否支持单独部署和更新?如果不能,就是过度拆分。

  2. 是否可以由不同的开发人员维护不同的部分?如果不能,就是过度拆分。

  3. 是否存在不同的运维策略。比如,不同的安全策略、部署策略等。如果不存在,可能是过度拆分。

  4. 是否经常费很大劲才能确定问题的根源在哪一个服务上?如果是,可能是过度拆分。

当然,拆分的好处是显而易见的,分而治之,成就“高内聚、低耦合”的终极目标。

但其实单体应用做好模块化划分和管理,也能成就“高内聚、低耦合”这个目标,同样不会成为“Mud Ball”。

不过,为了在同一个项目里达到“高内聚、低耦合”的效果,这必然会比使用服务化的拆分方式付出更多的代码管理成本。毕竟后者对代码进行了硬性的隔离,而单体应用的模块化拆分全靠每一位参与编码的程序员是否共同遵守了一些共识。

比如,我们在编码的时候要尽可能的共同遵守以下这些原则:

  • 单一职责原则

  • 里氏替换原则

  • 依赖倒置原则

  • 迪米特法则

  • 开闭原则

  • 接口隔离原则

  • 合成复用原则

为了确保大家遵守统一的规则,对codereview的要求就会提高,所以代码管理成本是实实在在会增加的。但是这些额外的成本相比过度微服务化后增加的复杂度所带来的隐性成本,哪个划算还真得好好算算。

istio团队已经深刻认识到了这个问题,所以他们喊出了一个口号:

Complexity is the root of all evil or: How I Learned to Stop Worrying and Love the Monolith.

不知道你是怎么看待「单应用模块化」和「分布式服务化」两者的利弊的呢欢迎留言给我一起讨论哦。

推荐阅读:

  • 聊聊面试的事(应聘方)

  • 新的一年,程序员如何让自己更值钱?

原创不易,如果你觉得这篇文章还不错,就「在看」或者「分享」一下吧。鼓励我的创作 :)

如果你有关于软件架构、分布式系统、产品、运营的困惑

可以试试点击「阅读原文

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

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

相关文章

LeetCode 110平衡二叉树-简单

给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。示例 1: 输入:root [3,9,20,null,null,15,7] 输出:t…

c语言中如何使用面向对象编程,如何使用C语言的面向对象

我们都知道,C才是面向对象的语言,但是C语言是否能使用面向对象的功能?(1)继承性typedef struct _parent{int data_parent;}Parent;typedef struct _Child{struct _parent parent;int data_child;}Child;在设计C语言继承性的时候,我…

LeetCode 112路径总和-简单

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root [5,4,8,11,…

ASP.NET MVC升级到ASP.NET Core MVC踩坑小结

写在前面ASP.NET Core是微软新推出的支持跨平台、高性能、开源的开发框架,它的优势不必多说,因为已经说得太多了。当然,现在依然有着数量庞大的系统运行于.NET Framework上,由于有大量的Break Changes,很多项目项目团队…

用函数求C15的值C语言,南开19春学期(1503、1509、1603、1609、1703)《C语言程序设计》在线作业-1辅导资料.docx...

南开19春学期(1503、1509、1603、1609、1703)《C语言程序设计》在线作业-1辅导资料.docx 南开19春学期(1503、1509、1603、1609、1703)C语言程序设计在线作业-11、D 2、B 3、C 4、A 5、D 一、单选题共40题,80分1、以下对一维整型数组 a 的正确说明是 Aint a10 ;Bint…

LeetCode 563二叉树的坡度-简单

给定一个二叉树,计算 整个树 的坡度 。 一个树的 节点的坡度 定义即为,该节点左子树的节点之和和右子树节点之和的 差的绝对值 。如果没有左子树的话,左子树的节点之和为 0 ;没有右子树的话也是一样。空结点的坡度是 0 。 整个树…

CIO/CTO都应该掌握和了解的EA(企业架构)

我们已进入数字化技术推动的第四次工业革命,是以工业互联网建设为标志。单纯从IT的视角管理信息化系统让许多企业深陷管理困境,解决问题也是按下葫芦浮起瓢。实际上,IT的服务对象是企业的战略、组织、管理、流程等一系列的要素,因…

扛并发主力军,引入应用层缓存

1.背景缓存的使用一定是今后开发中100%会用到的技术,尤其是Redis相关的问题,如果面试官不问我我几个缓存相关的问题,那我觉得我可能是去了个假的互联网公司。这里考虑到有些初学者刚刚出校园或者自学中,准许我多费口舌介绍下关于缓…

LeetCode 783二叉搜索树节点最小距离-简单

给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。 示例 1: 输入:root [4,2,6,1,3] 输出:1 示例 2: 输入:root [1,0,48,null,null,12,49] 输出:1 提示&…

使用 VMware + win10 + vs2019 从零搭建双机内核调试环境

我在前面的文章——《使用 VMware win10 VirtualKD windbg 从零搭建双机内核调试环境》分享了使用 windbg 进行双机内核调试的环境搭建的步骤。有小伙伴儿留言说:在使用 vs 进行双机内核调试的时候,总是连不上。希望能发一篇使用 vs 进行双机内核调试…

C#中的9个“黑魔法”与“骚操作”

C#中的9个“黑魔法”与“骚操作”我们知道 C#是非常先进的语言,因为是它很有远见的“语法糖”。这些“语法糖”有时过于好用,导致有人觉得它是 C#编译器写死的东西,没有道理可讲的——有点像“黑魔法”。那么我们可以看看 C#这些高级语言功能…

LeetCode 872叶子相似的树-简单

请考虑一棵二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。 举个例子,如上图所示,给定一棵叶值序列为 (6, 7, 4, 9, 8) 的树。 如果有两棵二叉树的叶值序列是相同,那么我们就认为它们是 叶相似 的。 …

.NET Core开发实战(第35课:MediatR:让领域事件处理更加优雅)--学习笔记

35 | MediatR:让领域事件处理更加优雅核心对象IMediatorINotificationINotificationHandler这两个与之前的 Request 的行为是不一样的,接下来看一下代码internal class MyEvent : INotification {public string EventName { get; set; } }internal class…

LeetCode 559N叉树的最大深度-简单

给定一个 N 叉树,找到其最大深度。 最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。 N 叉树输入按层序遍历序列化表示,每组子节点由空值分隔(请参见示例)。 示例 1: 输入:root [1,null,3,…

android 5.0状态栏下载地址,Android沉浸式状态栏(5.0以上系统)

Android沉浸式状态栏(5.0以上系统)沉浸式状态栏可以分为两种:1.直接给状态栏设置颜色 (如下图:)这里写图片描述java代码形式:if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {Window window activity.getWindow();window.addFlags(WindowManager.LayoutParams…

解析“60k”大佬的19道C#面试题(下)

解析“60k”大佬的19道C#面试题(下)在上篇中,我解析了前 10 道题目,本篇我将尝试解析后面剩下的所有题目。解析“60k”大佬的19道C#面试题(上)这些题目确实不怎么经常使用,因此在后文中&#xf…

android 卡顿代码定位,Android 性能优化实例:通过 TraceView 定位卡顿问题

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?背景项目中使用了鸿洋大神的TreeView树状结构控件, 但是由于在主线程中使用了注解/反射来定位节点, 内容一多就有点卡顿。因此通过android …

DotNetCore三大Redis客户端对比和使用心得

前言稍微复杂一点的互联网项目,技术选型都会涉及Redis,.NetCore的生态越发完善,支持.NetCore的Redis客户端越来越多,下面三款常见的Redis客户端,相信大家平时或多或少用到一些,结合三款客户端的使用经历&am…

android elevation 白色,Android Elevation

简介:在Android API21,新添加了一个属性:android:elevation,用以在xml定义View的深度(高度),也即z方向的值。除了elevation之外,类似于已有的translationX、translationY,也相对应地新增了一个t…

(译)创建.NET Core多租户应用程序-租户解析

介绍本系列博客文章探讨了如何在ASP.NET Core Web应用程序中实现多租户。这里有很多代码段,因此您可以按照自己的示例应用程序进行操作。在此过程的最后,没有对应的NuGet程序包,但这是一个很好的学习和练习。它涉及到框架的一些“核心”部分。…