微服务并不能解决你的烂代码问题

点击上方蓝字关注我们

微服务并不能解决你的烂代码问题

很久以来,软件的交付质量一直是一个大家比较关心的问题,而程序员和架构师也一直在极力寻找一种更好的方式来构建应用系统。随着互联网爆炸式的增长,对于系统的交付速度和质量的要求也日渐提高,这不仅对程序员写的程序,而且对架构师对整个系统的架构能力提出了更高的要求。

如果你学过领域驱动设计,你会知道系统的构建应该建立在业务模型之上,而不是围绕着数据库的表,视图,存储过程。如果你学过系统设计的六边形理论,你同样也会知道提炼业务核心模型才是构建一个具有可扩展性系统的重心所在。如果你了解过CI/CD,从客户的满意度来说,持续交付要比瀑布模型交付好太多。

image
image
image

再加上非功能性的一些需求,最典型的:系统的高可用,高扩展性,高性能。这一系列要求对于传统的开发模式根本不可能满足。伴随着容器技术,基础设施自动化,大型集群的流行,微服务也慢慢的浮出水面。它并不是被发明出来的,而是随着软件系统的不断发展衍生出来的。

最重要的是很多公司在采用了微服务的架构之后确实明显改善了软件系统的交付速度和质量,并且可以有更多的机会去尝试新的技术,比如现在流行的容器技术,云原生,Serverless等。在团队与团队之间,职责更加清晰明显,而且不同技术栈的团队也可以很融洽的进行合作。

当然,我比较排斥那种为了效仿而进行的技术改革。每个公司都有自己的技术沉淀以及债务,不要妄图利用一种完美的技术来填平所有的焦油坑。

微服务

到目前为止,网络上关于微服务的定义有很多版本,无论什么样的文字定义都始终围绕着以下核心:

微服务是一组小而自治并且能协同工作的系统服务。它不仅仅是代码级别的重用,更重要的是业务级别的重用和自治。

这让我不禁想到了“中台”的定义,中台其中一个很明显的目标是要达到公司业务级别的重用,进而反馈给业务一些结果来达到闭环效果。

image
微服务一定要足够小吗?

每一个系统,在诞生的时候其实都很小,随着产品的不断发展,才会赋予这个系统更多的职能,但是,这个系统最主要的特点仍然是:一个单体应用

什么叫单体应用?说白了,所有的代码都在一个工程中,对外输出的也只有一个工程。每次修改任何一个功能,哪怕是修改一个字符,都需要重新发布。

随着时间的推移,当这个单体越来越大的时候,你会发现大量的重复性代码,大量的重复性功能,甚至会存在大量的重复性SQL语句。这些还只是表面现象,如果想要修改一个功能,居然会意想不到的影响很多地方,随着人员的离职等情况,这些代码没有人会熟悉,慢慢的传说中的“屎山”出现了。

image

如果有一个技术且职责比较上心的技术经理或者总监,一些单体应用至少还会根据不同的模块进行抽象,用接口的方式来达到代码内的职责分离和高内聚。这里多说一句:高内聚,松耦合在设计任何系统的时候都非常重要,尤其在大的单体系统应用中。

把因为相同原因而变化的模块(代码)划分到一起,而把不同原因而变化的模块(代码)分离出来

高内聚松耦合可以说在微服务中体现的淋漓尽致,因为微服务就是按照业务的不同模块来进行划分的,微服务之间拥有明确的业务边界,某个功能属于哪个微服务,应该写在哪个微服务里,一目了然。

至于微服务的划分粒度,说实话,业界并没有一个明确的标准。但是服务之间的边界是明确的,假如说:一个微服务内还存在多个小模块,这些小模块是否也应该划分为更小的微服务呢?这本质上还是微服务粒度划分的问题,也是一个没有明确答案的问题,不过却可以依据一下几个准则去进行微服务的规划:

  • 模块的大小。如果一个模块可以在两周之内进行重写,那这个模块完全可以独立成微服务。

  • 模块是否存在独立的变化。如果一个模块会频繁变化,可以考虑独立成一个单独的微服务。

  • 模块是否具有比较高的性能需求。如果一个模块在性能这个指标上有比较高的要求,为了应对这种要求可以划分为独立的微服务。

  • 虽然每个人对小都没有明确的概念,但是对“大”却有着明确的敏感性。当你感觉一个系统“大”的时候,就可以考虑进行拆分了

警告:系统进行微服务的拆分,并非是越小越好,更多的时候在拆分的时候要根据团队,运维能力等进行综合考虑,在总量不变的情况下,小意味着数量多,数量多意味着必须要投入更多的人力物力去管理运维,并且也会引入分布式下的很多问题。这个之后咱们具体详聊.....

微服务优势明显吗?

到目前为止,全网都在吹嘘进行微服务的划分,但是在脱离具体业务场景的条件下,大力倡导拆分微服务,这很明显就是在教人耍流氓而不负责任。我某天看到一篇文章返璞归真的要回归单体应用,我看完之后默默的点了个赞,从文章中具体的业务来说,确实采用单体应用比微服务更合适,因为他们的业务边界很模糊,可以说没有业务边界,一味的进行微服务划分,带来的是一系列的分布式问题,对于公司而言反而没有益处。

说到微服务的优势,一般都是对比单体服务来说的,单体应用有哪些缺点呢?

  • 开发效率低:所有的开发在一个项目改代码,递交代码相互等待,代码冲突不断

  • 代码维护难:代码功能耦合在一起,新人不知道何从下手

  • 部署不灵活:构建时间长,任何小修改必须重新构建整个项目,这个过程往往很长

  • 稳定性不高:一个微不足道的小问题,可以导致整个应用挂掉

  • 扩展性不够:无法满足高并发情况下的业务需求

这些你都可以用百度搜到,这里不再详细展开了。微服务的优势明显吗?我想说,对于很多大型系统确实很奏效,但是对于一些中小型系统,那就不一定了。

就像很多架构师吹嘘的充血模型一样,一味的贬低贫血模型一无是处,无形中总是在拉低自己的格局。

高扩展性

当系统处于单体系统的时候,如果某一个模块遇到性能问题或者想要保证高可用特性,只能将整个系统进行多份部署来达到目的,哪怕是只有一个小小的部分存在性能问题。如果把这一部分进行了微服务的拆分,那么就可以只针对这个微服务进行扩展了,无论是性能还是高可用的要求,都可以单独进行,而不必影响其他模块,而且公司对于成本问题上要低很多。

举一个简单例子:假如有一个电商系统,包含了商品,订单,支付等模块,对于性能而言,用户浏览商品量要比下订单量大很多,很显然,商品模块对于性能有着更高的要求,这个时候就可以考虑把商品这个模块独立出来,以便提供横向扩展的高性能能力。

弹性

在传统的单体系统中,当服务不可用的时候,就意味着所有的模块都不可用,虽然也可以通过部署多份大单体的方式来降低这个概率,但是这种方式始终是种诟病。在微服务架构中,如果一个服务不可用,并不会影响全部的服务,当然如果做好了微服务的降级,限流等工作,将会把影响降低到最低。

部署简单

在大单体时代,哪怕是修改了一行代码也需要重新编译整个项目来进行重新部署,这种部署方式其实隐含的风险非常大,所以很多大单体的运维人员都不会频繁进行项目的部署,而且部署的时候很多时候要准备好通宵(因为风险大),尤其是那种多个迭代的大部署行为。在微服务的架构下,每个微服务都是独立部署的,这样就可以针对迭代进行更快的上线操作,而不影响其他服务,而且就算是线上出问题,回滚操作也非常快。能够快速的迭代新功能意味着用户可以快速的尝试新功能,这在我们交付高质量的软件是非常有利的。

技术自由

由于每个微服务之间交互都采用RPC或者REST进行交互,而这些交互方式又有着严格的规范,所以每个微服务采用什么技术栈是相对自由的,不同团队之间技术的差异性在微服务架构下不复存在,而且每个团队都可以尝试一些新技术,最重要的是每个微服务都可以根据自身的业务特点来进行合适的技术选型,比如:当一个典型的文档存储微服务,我们可以选择采用mongoDB来做存储;当一个搜索型微服务,我们可以采用ES来做存储。

image
程序员的福音

在大单体的时代,时常会发生“我的代码被哪个孙子改了”的情况,由于大家都在一个大的代码库进行工作,还会偶尔发生代码互相覆盖的情况(我想很多人都发生过这种情况)。而在微服务的架构下,每个划分出来的微服务都有自己的独立代码仓库,最重要的一点这个代码仓库只有一个团队在使用,至于团队内的沟通要比团队之间沟通畅快的多,所以代码管理这部分几乎不会出现什么问题。

同一个业务的功能,只需要开发一遍,至于使用端是网页,还是桌面,还是小程序或者app,都可以重用一套接口,真正的实现了业务上的重用。这才是程序员想要的结果啊!!!!

而且对于某个微服务的重构工作会非常顺利,因为每个微服务的代码量不会很大,而且业务也很清晰,这在大单体时代是不存在的。

总结

就像“人月神话”中描述的一样,微服务也并非银弹。如果一个架构师盲目的进行微服务的拆分会面临着分布式系统的一系列的问题,比如:网络的不可靠性带来的问题,分布式事务带来的一致性问题,分布式监控的问题,还有最重要的CAP抉择问题等。所以:

微服务有时候可能并不适合你,谁用谁知道!!!

No END

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

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

相关文章

不要设计模式

看到首页讲设计模式的文章和书,有些感慨抒发一下。我买过一本设计模式的书,基本上看了24个模式的名称,大致把这几个名字记住了,我并没有沉下心来深入理解,并不是书讲得不好,我是一个…

protobuf在java应用中通过反射动态创建对象

2019独角兽企业重金招聘Python工程师标准>>> ---恢复内容开始--- 最近编写一个游戏用到protobuf数据格式进行前后台传输,苦于protobuf接受客户端的数据时是需要数据类型的如xxx.parseForm(...),这样就要求服务器在接受客户端请求时必须知道客户端传递的数…

[轉]数据挖掘工具的选择

轉自:http://blog.csdn.net/redvalley/archive/2006/02/06/593233.aspx 一、数据挖掘工具分类   数据挖掘工具根据其适用的范围分为两类:专用挖掘工具和通用挖掘工具。 专用数据挖掘工具是针对某个特定领域的问题提供解决方案,在涉及算法的时候充分考虑…

Java秘技之Json数据解析与转换 -- Java使用示例

概要 json是前后台交互常用的数据格式,在java后台中经常需要实现java bean、list和json字符串的相互转化,故简单介绍不同框架的使用,提供简单工具类。 在Java中,常见的json框架有:Jackson(springboot默认…

黑科技轮胎:有能发电的,脑洞简直不要太大...

全世界只有3.14 % 的人关注了青少年数学之旅人类历史上的很多伟大发明,都是由脑洞产生的,这样那样,然后问题就解决了,过程很复杂,却又很简单,甚至有时候,是一种很奇葩的方式。在漫长的历史进程中…

将权限授予文件夹和程序集

http://technet.microsoft.com/zh-cn/office/zdc263t0.aspx 如何:将权限授予文件夹和程序集 (2003 System) 注意 适用于 本主题中的信息仅适用于指定的 Visual Studio Tools for Office 项目和 Microsoft Office 版本。 有关更多信息,请参见按应用程序…

VS 2019 16.11正式发布 | 新功能(Hot Reload 热重载)试用

VS 2019 16.11VS 2019 16.11已于2021.8.10正式发布。(https://devblogs.microsoft.com/visualstudio/visual-studio-16-11/)这个版本主要包括以下内容:Visual Studio中的Git工具体验改进支持.NET应用程序的Hot Reload(热重载&…

测试String, StringBuilder,StringBuffer 的数据,我居然发现这些了~~

懒的搞什么开头了,直接撸代码吧 想了想还是给大家看看学姐照片吧,保持眼睛的明亮,代码敲多了,伤眼 1: 作StringBuilder与String的拼接比较 Test public void testString () {String s"";long begin S…

LeetCode --- Valid Parentheses

题目链接 Problem discription Given a string containing just the characters (, ), {, }, [ and ], determine if the input string is valid. The brackets must close in the correct order, "()" and "()[]{}" are all valid but "(]" and…

作息时间安排:

7:20起床7:30出发7:40早饭11:30-12:00午饭13:00-13:30午睡5:30-6:00 打水、 锻炼身体(跑步到燕宏桥)6:00-7:30 学习 英语、…

厉害了!这里藏着通关学霸的秘籍

全世界只有3.14 % 的人关注了青少年数学之旅在这个资讯丰富且易获取的时代,越来越多的人不愿意花时间阅读书籍,碎片化阅读成了主流。人们获取的东西多而杂,很难系统、全面。海量信息对人是冲击,更是诱惑。谁不想了解天下奇闻&…

学习了MPLS ×××

最近学习了一下MPLS 技术,确实蛮复杂的,而且觉得MPLS 技术主要是用在ISP以及厂商里面,是未来网络架构的一种主流技术,要完全掌握确实不是一件容易的事情,没法子,只能好好的先把理论学通了~加油加油~~TCP/IP路由技术我也还在看,全英文版,总体感觉英文版要比中文版容易理解的多了…

『 编程思维』之我见

编程思维,对于一个开发人员来说是必备的,但凡能让应用跑起来,不管应用的大小,优劣,说明这个开发人员都具有编程思维,毕竟程序认可了这个开发人员逻辑,能启动起来。小到几行代码,一个…

史上最全图详解Jvm—诊断工具和JVM监控

3.1. 工具概述 使用上一章命令行工具或组合能帮您获取目标Java应用性能相关的基础信息,但它们存在下列局限: 1.无法获取方法级别的分析数据,如方法间的调用关系、各方法的调用次数和调用时间等(这对定位应用性能瓶颈至…

STL容器[10]

STL容器[0] 转载于:https://www.cnblogs.com/motadou/archive/2009/11/29/1613152.html

去医院看病如何开开心心出来? | 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅(图源百度弱智吧,侵权删)

BF533和触摸屏接口芯片TSC2200调试日志

问了一下亿旗&#xff0c;终于调出来了&#xff0c;下面是部分源代码&#xff1a;//************************************************// //** file: spi.c //** target: ADSP-BF533 //** creat time: 2008-8-19 #include <ccblkfn.h> #include <cdefBF533.h> #in…

玩机器学习,能不知道它?

推荐一个端对端的开源机器学习平台编程导航 致力于推荐优质编程资源 ????项目开源仓库&#xff1a;https://github.com/liyupi/code-nav跪求一个 star ⭐️大家好&#xff0c;我是编程导航的小编 Made 。今天安利一个强大的开源机器学习平台—TensorFlow。TensorFlow 是一个…

js获取当前页面url网址等信息

使用js获取当前页面的url网址信息。 1、设置或获取整个 URL 为字符串&#xff1a; window.location.href 2、设置或获取与 URL 关联的端口号码&#xff1a; window.location.port 3、设置或获取 URL 的协议部分 window.location.protocol 4、&#xff08;www.jbxue.com&…

面试被问到Java 静态代理/动态代理?不用怕,这样子就可以!!

理解Java动态代理需要对Java的反射机制有一定了解 什么是代理模式# 在有些情况下&#xff0c;一个客户不能或者不想直接访问另一个对象&#xff0c;这时需要找一个中介帮忙完成某项任务&#xff0c;这个中介就是代理对象。 例如&#xff0c;购买火车票不一定要去火车站买&…