什么是微服务?

news2024/11/18 1:46:43

文章目录

  • 什么是微服务
  • 微服务技术栈
  • 单体架构
  • 分布式架构
  • 认识微服务
  • 微服务技术框架
  • SpringCloud

什么是微服务

当我们提到微服务,很多人第一反应就是SpringCloud,但是微服务技术并不能与SpringCloud完全划等号:
在这里插入图片描述
微服务是分布式架构的一种,所谓分布式架构就是要把服务做一定的拆分。而拆分的过程中会产生各种各样的问题需要去解决,而SpringCloud仅仅只是解决了服务拆分中的服务治理问题。至于其他的一些分布式中设计的更复杂的问题,SpringCloud中并没有给出解决方案。所以一个完整的微服务技术包含的不仅仅是SpringCloud。

所以接下来我们看一看微服务中所涉及的技术栈。

微服务技术栈

微服务需要做的第一件事就是拆分,因为传统的单体架构所有的业务功能全部写在一起,随着业务越来愈复杂,代码的耦合度也会越来越高,将来我们想升级维护就会非常的困难。

在这里插入图片描述
所以一些大型的互联网项目都会去做拆分,而微服务在做拆分的时候会根据业务功能模块,把一个单体的项目拆分成一个个独立的项目,每个项目完成一部分独立的业务功能,将来独立开发和部署

在这里插入图片描述

我们把这一个个的项目称作服务。一个大型的互联网项目,常常会包含数百或上千的服务,最终形成一个服务集群。
在这里插入图片描述
一个业务往往就需要由多个服务共同来完成。比如一个请求来了,他可能先去调了服务A,而服务A可能又调了服务B,而后又去调了服务C,当业务越来越多、越来越复杂的时候,这些服务之间的调用关系就会越来越复杂:
在这里插入图片描述
而这么复杂的调用关系让人去记录和维护是很难实现的。为了解决这一个问题,在微服务中我们有一个组件叫注册中心它可以去记录微服务中每一个服务的IP、端口以及它能干什么事这些信息。当有一个服务需要去调用另外一个服务时,我们不需要自己去记录对方的IP,只需要去找注册中心就行了,然后去它那里拉取对应的服务信息:
在这里插入图片描述

同时随着服务越来越多,每一个服务都有自己的配置文件,将来如果我们要修改配置,一个个的去修改未免也太过麻烦。于是在微服务中还有一个配置中心它可以管理整个服务集群中成百上千的配置:
在这里插入图片描述
当我们需要变更一些配置的时候,我们只需要去找到配置中心就可以了,他会去通知相关的微服务,实现配置的热更新。

当我们的微服务运行起来以后,用户就可以来访问我们了,但是这个时候我们还需要一个网关组件:
在这里插入图片描述
因为我们这里有这么多的微服务,那用户怎么知道该访问哪一个呢?而且不一定每一个人都可以被允许来访问我们的服务。也就是说服务网关主要为我们做两件事:

  • 对用户身份做校验
  • 把用户的请求路由到我们具体的服务

在我们路由的过程中我们也可以做一些负载均衡:
在这里插入图片描述

我们在处理业务的时候有时还会用到数据库。在一些大型项目中我们使用的可能是数据库集群。但是在用户多的场景下,我们难免会遇到高并发带来的问题。因此我们会加入缓存 ,缓存就是把数据放入到内存当中,内存的查询效率肯定是比数据库快很多的。而且这种缓存还不能是单体缓存,为了应对高并发,我们要把它我们要把它做成分布式的缓存(也是一个集群)。用户的请求先到缓存,如果缓存没有命中,再去查询数据库。

简单的查询可以做缓存,一些海量数据复杂的搜索、统计和分析,缓存也做不了,这个时候我们还要用到分布式搜索:
在这里插入图片描述

最后在我们的微服务中还要一种异步通讯的消息队列组件。因为对于一般的分布式服务或者说微服务里面,他的业务往往会跨越多个服务,整个服务的链路可能会很长(服务A–>服务B–>服务C–>·····–>服务X)。那么我们的调用的时长就等于每个服务的执行时长之和,这样的话性能会有所下降。而异步通讯就可以有效地缩短我们的服务链路,优化我们的调用时长
在这里插入图片描述

我们如此庞大复杂的服务如果出现了什么问题是很难排查的,这可怎么办呢?

我们在微服务运行过程中引入两个组件来解决服务的异常定位:

  • 分布式日志服务:他可以去统计整个集群当中成百上千的服务的运行日志,统一的去做一个存储、统计、分析,将来出现问题就比较好定位
  • 系统监控链路追踪:他可以去监视我们整个服务集群中每个服务节点的运行状态、CPU的负载、内存的占用等等情况,一旦出现任何的问题,可以直接定位到某一个方法,帮助我们快速定位问题所在。

在这里插入图片描述

我们这么庞大的微服务集群使用人工部署是很困难的,所以我们的微服务集群一般采用自动化的部署,这时候我们就会使用到Jenkins工具,它可以帮助我们对微服务项目做一个自动化的编译,然后再基于Docker做一些打包形成镜像。然后我们再基于k8s或者rancher这样的技术,实现自动化的部署。这一套我们称为持续集成,结合我们前面所说的微服务技术,这就是完整的微服务技术栈。

在这里插入图片描述

这其中涉及很多知识点:
在这里插入图片描述
但我们可以对他们大致进行一个分类,概括成为五个部分:

  • 微服务治理(也就是SpringCloud所包含的技术)
  • 异步通信技术
  • 缓存技术
  • 分布式搜索的技术
  • 持续集成DevOps技术

在这里插入图片描述

单体架构

单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署。

在这里插入图片描述

单体架构的优缺点如下:

优点:

  • 架构简单
  • 部署成本低

缺点:

  • 耦合度高(维护困难、升级困难)

分布式架构

分布式架构:根据业务功能对系统做拆分,每个业务功能模块作为独立项目开发,称为一个服务。

在这里插入图片描述

分布式架构的优缺点:

优点:

  • 降低服务耦合
  • 有利于服务升级和拓展

缺点:

  • 服务调用关系错综复杂

我们可以举一个例子:

有一个Online Shopping的项目,我们做好服务拆分,同时为了保证高可用我们还要做集群:
在这里插入图片描述
当我们拆分完之后就会发现一个新的问题,原来是单体项目的时候各个服务都在一起,我在下单的时候如果需要商品信息直接调用就可以。但是现在不一样了,做了拆分之后,这是两个服务,部署在不一样的机器上,直接调肯定是行不通的。这个时候我们就要用到远程调用,从一个服务向另外一个服务发送请求来进行调用,这是一种跨越服务、跨越机器的调用。

在这里插入图片描述

分布式架构虽然降低了服务耦合,但是服务拆分时也有很多问题需要思考:

  • 服务拆分的粒度如何界定?
  • 服务之间如何调用?
  • 服务的调用关系如何管理?

人们需要制定一套行之有效的标准来约束分布式架构。

认识微服务

微服务是一种经过良好架构设计的分布式架构方案

微服务的架构特征

  • 单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责
  • 自治:团队独立、技术独立、数据独立,独立部署和交付
  • 面向服务:服务提供统一标准的接口,与语言和技术无关
  • 隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题

在这里插入图片描述
这些特性其实是在给分布式架构制定一个标准,进一步降低服务之间的耦合度,提供服务的独立性和灵活性。做到高内聚,低耦合。

微服务技术框架

微服务这种方案需要技术框架来落地,全球的互联网公司都在积极尝试自己的微服务落地技术。在国内最知名的就是SpringCloud和阿里巴巴的Dubbo。

接下来我们看一看一些微服务技术的对比:
在这里插入图片描述

  • Dubbo是被阿里巴巴开源的,因诞生时期较早,当时还没有完整的微服务体系与相关概念,所以它的核心就是远程调用以及注册发现。我们可以发现在Dubbo里面技术体系实际上并不完整,并且我们发现注册中心相关功能是依赖于zookeeperRedis实现的,这些并不是专业的注册中心,我们知道Redis是用来做缓存的,zookeeper是用来做集群管理的。而服务的远程调用才是Dubbo的核心。Dubbo专门基于http协议定义了一套标准也就是Dubbo协议。服务监控和保护功能也相对较弱
  • SpringCloud将全球各公司的开源的微服务技术进行了整合,形成了一套完整的微服务技术体系。SpringCloud具有完善的注册中心,包含EurekaConsul,在服务远程调用方面,为了减少学习成本,使用的直接就是基于http协议的标准。只不过SpringCloud帮我们封装了一种客户端Feign,来帮助我们发送http的请求。同时它还具有专业的配置中心叫做SpringCloudConfig,如果再结合SpringCloudBus就能够实现配置变化时的自动通知、热更新功能。在服务网关方面,SpringCloud提供了GatewayZuul两种技术,其中Gateway网关更常用,里面基于了最新的响应式编程,吞吐能力更强。服务保护方面使用了Hystrix技术,实现了服务的隔离,以及熔断等等相关技术
  • SpringCloudAlibaba可以说是SpringCloud的一部分,他是实现了SpringCloud的标准接口的,所以我们会发现SpringCloudAlibaba里面的一些组件用起来跟SpringCloud没什么差别。

在我们的企业中可能会使用以下四种途径去实现微服务架构:
在这里插入图片描述

SpringCloud

SpringCloud是目前国内使用最广泛的微服务框架。

官网地址:https://spring.io/projects/spring-cloud。

SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验。

其中常见的组件包括:

在这里插入图片描述
另外,SpringCloud底层是依赖于SpringBoot的,并且有版本的兼容关系,如下:
在这里插入图片描述

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

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

相关文章

AI视频监控在畜牧养殖中的技术应用解决方案

一、方案概况 随着养殖业迅猛发展的同时也给养殖业主带来了严峻挑战。对养殖业来说,养殖场大多建立在偏远地区,给集中管理带来不便;畜禽养殖成本大,丢失、偷盗等情况时有发生,容易造成巨大的经济损失。建立一套远程视…

013. N 皇后

1.题目链接: 51. N 皇后 2.解题思路: 2.1.题目要求: 给一个数字 n ,要求返回所有 n 个 皇后能在 n X n 的棋盘上 不相互攻击 的情况。 能攻击到的情况:以皇后自身为原点,横、竖、同斜线(45度…

Linux搭建单机多进程zookeeper集群

01 ZooKeeper是什么 ZooKeeper 是一个开放源码的分布式协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户。 分布式应用程序可以基…

用数字隔离器取代传统的光耦合器

介绍 光耦合器是一种已有几十年历史的技术,广泛用于信号隔离,通常提供安全隔离、信号电平移位和地面回路缓解。它们通常用于广泛的终端应用中,包括数据通信电路、开关模式电源系统、测量和测试系统,以及孤立的数据采集系统。光耦…

【入门】初识深度学习

文档背景 机器学习和深度学习的概念十分火热。听上去也很难,不慌,有时候就需要行动在前脑子在后。不管,干就完啦。 前言 人工智能(ArtificialIntelligence,AI)是最宽泛的概念,是研发用于模拟、延…

数据库基本语法

SQL常用语句总结 mysql -u root -p mysql会提示你输入密码&#xff0c;输入安装配置MySQL服务时设置的密码即可。 输入如下命令生成样例数据库&#xff1a; CREATE DATABASE university; USE university; SOURCE <DLL.sql文件路径>; SOURCE <InsertStatements.sql文…

Jenkins实践指南--pipeline概述

1.pipeline概述 1.1 什么是pipeline 从某种抽象层次上讲&#xff0c;部署流水线&#xff08;Deployment pipeline&#xff09;是指从软件版本控制库到用户手中这一过程的自动化表现形式。——《持续交付-发布可靠软件的系统方法》 pipeline 英语愿意为管道&#xff0c;在Jen…

Python之路—200行Python代码搞了个打飞机游戏!!

早就知道pygame模块&#xff0c;就是没怎么深入研究过&#xff0c;恰逢这周未没约到妹子&#xff0c;只能自己在家玩自己啦&#xff0c;一时兴起&#xff0c;花了几个小时写了个打飞机程序。 很有意思&#xff0c;跟大家分享下。 先看一下项目结构 1 2 3 4 5 6 7 8 9 10 11 1…

盒子模型-css

个人学习笔记 文章目录1.什么是盒子模型&#xff1f;2.外边距3.css边框4.内边距1.什么是盒子模型&#xff1f; HTML文档中的每个元素都被描绘成矩形盒子&#xff0c;这些矩形盒子通过一个模型来描述其占用的空间&#xff0c;这个模型称为盒子模型。 盒子模型用四个边界描述&am…

打字的哪阿空扥

打字的那些事之快速移动光标 一## 、提出快速移动光标的原因 &#xff08;1&#xff09;键盘移动光标方向键不合理 情景再现&#xff1a; 当我们在打出一句话时&#xff0c;其中一个字打错&#xff0c;我们就需要去删除它&#xff0c;此时我们做的动作&#xff0c;无非有两种…

Linux知识结构体系简述

Linux 是一套免费使用和自由传播的类 Unix 操作系统&#xff0c;是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。严格来讲&#xff0c;Linux 这个词本身只表示 Linux 内核&#xff0c;但实际上人们已经习惯了用 Linux 来形容整个基于 Linux 内核&…

QFtp编译

QFtp下载&#xff1a;https://github.com/qt/qtftp 打开源码 修改头文件(不然编译会报错) 打开qftp.pro CONFIG static CONFIG - shared改成 CONFIG - static CONFIG shared也就是 - 号互换位置 4. 编译生成文件 linux下&#xff1a;*.a文件为.lib文件 windows下&#xf…

Python学习基础笔记二十六——推导式

列表推导式&#xff1a; 例1&#xff1a;30以内能被3整除的数&#xff1a; print([i for i in range(30) if i % 3 0]) 结果&#xff1a; 例2&#xff1a; 30以内能被3整除的数的平方&#xff1a; print([i**2 for i in range(30) if i % 3 0]) 结果&#xff1a; 例3&…

Golang sync.Map 原理(两个map实现 读写分离、适用读多写少场景)

参考&#xff1a; 由浅入深聊聊Golang的sync.Map 通过对源码的逐行分析&#xff0c;清晰易懂Golang sync.Map原理 通过向 sync.Map 中增删改查来介绍sync.Map的底层原理Golang中sync.Map的实现原理是什么 很好的概括了sync.Map的原理手摸手Go 深入理解sync.Map 知乎大佬 大家…

CentOS7.9系统部署(nginx+uwsgi+flask)项目

一、概述 上次&#xff0c;我们介绍了如何将CentOS服务器自带的Python3.6.8版本升级到Python3.8.0版本&#xff0c;现在我们开始介绍如何将flask项目部署的CentOS7.9版本的Linux服务器上。 二、环境准备 2.1安装git 我们通常会将自己的项目托管在Github或者gitee平台&#…

地址锁存器,总线控制器,双向总线驱动器(数据缓冲器),时钟发生器。8088最小工作模式。

这几个芯片你知道它叫什么干什么用&#xff0c;跟CPU怎么接就可以。一般就是考填空 目录 这几个芯片你知道它叫什么干什么用&#xff0c;跟CPU怎么接就可以。一般就是考填空 地址锁存器&#xff08;74LS373&#xff0c;8282&#xff09; 数据缓冲器 8286&#xff0c;74LS24…

Spring MVC 常用注解的使用

ResponseBody 由于 Spring MVC 是基于 MVC 这个设计模式的&#xff0c;所以在不加上注解的情况下&#xff0c;页面和前端交互的时候返回的默认是一个视图 View&#xff0c;或者说静态页面&#xff0c;而实际上用的比较多的是将处理完的数据发送给前端&#xff0c;所以我们可以…

第五章. 可视化数据分析分析图表—常用图表的绘制2—直方图,饼形图

第五章. 可视化数据分析分析图 5.3 常用图表的绘制2—直方图&#xff0c;饼形图 本节主要介绍常用图表的绘制&#xff0c;主要包括直方图&#xff0c;饼形图。 1.直方图&#xff08;matplotlib.pyplot.hist&#xff09; 直方图&#xff0c;又称质量分布图&#xff0c;一般用横…

[附源码]JAVA毕业设计农产品的物流信息服务平台(系统+LW)

[附源码]JAVA毕业设计农产品的物流信息服务平台&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 …

MyBatis开发的详细步骤

推荐教程&#xff1a;SSM框架 一、什么是Mybatis 1.mybatis 是一个优秀的基于java的持久层框架&#xff0c;它内部封装了jdbc&#xff0c;使开发者只需要关注sql语句本身&#xff0c;而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。 2.mybatis通过x…