微服务介绍

背景

微服务是什么?杜克大学教授DanAriely说过一段非常出名的话,用来表述Big Data的发展现状。我觉得把这句话放到微服务身上也极其贴切。

Micro-services is like teenage sex:
Everyone talks about it, nobody really knows how to do it, everyo ne thinks everyone else is doing it, so everyone claims they are do ing it

微服务就像青春期性行为的话题,所有(小屁孩)都在讨论它,但没人知道怎么做,所有人都以为其他的人都在做,因此所有人都宣称他们自己也在这么做。

大到BAT级的应用,小到两三人的软件作坊,开发团队都会说自己的系统是使用“微服务架构”,这就像几年前大数据被吹到天上的时候,只要有一个数据库就可以说自己的系统是“基于大数据技术”。那这些所谓的微服务架构,到底是真微服务还是伪微服务?又或者是为了微服务而微服务呢? God knows

一字箴言——微

要说微服务,那么就绕不开这个微小的微字。亚马逊的掌门人JeffBezos提出过一个很有意思的观点: The two pizza principle,双披萨原则。

Teams shouldn’t be larger than what two pizzas can feed

言下之意就是,如果两个Pizza还不能让你的团队吃饱,那么你的团队可能太大了。很可惜,它并没有说Pizza的大小,而且他的团队也没有老师这号凭-己之力就可以干掉2个Pizza的人。但是Jeff提出了一个蛮有建设性的意见,就是保持小规模的团队。
在这里插入图片描述
如果我们保持规模较小的特战队模式,那么这个团队的项目/模块规模必然也要控制在-定范围以内,他们所负责的项目也应当是-组相对较小,并且独立的功能单元。通常情况下并不是先有团队再有业务架构,实际上我们的团队应该是围绕“业务功能来组织的。

对于微服务的划分,什么粒度的微服务才是合适的?这个没有标准的答案,假如你的用户只有100个,那么还需要做服务划分吗?我想并不需要,因为对这种规模的项目来说,单体应用是更好的选择微服务反而会增加运维和研发成本。那么当你的应用要承接几十万用户的时候,无论是从交付迭代的效率来说,还是从高可用的角度来说,微服务架构会是更好的选择。

微服务的印象标签

微服务领域有众多开源项目,比如后面我们要深入学习的Spring Cloud就是目前这个领域的头牌。但是要提醒大家的是,并不是说你在项目中应用了微服务的开源技术,那么这个项目就摇身一变成了微服务架构,土鸡穿了马甲还是土鸡,可变不成凤凰。这些开源技术就像一个人的外功招式, 武术架子使的再漂亮,没有内功加持还是花架子。

那么微服务领域都有哪些所谓内功?其实这些都是软件设计中很常见的准则,并不是什么高深的功夫,但是这些准则可以很好的应用到微服务规划,或者用来识别业务主链路。我们来回顾一下这些耳熟能详的软件设计方法论。

拆迁办事处

对我们来说最直观的感受就是一个字“拆”,应用微服务化的第-步就是理清楚两个问题,拆什么和怎么拆。字面意思上很好理解,就是将一大坨纠缠在- -起的服务拆分成单个服务,剥离出去独立提供服务。在稍后的小节里我们将一起来探讨拆迁办的办事 儿准则。

单一职责

软件工程的新理念层出不穷,但“单一职责”这句口号喊了几十年仍然是一条Golden Rule。如果说设计模式是“微观”领域的单一职责,那么微服务架构就是在“宏观”层面上做到单一职责。这也是整个微服务话题最容易引战的部分,因为它涉及到微服务的拆分,至于怎么个拆法,那就公说公有理婆说婆有理了。

比如对大型互联网公司来说,“大中台”就是一套构建在集团层次上的服务治理理念。拿阿里来举例,集团各个事业部的业务模型最终都对接到所谓的“大中台”,从前端的商品服务、营销优惠服务、订单和用户服务,再到底端链路的支付结算和汇金平台等等,都有对应的中台业务方做支撑,在整个集团层面已经把中台业务做了细致拆分和领域划分,大大节省了新业务的接入成本。对中小型业务来说,拆分粒度不需要过细,识别出核心主链路,围绕主链路做拆分即可。

单一职责不仅涉及到服务拆分,在微服务领域,这种职责划分要求将数据库、开发、测试、发布和运维都划归到一个领域模型里,由一个团队完全掌控应用的整个生命周期管理。就拿电商业务中的商品模块来举例,商品的数据完全存放在商品微服务中,任何上下游系统都要通过商品服务提供的接口获取数据,而不是像单体应用那样直接访问数据库。尽管这种方式增加了系统复杂度,但是对于庞大的应用系统来说,各个微服务模块可以用一种“小步快跑”的模式做迭代发布,提高了产品迭代速度。

研发团队赋能

很多公司都存在这么一个问题,研发团队处于食物链的最底层。发布要经过QE团队的同意,然后再寻求运维团队的帮助来部署项目 。生产环境的任何权限看不到也摸不着,每次都要辗转找到线上OPS团队来排查问题,一个小小的datafix也要经过层层审批。你要说这类公司能做好微服务,不管你信不信,反正我是不信。

如果你的开发团队没有被充分赋能,自己的微服务都不能说了算,那一定不能好好施展拳脚。开发团队作为最了解应用系统的一方,却需要找那些对系统一知半解甚至一无所知的人来审批哪怕一个微小的线上操作,这显然不太合理。要做好微服务,就需要充分赋能你的研发团队,让他们掌握更多的话语权。

在这个问题上阿里是这样做的,研发人员除了不能让生产服务器原地爆炸,其他事情几乎都能做。即便是线上数据订正,除非涉及到的记录数量非常庞大,那需要找分派给部门的DBA审批一下,绝大部分数据订正只要自个儿团队里审核一下就好。大部分生产环境的权限也只要找直属主管审批就好了,就连集群扩容缩容都可以在团队内部解决。微服务团队就成了封疆大吏一般的存在,在自己的地盘就是自己说了算。

所以呢,充分赋能开发团队,这是现在互联网公司主流的价值观。

可独立部署

每一个微服务模块都应当是一个独立打包,独立部署的应用,在发布流程上与上下游应用没有直接的依赖,由开发团队直接负责线上发布操作。这种方式特别适合应用于微服务模块,保证快速迭代。在这种模式下对接口升级有特殊要求,如果你对接口进行了重大功能改造,同时又不能100%保证向前兼容的情况下,那么就需要提供一个新的接口,而不是在老接口上大动手脚,因为你无法保证上游应用可以兼容这些改动。当所有上游应用都切换到新接口后,老的接口没有流量了,这时候才可以将老接口下线。所以我们在很多互联网公司的项目里会看到一个业务功能对应好几个同名接口,但各个接口之间版本号不同(比如placeOrderV1,placeOrderV2)

阿里在项目发布部署方面的做法是这样的,将运维的工作全数交给开发团队自己负责,每个团队自己(或者事业部)来拟订发布时间窗口和发布策略(比如采用蓝绿发布或者金丝雀发布),OPS团队大部分转型去做运维工具的开发,纯OPS的团队人数极少。这在一定程度上也是充分附能研发团队的一种方式。

当然了,独立部署的方式也有一个弊端,你的改动也许不经意间导致了下游团队的bug。因为独立部署的模块做全链路end-to-end测试非常困难而且耗时间,所以很多小改动可能并没有做全套回归测试,也没有知会下游应用。在16年我经历过一个线上故障,所有上架商品的优惠计算全部失效,后来排查发现,淘系营销优惠服务调用了一个比较“冷门”的接口来读取用户信息,而上游团队以为这个接口没人在用,于是在某次发布中把接口直接下线了。

本文已收录至我的个人网站:程序员波特,主要记录Java相关技术系列教程,共享电子书、Java学习路线、视频教程、简历模板和面试题等学习资源,让想要学习的你,不再迷茫。

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

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

相关文章

excel(vab)删除空行

删除第一、二、三列位空的所有行(8000)行范围以内 代码如下: Sub Macro1()Dim hang As Integer For hang 8000 To 1 Step -1If Sheet1.Cells(hang, 1) "" And Sheet1.Cells(hang, 2) "" And Sheet1.Cells(hang, 3) "&quo…

系统性学习vue-vue中的ajax

vue中的ajax 配置代理常用发送Ajax请求方式跨域方式一方式二 vue-resource插槽默认插槽具名插槽作用域插槽 配置代理 常用发送Ajax请求方式 xhr new XMLHttpRequest() 在真正开发中不常用,比较麻烦jQuery 封装了xhraxios 封装了xhr 与jQuery相比优势是&#xff1a…

怎样才能找到合适的产品说明书模板 方法献上

制作一份专业而吸引人的产品手册对于企业来说至关重要。然而,对于许多企业和个人而言,制作产品手册可能是一个挑战,因为需要一定的设计和排版能力。为了帮助大家更轻松地制作出优质的产品手册,下面将向大家推荐三款优秀的产品手册…

Ovtio不同版本下载

关注 M r . m a t e r i a l , \color{Violet} \rm Mr.material\ , Mr.material , 更 \color{red}{更} 更 多 \color{blue}{多} 多 精 \color{orange}{精} 精 彩 \color{green}{彩} 彩! 主要专栏内容包括: †《LAMMPS小技巧》: ‾ \textbf…

2024年汉字小达人区级选拔备考——附加题:汉字和国学常识

上海的孩子们已经率先开启了悠长的寒假生活。在寒假期间,除了完成寒假生活、学校安排和要求外,还可以做些什么呢?不妨来为2024年汉字小达人做些准备吧!每天花个15分钟左右,背一背、做一做,轻松掌握汉字小达…

翻译: Streamlit从入门到精通 构建一个机器学习应用程序 三

Streamlit从入门到精通 系列: 翻译: Streamlit从入门到精通 基础控件 一翻译: Streamlit从入门到精通 显示图表Graphs 地图Map 主题Themes 二 1. 构建一个机器学习应用程序 在这一部分,我将带你了解我做的一个关于贷款预测的项目。 贷款的主要利润直…

“15个必备的自动化测试工具,助你构建2024年的自动化策略!“

以下为作者观点: 如何选择正确的自动化测试工具?自动化测试工具是旨在通过自动化测试脚本验证功能或非功能软件需求的应用程序,帮助加快发布速度、提高项目质量并强化成果。 自动化测试工具可以帮助开发测试人员轻松创建、运行和维护测试&a…

PlatformIO中ESP8266使用GxEPD库和U8G2库驱动 2.9寸黑白墨水屏显示中文

Content 0. 前言1. 安装platformIO环境2. 新建工程3. 添加外部库4. 修改U8g2_for_Adafruit_GFX库5. 代码和烧录 0. 前言 墨水屏是黄鱼淘的,效果还不错。 U8G2库一直编译不进去,显示汉字始终不太美观,个人一直不太喜欢汉字取模的方法&#x…

【RabbitMQ】RabbitMQ高级:死信队列和延迟队列

目录 设置TTL(过期时间)概述RabbitMQ使用TTL原生API案例springboot案例 死信队列概述原生API案例springboot案例 延迟队列概述插件实现延迟队列安装插件代码 TTL实现延迟队列实现延迟队列优化 设置TTL(过期时间) 概述 在电商平台…

Komodor:Kubernetes 监控工具全面指南

为了方便起见,Komodor 提供了一个简单的 Web 界面,以帮助您监控 Kubernetes 集群的状态。它拥有付费和免费增值计划,除了在出现问题时通知用户外,还拥有一系列方便的工具,用于跟踪和管理集群中部署的资源的状态。让我们…

计算机网络 应用层

文章目录 应用层域名系统 DNS域名系统概述互联网的域名结构域名服务器 文件传送协议FTP 概述FTP 的基本工作原理简单文件传送协议 TFTP 远程终端协议 TELNET万维网 WWW统一资源定位符 URL超文本传送协议 HTTP万维网的信息检索系统 电子邮件电子邮件概述简单邮件传送协议 SMTP邮…

2024年机器人和人工智能将通过4种方式改变行业

文 | BFT机器人 前言: 2023年是人工智能界充满创造性和突破性的一年,包括生成式人工智能在内的人工智能 (AI) 技术的出现引起了全球的关注并占据了头条新闻。然而,生成式人工智能在企业中的应用仍处于早期阶段,如何最好地利用这项…

大物②练习题解

1.【单选题】关于磁场中磁通量,下面说法正确的是( D) A、穿过闭合曲面的总磁通量不一定为零 B、磁感线从闭合曲面内穿出,磁通量为负 C、磁感线从闭合曲面内穿入,磁通量为正D、穿过闭合曲面的总磁通量一定为零 磁感线从…

“轻松粘贴,高效办公:自动粘贴文本技术让您事半功倍

"在快节奏的现代工作中,时间就是金钱。使用自动粘贴文本技术,让您告别繁琐的手动操作,提高工作效率。一键粘贴,释放您的双手,让您专注于创作和思考。让工作更高效,生活更精彩!" 首先…

广告投放场景中ABtest分析的评价、优化和决策建议

目录 写在开头1. AB测试基础知识1.1 AB测试概述1.2 原理和流程1.3 广告领域中的AB测试应用 2. 评价广告投放中的AB测试2.1 关键指标选择与解释2.2 统计学方法应用 3. AB测试分析中的常见问题与解决方案3.1 样本偏差3.2 季节性影响3.3 测试时长选择3.4 结果误解与分析失误 4. 优…

《TrollStore巨魔商店》TrollStore2安装使用教程支持IOS14.0-16.6.1

TrollStore(巨魔商店) 简单的说就相当于一个永久的免费证书,它可以给你的iPhone和iPad安装任何你想要安装的App软件,而且不需要越狱,不用担心证书签名过期的问题,不需要个人签名和企业签名。 支持的版本: TrollStore安装和使用教…

Markdown 流程图绘制详解

✍️作者简介:小北编程(专注于HarmonyOS、Android、Java、Web、TCP/IP等技术方向) 🐳博客主页: 开源中国、稀土掘金、51cto博客、博客园、知乎、简书、慕课网、CSDN 🔔如果文章对您有一定的帮助请&#x1f…

Python图像处理实战:使用PIL库批量添加水印的完整指南【第27篇—python:Seaborn】

文章目录 1. 简介2. PIL库概述3. PIL库中涉及的类4. 实现原理5. 实现过程5.1 原始图片5.2 导入相关模块5.3 初始化数据5.4 水印字体设置5.5 打开原始图片并创建存储对象5.6 计算图片和水印的大小5.7 选择性设置水印文字5.8 绘制文字并设置透明度5.9 遍历获取图片文件并调用绘制…

超简单的node爬虫小案例

同前端爬取参数一样,输入三个参数进行爬取 注意点也一样: 注意分页的字段需要在代码里面定制化修改,根据你爬取的接口,他的业务规则改代码中的字段。比如我这里总条数叫total,人家的不一定。返回的数据我这里是data.r…

内存泄漏检测方式

一 、 日志记录 通过宏定义重载了 malloc 和 free 函数,以在分配和释放内存的时候记录一些信息,包括文件名和行号,并将这些信息写入到相应的文件中。然后在 main 函数中演示了使用这些宏进行内存分配和释放。 _malloc 函数: 在分配…