架构设计读后——微服务
1 微服务历史
- 2005年:Dr. Peter Rodgers提出"Micro-Web-Services"概念
- 2011年:一个软件架构工作组使用"microservice"来描述一中架构模式
- 2012年;这个工作组正式使用"microservice"来代表这个架构
- 2012年:ThoughtWorks的James Lewis针对微服务概念发布演讲
- 2014年:James Lewis和Martin Flower合写了一篇学术性文章,详细阐述微服务
虽然微服务也提到了服务,SOA中也有服务这个概念,但是并不是说两个是同一个东西
2 微服务和SOA关系
微服务和SOA的关系和区别有几个典型的观点
- 微服务是SOA的实现方式:SOA是一种架构理念,而微服务是SOA的一种具体实现方式,使用了Http RESTful来实现ESB
- 微服务是去掉ESB后的SOA:可以发现微服务中没有ESB这种具体的总线概念,都是直接使用http请求来访问其他服务
- 微服务是一种SOA相似但本质上不同的架构概念:两个虽然类似,但本质上只是都拥有了服务这个概念的两种架构
微服务与SOA实际对比后可能才能了解到这两个架构的关系
- 服务粒度:SOA要更粗一些,而微服务则要细一点
- 服务通信:SOA同意ESB作为通信组件负责服务定义,服务路由,消息转换,消息传递,总体是重量级的实现,而微服务则是推荐同意协议和格式,方便传输和转换
- 服务交付:SOA并没有交付要求,更多是考虑兼容现有的系统,微服务则是要求快速交付,一般要采取自动化测试、持续集成、自动化部署等敏捷开发的最佳实践,不然一旦服务不断增加,就会导致交付成本增加,可以想象100多个服务要进行重新上线会有多么恐怖
- 应用场景:SOA更适合庞大、复杂、异构的企业级系统,因为重构和优化成本过高,只能使用兼容模式进行处理,微服务责适用于快速、轻量级的互联网系统,因为变化快,需要快速尝试,并且新兴面对的不是老旧系统
- 对比表格如下,可以得出SOA和微服务本质上就是两种不同的架构只不过都有服务这个概念
对比维度 | SOA | 微服务 |
---|---|---|
服务粒度 | 粗 | 细 |
服务通信 | 重量级,ESB | 轻量级,例如HTTP RESTful |
服务交付 | 慢 | 快 |
应用场景 | 企业级(老旧系统) | 互联网 |
可以发现微服务是一种优秀的架构模式,且比SOA要优秀,那我们应该把架构重构为服务吗?
答案是不一定,请记住三原则中的合适原则,微服务的需求你用的上嘛?且在SOA适用的系统中,转换为微服务只会徒增实施难度和成本
3 微服务的陷阱
微服务不是无所不能且全是优点,能不能用微服务重点是合适原则,如果不考虑团队规模,业务发展,基础技术支持,直接上微服务,那么只会在这个坑里越陷越深
坑
- 服务划分过细,服务间关系复杂:单个服务复杂度确实下降了,但是你几百个,几十个微服务,也不见得系统的整体复杂度下降了,只不过是把单服务内部复杂度转移到了系统整体上(笑容不会消失,只是转换到了我的脸上😊)
- 服务数量多,团队效率下降:团队规模要是小一点,一个负责好几个服务是真恶心,开发、单元测试、打包、部署、整体测试等多个环节都会恶心到你🤮
- 调用链长,性能下降:如果不拆分那么就是在机器内部进行逻辑运算和方法调用,快的一批,但是微服则会一个服务调另一个服务,要是中间遇到网络分区等问题,可能导致接口拥堵等问题
- 调用链长,问题定位难:本身我们看日志或者异常的message就能找到问题,但微服务存在故障扩散现象,快速定位就变得异常难
- 没有自动化支持,无法快速交付:如果没有系统化系统支持,那么全是人工去测试,去部署,去交付,去实施,那么出问题是必然的(如果你没有,那么你总会遇到的),而且速度还是硬伤。
- 没有服务治理,微服务数量多了后管理混乱:本质上就对熔断,限流,降级,服务注册和发现,以及负载均衡,远程调用的方案设计要更加的合理符合直觉
4 微服务最佳实践
微服务的坑可以提炼为:拆的过细,基础设施不健全,微服务不轻量级
带着以上问题,看看微服务的最佳实践该怎么做
4.1 服务粒度
粒度划分过细可能会导致出现问题,但是过粗又会增加每个服务的负载导致系统的性受到影响,所以要划分的合适这是解决问题的关键,作者给出的建议是基于团队规模进行拆分
三个火枪手:即一个微服务三个人负责开发,并且会随着人数的增加而继续拆分微服务,如:目前团队有6个人,那就拆成两个微服务,如果增加到了12个人,同时系统的功能和复杂度也会增加,这时候,就可以将2个微服再分别拆为两个,相应降低了单个微服务的复杂度
?为啥是三个人负责一个呢:为啥不是2个人,不是4个人
- 简单->三人成虎😊,从科学角度出发,如果3个人负责一个系统,系统的复杂度刚好达到每个人都能全面理解整个系统,还能分工。
- 还能形成高可用,即使一个人请假了,还有两个人,加班不会觉得孤独😄
- 且三个人能形成有效的讨论,能快速达到一致意见,如果是两个可能发生分歧👀,一个人的话可能陷入思维盲区,更多人的话可能出现有人摸鱼
4.2 拆分方法
定好了拆分大小后,就需要确认拆分的方式了,一般有如下几种:基于业务逻辑拆分、基于可扩展拆分、基于可靠性拆分、基于性能拆分
- 基于业务逻辑拆分:这是一种常见的拆分方式,简单来说就是按照功能模块划分
- 首先要计算大概服务数量范围,再确认合适的职责范围:如果团队规模是10个人,划分4个服务,那么登录,注册,用户信息管理,可以划分到用户服务的范围作为微服务,如果是100人,那么用户登录就可以是一个单独的微服务了
- 基于可扩展拆分:将稳定的服务和经常迭代的服务拆分开,稳定的可以粒度划分更粗,毕竟不会再进行升级和迭代所以系统内部的复杂度高一点也没问题,而需要快速迭代的服务则划分细一点,方便开发对具体功能敏捷开发
- 基于可靠性拆分:本质上来说就是将核心业务和非核心业务拆分,能够对核心的业务进行高可用的机器冗余方案,非核心业务没必要也不需要进行高可用冗余,反而会导致成本上升
- 基于性能拆分:和上面的可靠性拆分类似,都是为了进行机器冗余时对关键的需要进行高性能运算的服务拆分出来进行机器扩展,降低机器冗余的成本
上述的拆分方式并不是只能选择一个,可以在系统划分时组合排列,比如使用了性能划分后,还可以进行可靠性划分
4.3 基础设施
微服务的关键确实是“微”、“轻量化”,但是其“自动化”也是一个重要点,如果因为"自动化"不到位,即使服务划分的再好,再细节,每次部署、测试的时候以及上线等问题带来的资源、时间消耗就不止服务划分、轻量化开发时消耗的时间了
基础设施如下
- 服务发现
- 服务路由
- 服务容错
- 服务监控
- 服务跟踪
- 服务安全
- 自动化测试
- 自动化部署
- 配置中心
- 接口框架
- API网关
可以发现,基础设施的搭建即多又繁琐,像是把SOA的ESB转移到了基础设施上,但是每个基础设施又有其作用
- 自动化测试:原本大一统的系统拆分为多个独立运行的“微服务”,且服务之间的接口数量大大增加,并且微服务还提倡快速交付,开发周期短,如果测试等工作不能自动化,要么增加人工成本,要么增加研发成本(配置好自动化测试)
- 自动化测试包含:单元测试、单系统集成测试、系统间接口测试,至少都要做到接口测试自动化
- 自动化部署:微服务多,手动部署会有风险和问题,自动化能相对解决这个问题
- 包括:版本管理、资源管理、部署操作、回退操作等
- 配置中心:微服务的配置,生产环境和开发环境以及测试环节都是不一样的,且不同的微服务可能有相同的配置,如果改了其中一个,还要手动改其他的。所以配置中心就是统一配置,多个微服务都可以使用同一个配置信息,改了配置文件后,所有微服务都会生效。
- 包括:配置版本管理,增删改查配置、节点管理、配置同步、配置推送等
- 接口框架:我们需要统一整个微服务的通信协议以及序列化协议,能够方便我们接收请求以及处理响应,以及处理数据格式
- API网关:微服务之间是互联互通的,内部你怎么去请求怎么去交流有内部的方式,如果外部系统或者请求,就不知道该如何访问某个服务的接口,且接口权限也不好统一
- 网关能很好解决这个问题,作为微服务统一的入口,可以进行鉴权、权限控制、传输加密、请求路由转发、流量监控,请求日志等
- 服务发现(当前服务怎么找到依赖的服务的地址):微服务数量多,如果各个服务之间的依赖使用手工录入的话,工作量大,并且配置中心很多时候可能也会依靠服务发现,去做自动化配置,且一个服务扩容后该怎么路由达到负载均衡等,以及灰度发布
- 自理式:指每个微服务完成自己的服务发现
- 代理式:服务消费者不直接与服务提供者通信,而是通过一个代理(通常是负载均衡器或代理服务器)来间接访问服务
- 服务路由:有了服务发现之后,对于某次具体的调用,需要从符合条件的节点中选择一个发起请求
- 服务路由和服务发现紧密相关,自理式服务发现的服务路由是微服务内部实现的,对于代理式服务路由是有LB(负载均衡)系统实现的
- 常见算法有:随机路由、轮询路由、最小压力路由、最小连接数路由等
- 服务容错:拆分微服务后,单个微服务的故障率变小了,但是被其他服务影响导致故障的概率却变大了,单个微服务故障影响返回减少,但是导致上下游发生故障后,影响面积却又扩大了,所以控制故障扩散就是服务容错的能力
- 常见的服务容错:请求重试、流控、服务隔离
- 请求重试:重新向同一个微服务节点重新发送请求
- 流控:也就是我们常说的限流,通常应对某类微服务请求突增,且由于系统容量限制,无法快速应对突发容量,通常微服务节点的流控由自己实现
- 服务隔离:当某个微服务故障时,让其下线避免故障扩散,隔离又分为:主动隔离、被动隔离、手动隔离
- 主动隔离指微服务自己发现自己异常后,主动注销自己->降级
- 被动隔离指被系统发现异常频率等触发了设置的阈值,被系统注销->熔断
- 手动隔离指人工判断系统故障后,手工操作注销
- 三者可以一起使用,能够更好的保证服务故障不扩散
- 服务监控:实时收集微服务信息,包括但不限于机器、网络、进程、接口调用数等
- 服务监控作用有很多:收集信息,预警
- 收集信息实时分析可以避免故障后再分析,减少处理时间
- 可以在实时分析的基础上进行预警,提前发现问题萌芽,扼杀!
- 服务跟踪:跟踪每次请求的在微服务中的完整路径,监控是很难实现的,且每个请求都这样的话,数据量会非常大
- 监控和跟踪的关系就是宏观和微观关系,监控统计了路径的结果,跟踪则是每次路径,现在的服务跟踪大部分都是基于Google的Dapper论文《Dapper,a Large-Scale Distributed Systems Tracing Infrastructure》,技术关键点如下
- 标注点: 标注点会在一个完整的调用链中有自己的id,类似于seata的分布式事务id,而且我们可以控制在哪里打上标注点
- 比如一个元数据落标,我们可以在任务开始时标记一下,在数据库记录当前任务的id,整个任务过程都是用这个id去标记和入库,当任务结束后,我们就可以查看每次任务的流程以及各个标注点的信息
- 跟踪树和span:标注点可以说是很多跟踪任务的通用解决方案,但是在微服务的服务跟踪中,不仅需要记录标注点,还需要集合调用链以及分支结构,比如A服务调用了C和B,C又调用了D,B又调用了E,此时就出现了分支如下:所以span就是每个节点,而跟踪树就是由每个节点的span组成的树结构,每个span中又可以有标注点
- A
- B
- E
- C
- D
- 标注点: 标注点会在一个完整的调用链中有自己的id,类似于seata的分布式事务id,而且我们可以控制在哪里打上标注点
- 服务跟踪主要有两个目的:采样跟踪、染色跟踪
- 采用跟踪:根据一定概率对请求进行采样跟踪,基于采样数据进行分析,通常用于检查性能不足等,对系统消耗小且压力小
- 染色跟踪:针对某个特殊请求进行跟踪,比如某个特定用户id,某个特定的业务对象id,常常因为这些特定对象会导致系统出现问题,同时还不是大面积的问题,所以很难定位问题,需要进行染色跟踪的用户id或业务对象id
- 监控和跟踪的关系就是宏观和微观关系,监控统计了路径的结果,跟踪则是每次路径,现在的服务跟踪大部分都是基于Google的Dapper论文《Dapper,a Large-Scale Distributed Systems Tracing Infrastructure》,技术关键点如下
- 服务安全:简单来说就是每个微服务的资源也需要进行鉴权和保护,比如拥有A权限的微服务可以去访问用户信息微服务的修改接口,拥有B权限的微服务能够访问用户信息的的获取接口
- 服务安全分为三个部分:接入安全、数据安全、传输安全
- 接入安全:只有经过允许,某个微服务才能访问另一个微服务,否则会被拒绝
- 数据安全:各个接口需要对应权限和授权后才能访问
- 传输安全:指某些敏感数据需要在传输过程中,防窃取、防篡改保证数据的真实有效
- 通常可以集成到配置中心系统进行实现,单独配置某个微服的接入安全策略和数据安全策略信息
- 服务安全分为三个部分:接入安全、数据安全、传输安全
5 总结
- 微服务概念的历史要早得多,也不是Martin Flower创造出来的,Martin只是将微服务进行了系统的阐述。
- 微服务是一种和SOA相似但本质上不同的架构理念。
- 微服务的三个关键词:small、lightweight、automated。
- 微服务和SOA不存在孰优孰劣,只是应用场景不同。
- 微服务并不是没有代价,而是会带来系统复杂度、运维复杂度、性能下降等问题。
- 微服务拆分的粒度遵循“三个火枪手”原则。
- 真正决定微服务成败的,恰恰是那个被大部分人都忽略的"自动化"(automated),而不是“小”(small)和“轻量级”(lightweight)。
- 微服务并不是很多人认为的那样又简单又轻量级,要做好微服务,基础设施是必不可少的。
相关文章:
架构设计读后——微服务
1 微服务历史 2005年:Dr. Peter Rodgers提出"Micro-Web-Services"概念2011年:一个软件架构工作组使用"microservice"来描述一中架构模式2012年;这个工作组正式使用"microservice"来代表这个架构2012年&#x…...

软考高级架构-9.4.4-双机热备技术 与 服务器集群技术
一、双机热备 1、特点: 软硬件结合:系统由两台服务器(主机和备机)、一个共享存储(通常为磁盘阵列柜)、以及双机热备软件(提供心跳检测、故障转移和资源管理功能的核心软件)组成。 …...
聊聊前端工程化
深度解析前端工程化 近年来,随着前端技术的快速迭代和项目复杂度的增加,前端开发已经从简单的页面搭建演变为专业的工程化体系。前端工程化通过工具链、标准化和流程化手段,不仅提高了开发效率,也大幅提升了项目的可维护性和协…...

“放弃Redis Desktop Manager使用Redis Insight”:日常使用教程(Redis可视化工具)
文章目录 更新Redis Insight连接页面基础解释自动更新key汉化暂时没有找到方法, Redis Desktop Manager在连接上右键在数据库上右键在key上右键1、添加连接2、key过期时间 参考文章 更新 (TωT)ノ~~~ βyё βyё~ 现在在维护另一…...

mmdection配置-yolo转coco
基础配置看我的mmsegmentation。 也可以参考b站 :https://www.bilibili.com/video/BV1xA4m1c7H8/?vd_source701421543dabde010814d3f9ea6917f6#reply248829735200 这里面最大的坑就是配置coco数据集。我一般是用yolo,这个yolo转coco格式很难搞定&#…...

聚合支付系统/官方个人免签系统/三方支付系统稳定安全高并发 附教程
聚合支付系统/官方个人免签系统/三方支付系统稳定安全高并发 附教程 系统采用FastAdmin框架独立全新开发,安全稳定,系统支持代理、商户、码商等业务逻辑。 针对最近一些JD,TB等业务定制,子账号业务逻辑API 非常详细,方便内置…...
力扣67. 二进制求和
给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。 示例 1: 输入:a "11", b "1" 输出:"100" 示例 2: 输入:a "1010", b "1011" 输出&#…...

网络安全中的 SOC 是什么?
当今世界,网络威胁日益增多,确保网络安全已成为各种规模企业的首要任务。网络安全讨论中经常出现的一个术语是 SOC,即安全运营中心的缩写。但网络安全中的 SOC 是什么呢? SOC在防御网络威胁、管理安全事件和全天候监控系统方面发…...
16、鸿蒙学习——Visibility与(if...else)该如何选择
在鸿蒙中我们如果要控制一个组件的显示与隐藏可以设置组件的Visibility属性,也可使用(if...else)条件控制,具体我们该选择哪个?二者有什么区别呢? 1、Visibility 名称描述Hidden隐藏,但参与布局…...

PH热榜 | 2024-12-05
1. Oopsie 标语:用AI和会话回放调试Flutter和React Native应用 介绍:Zipy推出的Oopsie是一款你唯一需要的AI赋能移动端调试工具,它能提供▶️会话回放、🤖错误监控、💡AI生成的概要分析,以及🔥…...

Qt Chart 模块化封装曲线图
一 版本说明 二 完成示例 此文章包含:曲线轴设置,曲线切换,单条曲线显示,坐标轴。。。 三 曲线图UI创建 在UI界面拖放一个QWidget,然后在 Widget里面放一个 graphicsView 四 代码介绍 1 头文件 #include <QString> #include <QTimer> #include <QMessa…...

【AI系统】MobileFormer
MobileFormer 在本文中,将介绍一种新的网络-MobileFormer,它实现了 Transformer 全局特征与 CNN 局部特征的融合,在较低的成本内,创造一个高效的网络。通过本节,让大家去了解如何将 CNN 与 Transformer 更好的结合起来…...

python数据分析之爬虫基础:解析
目录 1、xpath 1.1、xpath的安装以及lxml的安装 1.2、xpath的基本使用 1.3、xpath基本语法 2、JsonPath 2.1、jsonpath的安装 2.2、jsonpath的使用 2.3、jsonpath的基础语法 3、BeautifulSoup 3.1、bs4安装及创建 3.2、beautifulsoup的使用 3.3、beautifulsoup基本语…...

uniapp中导入uview或者uview plus
关于SCSS uview-plus依赖SCSS,您必须要安装此插件,否则无法正常运行。 如果您的项目是由HBuilder X创建的,相信已经安装scss插件,如果没有,请在HX菜单的 工具->插件安装中找到"scss/sass编译"插件进行安…...

【LeetCode】122.买卖股票的最佳时机II
文章目录 题目链接:题目描述:解题思路一(贪心算法):解体思路二(动态规划): 题目链接: 122.买卖股票的最佳时机II 题目描述: 解题思路一(贪心算法…...

openGauss开源数据库实战十九
文章目录 任务十九 openGauss DML 语句测试任务目标实施步骤一、准备工作二、INSERT语句三、DELETE语句四、UPDATE语句五、清理工作 任务十九 openGauss DML 语句测试 任务目标 掌握DML语句的用法,包括INSERT语句、DELETE语句和UPDATE语句。 实施步骤 一、准备工作 使用Li…...
恶补英语初级第18天,《询问他人的喜好(上)》
对话 Do you like coffee? Yes, I do. Do you want a cup? Yes, please. Do you want any sugar? Yes, please. Do you want any milk? No, thank you. I don’t like milk in my coffee, I like black coffee. Do you like biscuits? Yes, I do. Do you want one? Yes, …...

centos 报 ping: www.baidu.com: Name or service not known
[rootlocalhost ~]$ ping www.baidu.com ping: www.baidu.com: Name or service not known解决办法: 首先要求检查特定文件(/etc/resolv.conf)内是否正确配置了 DNS sudo vim /etc/resolv.conf没有正确配置可以添加如下代码: n…...

Python:使用随机森林分类器进行模型评估:ROC 曲线与 AUC 指标计算
前言 这段代码的目标是使用 随机森林分类器(Random Forest Classifier) 来进行二分类任务,并基于每个数据子集计算 ROC 曲线(Receiver Operating Characteristic Curve)以及 AUC(Area Under Curve…...
数据库表约束完全指南:提升数据完整性和准确性
数据库表约束完全指南:提升数据完整性和准确性 在数据库设计中,表约束是确保数据完整性和准确性的关键工具。本文将详细介绍各种类型的表约束及其使用方法,包括非空约束、唯一约束、主键约束、外键约束、默认值约束、检查约束以及自动递增约…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
WEB3全栈开发——面试专业技能点P4数据库
一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库,基于 mysql 库改进而来,具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点: 支持 Promise / async-await…...

DAY 45 超大力王爱学Python
来自超大力王的友情提示:在用tensordoard的时候一定一定要用绝对位置,例如:tensorboard --logdir"D:\代码\archive (1)\runs\cifar10_mlp_experiment_2" 不然读取不了数据 知识点回顾: tensorboard的发展历史和原理tens…...