微服务详解

微服务

什么是微服务?

微:单个服务的设计,所有参与人从设计、开发、测试、运维所有人加起来只需要两个披萨就够了

服务:一定要区别于系统,服务一个或者一组相对较小且独立的功能单元,是用户可以感知的最小功能集

微服务是一种架构,这种架构是将单个的整体应用程序分割成更小的项目关联的独立的服务。一个服务通常实现一组独立的特性或功能,包含自己的业务逻辑和适配器。各个微服务之间的关联通过暴露API来实现。这些独立的微服务不需要部署在同一个虚拟机,同一个系统和同一个应用服务器中。

微服务的由来

微服务最早由Martin Fowler与James Lewis于2014年共同提出,微服务架构风格是一种使用一套小服务来开发单个应用的方式途径,每个服务运行在自己的进程中,并使用轻量级机制通信,通常是HTTP API,这些服务基于业务能力构建,并能够通过自动化部署机制来独立部署,这些服务使用不同的编程语言实现,以及不同数据存储技术,并保持最低限度的集中式管理。

为什么需要微服务?

在传统的IT行业软件大多是各种独立系统的堆砌,这些系统的问题总结来说就是拓展性差,可靠性不高,维护成本高。到后面引入了SOA服务化,但是,由于 SOA 早期均使用了总线模式,这种总线模式是与某种技术栈强绑定的,比如:J2EE。这导致很多企业的遗留系统很难对接,切换时间太长,成本太高,新系统稳定性的收敛也需要一些时间。最终 SOA 看起来很美,但却成为了企业级奢侈品,中小公司都望而生畏。

单体应用系统

单体架构在规模比较小的情况下工作情况良好,但是随着系统规模的扩大,他暴露出来的问题也越来越多,主要有以下几点:

  1. 复杂性逐渐变高
    • 比如有的项目有十几万行的代码,各个模块之间区别比较模糊,逻辑比较混乱,代码越多复杂性越高,越难解决遇到的问题
  2. 技术债务逐渐上升
    • 公司的人员流动是再正常不过的事情,有的员工在离职之前,疏于代码质量的自我管束,导致留下来很多坑,由于单体项目代码量庞大的惊人,留下的坑很难被发觉,这就给新来的员工带来很大的烦恼,人员流动越大所留下的坑越多,也就是所谓的技术债务越来越多。
  3. 部署速度逐渐变慢
    • 单体架构的模块非常多,代码量非常大,导致部署项目所花费的事件越来越多,曾经有的项目启动就要一二十分钟,这是多么恐怖的事情啊,启动几次项目一天的时间就过去了,留给开发者开发的时间就非常少了。
  4. 阻碍技术创新
    • 比如以前的某个项目使用struts2写的,由于各个模块之间有着千丝万缕的联系,代码量大,逻辑不够清楚,如果现在想用spring mvc来重构这个项目将是非常困难的,付出的成本将非常大,所以更多的时候公司不得不硬着头皮继续使用老的struts架构,这就阻碍了技术的创新。
  5. 无法按需伸缩
    • 比如说电影模块是CPU密集型的模块,而订单模块是IO密集型的模块,假如我们要提升订单模块的性能,比如加大内存、增加硬盘,但是由于所有的模块都在一个架构下,因此我们在扩展订单模块的性能时不得不考虑其它模块的因素,因为我们不能因为扩展某个模块的性能而损害其它模块的性能,从而无法按需进行伸缩。

分布式应用系统

由于整个系统运行需要使用到Tomcat和MySQL,单台服务器处理的能力有限,2G的内存需要分配给Tomcat和MySQL使用,随着业务越来越复杂,请求越来越多.。内存越来越不够用了,所以这时候我们就需要进行分布式的部署。

我们进行一个评论的请求,这个请求是需要依赖分布在两台不同服务器上的组件(tomcat和mysql),才能完成的。所以叫分布式系统

分布式和单体项目最大的区别在于分布式的项目是分开部署的,比如说把数据库,MQ,ES,单独放在一台或者多台服务器上。

集群

在上一个例子中其实是存在问题的,当我们任意一个服务器出现单点故障问题,服务就无法继续提供,所以针对这些问题我们会采用集群的方式来解决,那么什么是集群呢?

在单机达到瓶颈时我们会选择增加部署相同服务的服务器,来构成集群。集群中每个服务器都叫一个节点,每个节点提供相同的服务。这样不论是高可用还是负载均衡都可以通过集群的方式来实现,而负载均衡的方式也有很多:nginx做七层的负载,lvs做四层的负载,以及硬件的负载F5。高可用则是通过keepalived来实现

系统架构的演变

架构的演变大致为:单一应用架构—》垂直应用架构—》分布式服务架构—》流动计算架构微服务—》······

单一应用架构

互联网早期,一般网站应用流量较少,只需要一个应用,将所有代码都部署在一起就可以了,这样可以减少开发、部署和维护成本

比如说一个电商系统,里面会包含很多用户管理,商品管理,订单管理,物流管理等等很多模块,我们会把它们做成一个web项目,然后部署到一台tomcat服务器上。

他的优点在于:

  • 项目部署简单,小型项目的话,开发成本低
  • 项目部署在一个节点上,维护容易
  • 他的缺点也是显而易见

缺点:

  • 全部功能集成在一个工程中,对于大型项目来讲不易开发和维护
  • 项目模块之间紧密耦合,单点容错率低
  • 无法针对不同的模块进行针对性优化和水平扩展

垂直应用架构

随着访问量的逐渐增大,单一应用只能依靠增加节点来应对,但是这时候会发现并不是所有模块都会有比较大的访问量

还是以上面的电商为例子, 用户访问量的增加可能影响的只是用户和订单模块, 但是对消息模块的影响就比较小. 那么此时我们希望只多增加几个订单模块, 而不增加消息模块. 此时单体应用就做不到了, 垂直应用就应运而生了。

所谓的垂直应用架构,就是将原来的一个应用拆成互不相干的几个应用,以提升效率。比如我们可以将上面电商的单体应用拆分成:

  • 电商系统(用户管理 商品管理 订单管理)
  • 后台系统(用户管理 订单管理 客户管理)
  • CMS系统(广告管理 营销管理)

这样拆分完毕之后,一旦用户访问量变大,只需要增加电商系统的节点就可以了,而无需增加后台和CMS的节点。

他的优点在于:

  • 系统拆分实现了流量分担,解决了并发问题,而且可以针对不同模块进行优化和水平扩展。一个系统的问题不会影响到其它系统,提高容错率。

缺点:

  • 系统之间相互独立,无法进行相互调用
  • 系统之间相互独立,会有重复的开发任务

分布式架构

当垂直应用越来越多,重复的业务代码就会越来越多。这时候,我们就思考可不可以将重复的代码抽取出来,做成统一的业务层作为独立的服务,然后由前端控制层调用不同的业务层服务呢? 这就产生了新的分布式系统架构。它将把工程拆分成表现层和服务层两个部分,服务层中包含业务逻辑。表现层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现。

优点:

  • 抽取公共的功能为服务层,提高代码的复用性

缺点:

  • 系统间耦合度变高,调用关系错综复杂,难以维护

SOA架构

在分布式架构下,当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心对集群进行实时管理。此时,用于资源调度和治理中心(SOA Service Oriented Architecture,面向服务的架构)是关键。

优点:

  • 使用注册中心解决了服务间调用关系的自动调节

缺点:

  • 服务间会有依赖关系,一旦某个环节出错会影响较大(服务雪崩)
  • 服务关系复杂,运维、测试部署困难

注册中心: nacos ,zookeeper ,nacos ,eureka,consul

微服务架构

微服务架构在某种程度上是面向服务的架构,他更加强调服务的彻底拆分

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bZmn75TH-1691465345847)(C:\Users\admin\Desktop\markdown\微服务架构.png)]

优点:

  • 服务原子化拆分,独立打包、部署和升级,保证每个微服务清晰的任务划分,利于拓展
  • 微服务之间采用RESTful等轻量级http协议相互调用
  • 服务各自有自己的单独的职责,服务之间松耦合,避免因一个模块的问题导致服务崩溃

缺点:

  • 分布式系统开发的技术成本高(容错、分布式事务)
  • 服务治理和服务监控关键
  • 多服务运维难度,随着服务的增加,运维的压力也在增大

微服务需要解决的问题

微服务架构,简单来叔就是将单体应用进一步拆分,拆分成更小的服务,每个服务都是一个可以独立运行的项目

微服务架构的常见问题

  • 这么多小服务,如何管理他们?
  • 这么多小服务,他们之间如何通讯?
  • 这么多小服务,客户端怎么访问他们?
  • 这么多小服务,一旦出现问题了,应该如何自处理?
  • 这么多小服务,一旦出现问题了,应该如何排错?

这些问题是任何一个微服务设计者都不能绕过去的,因此大部分的微服务产品都针对每一个问题提供了相应的组件来解决

微服务架构的常见概念

服务治理

服务治理就是进行服务的自动化管理,其核心是服务的注册与发现

**服务注册:**服务实例将自身服务信息注册到注册中心

**服务发现:**服务实例通过注册中心,获取到注册到其中的服务实例信息,通过这些信息去请求他们提供服务

**服务剔除:**服务注册中心将出问题的服务自动剔除到可用列表之外,使其不会被调用到。

服务调用

在微服务架构中,通常存在多个服务之间的远程调用的需求,目前1主流的远程调用的技术有基于HTTP请求的RESTFul接口及基于TCP的RPC协议。

REST(Representational State Transfer):这是一种HTTP调用的格式,更标准,更通用,无论哪种语言都支持http协议。
RPC(Remote Promote Call):一种进程间通信方式。允许像调用本地服务一样调用远程服务。RPC框架的主要目标就是让远程服务调用更简单、透明。RPC框架负责屏蔽底层的传输方式、序列化方式和通信细节。开发人员在使用的时候只需要了解谁在什么位置提供了什么样的远程服务接口即可,并不需要关心底层通信细节和调用过程。
他们之间的区别于联系:

比较项RESTFulRPC
通讯协议HTTP一般是TCP
性能略低较高
灵活度
应用微服务架构SOA架构

服务网关

随着微服务的不断增多,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信可能出现:

客户端需要调用不同的url地址,增加难度。
在一定的场景下,存在跨域请求的问题。
每个微服务都需要进行单独的身份认证。
为了解决这些问题,API网关顺势而生。

API网关直面意思是将所有API调用统一接入到API网关层,由网关层统一接入和输出。一个网关的基本功能有:统一接入、安全防护、协议适配、流量管控、长短链接支持、容错能力。有了网关之后,各个API服务提供团队可以专注于自己的的业务逻辑处理,而API网关更专注于安全、流量、路由等问题。

服务容错

在微服务当中,一个请求经常会涉及到调用几个服务,如果其中某个服务不可用,没有做服务容错的话,极有可能会造成一连串的服务不可用,这就是雪崩效应。

我们没法预防雪崩效应的发生,只能尽可能去做好容错。服务容错的三个核心思想是:

不被外界环境影响。
不被上游请求压垮。
不被下游响应拖垮。

链路追踪

随着微服务架构的流行,服务按照不同的维度进行拆分,一次请求往往需要涉及到多个服务。互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、可能使用不同的编程语言来实现、有可能布在了几千台服务器,横跨多个不同的数据中心。因此,就需要对一次请求涉及的多个服务链路进行日志记录,性能监控即链路追踪。

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

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

相关文章

力扣17(电话号码中的字符组合)

题目表述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例1 输入:digits "23" 输出&#xff1…

SpringBoot集成百度人脸识别实现登陆注册功能Demo(二)

前言 上一篇SpringBoot集成百度人脸demo中我使用的是调用本机摄像头完成人脸注册,本次demo根据业务需求的不同我采用文件上传的方式实现人脸注册。 效果演示 首页 注册 后端响应数据: 登录 后端响应数据: 项目结构 后端代码实现 1、Bai…

数据结构和算法——散列函数的构造方法(直接定址法、除留余数法、数字分析法、折叠法、平方取中法、ASCII码加和法、前三字符移位法)

目录 数字关键词的散列函数构造 直接定址法 除留余数法 数字分析法 折叠法 平方取中法 字符关键词的散列函数构造 ASCII码加和法 前三字符移位法 移位法 数字关键词的散列函数构造 一个“好”的散列函数一般应考虑下列两个因素: 计算简单,以…

QT生成可执行文件的步骤

QT生成可执行文件的步骤 第一步:debug为release,然后进行编译 第二步:添加QT生成必要的库 首先,建立一个新的文件夹,然后将Release中的可执行文件拷贝到新的文件夹中 然后,在新建文件夹中生成必要的库 …

Nginx(1)

目录 1.Nginx概述2.Nginx的特点3.Nginx主要功能1.反向代理2.负载均衡 1.Nginx概述 Nginx (engine x) 是一个自由的、开源的、高性能的HTTP服务器和反向代理服务器,也是一个IMAP、POP3、SMTP代理服务器。 Nginx是一个强大的web服务器软件,用于处理高并发…

别再被问倒了!Mysql索引竟然在这些情况下失灵?

嗨,亲爱的读者们!小米又来啦~ 今天我们要聊一个在数据库面试中常常被问到的热门话题:Mysql索引失效。想要在面试中脱颖而出,掌握这个知识点可是必不可少哦!废话不多说,咱们现在就深入剖析一下,看…

开源网络探测和安全评估工具nmap的实践

1.nmap简介 Nmap(Network Mapper)是一个广泛使用的开源网络探测和安全评估工具。它最初由Gordon Lyon(也被称为Fyodor Vaskovich)开发,并且在网络管理员、安全研究人员和黑客等领域被广泛应用。 Nmap具有许多功能&am…

C#,数值计算——基于模拟退火的极小化问题单纯形(下山)算法的计算方法与C#源程序

1 模拟退火 模拟退火算法其实是一个类似于仿生学的算法,模仿的就是物理退火的过程。 我们炼钢的时候,如果我们急速冷凝,这时候的状态是不稳定的,原子间杂乱无章的排序,能量很高。而如果我们让钢水慢慢冷凝&#xff0c…

小研究 - 微服务系统服务依赖发现技术综述(一)

微服务架构得到了广泛的部署与应用, 提升了软件系统开发的效率, 降低了系统更新与维护的成本, 提高了系统的可扩展性. 但微服务变更频繁、异构融合等特点使得微服务故障频发、其故障传播快且影响大, 同时微服务间复杂的调用依赖关系或逻辑依赖关系又使得其故障难以被及时、准确…

pycharm中opencv库导入 cv2. 无函数提示跳出解决方法

pycharm中opencv库导入 cv2. 无函数提示跳出解决方法 1、找到当前解释器安装目录 例如: 2、进入D:\Python37\Lib\site-packages\cv2文件,进入cv2文件夹: 找到cv2.pyd, 把cv2.pyd复制一份,放到上层文件夹下,即site-p…

ElementUI主题颜色动态切换并缓存

今天给大家分享一下在Vue中使用ElementUI时,想切换主题颜色的两种方式。 第一种:静态改变项目中的主题颜色 比较简单,稍微带过: 项目中创建element-variables.scss文件,编写内容: /* 改变主题色变量 */ …

数据结构 | 二叉树的应用

目录 一、解析树 二、树的遍历 一、解析树 我们可以用解析树来表示现实世界中像句子或数学表达式这样的构造。 我们可以将((73)*(5-2))这样的数学表达式表示成解析树。这是完全括号表达式,乘法的优先级高于加法和减法,但因为有括号,所以在…

ffmpeg下载安装教程

ffmpeg官网下载地址https://ffmpeg.org/download.html 这里以windows为例,鼠标悬浮到windows图标上,再点击 Windows builds from gyan.dev 或者直接打开 https://www.gyan.dev/ffmpeg/builds/ 下载根据个人需要下载对应版本 解压下载的文件,并复制bin所在目录 新打开一个命令…

嵌入式面试3

1.线程与进程的区别和联系? 线程是否具有相同的堆栈? dll是否有独立的堆栈? 进程是死的,只是一些资源的集合,真正的程序执行都是线程来完成的,程序启动的时候操作系统就帮你创建了一个主线程。 每个线程有自己的堆栈。 DLL中有没有独立的…

P2340 [USACO03FALL] Cow Exhibition G

P2340 [USACO03FALL] Cow Exhibition G 很典型的背包问题。要求 IQ 与 EQ 和的最大值,并保证 IQ EQ 和均大于 0,易知 dp,IQ 和 EQ 均大于 0 的条件可先不管,最后在合法区间统计答案即可。 考虑如何求 IQ 与 EQ 和的最大值&#x…

基于YOLOv7开发构建MSTAR雷达影像目标检测系统

MSTAR(Moving and Stationary Target Acquisition and Recognition)数据集是一个基于合成孔径雷达(Synthetic Aperture Radar,SAR)图像的目标检测和识别数据集。它是针对目标检测、机器学习和模式识别算法的研究和评估…

前端面试题-高频考点

1 typeof类型判断 typeof 是否能正确判断类型? instanceof 能正确判断对象的原理是什么typeof 对于原始类型来说,除了 null 都可以显示正确的类型 typeof 1 // number typeof 1 // string typeof undefined // undefined typeof true // boolean typeo…

手把手写深度学习(20):搭建LLM大语言模型的敏感词过滤系统

前言:随着Llama 2、通义千问7B等越来越多的大语言模型开源,开发者们可以基于这些开源的模型搭建自己的对话系统、Agent等。但是因为我们的国情,需要开发者对这些模型进行一些特殊的“安全性”考虑,保证与用户的交互不会出现“有害信息”。这篇博客手把手教大家搭建一个大语…

Camunda 7.x 系列【6】Spring Boot 集成 Camunda 7.19

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 前言2. Camunda Platform Run3. Spring Boot 版本兼容性4. 集成 Spring Boot5. 启动项目…

【Vue3】动态组件

动态组件的基本使用 动态组件(Dynamic Components)是一种在 Vue 中根据条件或用户输入来动态渲染不同组件的技术。 在 Vue 中使用动态组件,可以使用 元素,并通过 is 特性绑定一个组件的名称或组件对象。通过在父组件中改变 is 特…