【Spring Cloud一】微服务基本知识
系列文章目录
微服务基本知识
- 系列文章目录
- 前言
- 一、系统架构的演变
- 1.1单体架构
- 1.2分层架构
- 1.3分布式架构
- 1.4微服务架构
- 1.5分布式、SOA、微服务的异同点
- 二、CAP原则
- 三、RESTful
- RESTful的核心概念:
- 四、共识算法
前言
在实际项目开发过程中,目前负责开发的系统整体的架构采用的是微服务架构。对于微服务架构的认识只是停留在应用层面上,对于微服务的全貌并不是很清晰。最近想要对微服务的认知上更近一步,所以就重新梳理了一下微服务的基础知识。
一、系统架构的演变
1.1单体架构
什么是单体架构:
将一个完成的应用程序作为一个单一的、整体的单元来构建和部署。所有的功能和模块都集中在一个代码库中。共享同一个数据库,相应的也部署在同一个服务器上——单体架构。
单体架构出现的原因:
早期的Java应用程序一般采用单体架构,这是因为在用用程序刚刚开始开发的时候,规模小,并且单体架构简单易于部署。
单体架构的优缺点:
优点:开发简单、易于部署、单一数据库事物
缺点:随着业务增长会面临扩展性和维护性等问题。
1.2分层架构
什么是分层架构:
分层架构将应用程序划分为多个层次(表现层、应用层、数据访问层),每个层次负责不同的功能,用于实现代码的复用和职责的分离。
分层架构出现的原因:
为了解决单体架构的扩展性和维护性问题,演变为采用分层架构。分层架构将应用程序划分为多个层次(表现层、应用层、数据访问层),每个层次负责不同的功能,用于实现代码的复用和职责的分离。
分层架构的优缺点:
优点:代码复用、职责清晰、易于维护。
缺点:复杂性(在一些复杂的业务场景下,层与层之间的交互可能变得复杂)。大型系统中可能导致模块之间的耦合。
1.3分布式架构
什么是分布式架构:
分布式架构是一种设计模式,是将大型应用拆分成多个独立的子系统或服务,并将这些子系统部署在不同的服务器上。通过网络进行通信和协作。
分布式架构出现的原因:
随着互联网的发展和业务的增长,单体架构和分层架构在面对大规模用户和高并发访问时已经不够灵活和高效。因此,Java应用程序逐渐演变为分布式架构,将应用程序拆分成多个独立的服务。
分布式架构的目标:
提高系统的高性能、可伸缩性;高可用性和容错性,来提高系统的整体性能。
分布式架构的优缺点:
优点:横向扩展、高可用性、灵活部署
缺点:系统复杂、通信开销、分布式事务难以处理。
1.4微服务架构
在说微服务架构的时候先了解一下SOA(Service-Oriented Architecture)
SOA是一种软件架构风格,核心思想是将应用程序的功能划分为一组相对独立的服务,这些服务可以通过网络进行通信,并可以按需组成更大的应用系统。
SOA的目标:
强调松耦合和服务的重用,使系统更易于可扩充、可维护、可复用。SOA可以用于实现分布式系统,但并不限定于分布式系统。
了解了SOA架构之后我们再看看微服务架构。
什么是微服务架构:
微服务架构是一种特殊的SOA风格,它将应用程序划分为一组小型、独立的服务。每个服务都专注于一个特定的业务功能。
微服务架构强调将应用程序**差分成更小的、自治的、独立部署和松耦合服务。每个服务都有自己的数据库和业务逻辑。**与SOA相比微服务架构的粒度更小。
微服务架构的优缺点:
优点:
- 模块化和解耦合:将真个系统拆分为一组小型、独立的服务。每个服务都专注于一个特定的职责。
- 独立部署和伸缩性:每个服务都是独立的,可以单独部署也可以根据需求对服务进行水平扩展。
- 更好的团队协作:每个微服务都是独立的,可以由不同的团队开发和维护,提高团队的自治性和工作效率。
- 简化持续交付:由于每个服务都是独立的,可以更轻松的持续集成和交付,减少了系统的发布风险和交付时间。
缺点:
- 系统复杂性:每个服务都是独立的,需要通过网络进行通信。增加了系统的复杂性,包括网络通信、服务发现、负载均衡等方面。
- 部署和运维复杂性:微服务架构涉及多个服务的部署和运维,需要管理大量的服务。增加了部署和运维的复杂性。
- 数据一致性和分布式事物的问题:由于微服务架构中每个服务都有自己的数据存储。可能会导致数据一致性的问题。
1.5分布式、SOA、微服务的异同点
相同点:
他们都将应用程序拆分成多个组件或服务,并通过网络进行通信和协作。
都强调松耦合、可扩展、可维护、可复用。
不同点:
1.分布式架构是一种概念上的设计模式,用于解决系统的性能和可扩展问题,强调的是分担和资源的合理利用。
2.SOA是一种软件架构风格,核心思想是将应用程序划分为一组相对独立的服务,并通过标准化的协议进行通信,以实现松耦合和服务的重用。
3.微服务架构是SOA的一种实践方式,它强调将应用程序拆分为小型、独立的服务,每个服务都有自己的数据库和业务逻辑,来实现更高的自治和独立部署、松耦合。
二、CAP原则
cap是分布式系统中三个重要的属性。
一致性(Consistency):各个子系统看到的数据都是相同的。数据都是一致性。
可用性(Availability):分布式系统能够在任何时刻都能对外提供服务,保持持续的可工作状态,不因故障而中断服务。当一个子系统挂掉了,整个系统可以继续对外提供服务
分区容忍性(Partition Tolerance):
分区容忍性关注的是分布式系统在面对网络分区的情况下仍然能够正常运行,而不会因为分区而导致整个系统不可用。
由于网络或者分区等原因会导致各个子系统中的数据短暂不一致
一般来说,大多数分布式系统会优先考虑分区容忍性和可用性,因为网络分区是不可避免的,而一致性可以通过其他手段来解决
补充:zookeeper遵循CP、Eureka遵循AP
三、RESTful
RESTful(Representational State Transfer 表述性状态转移)是一种设计和构建网络应用程序的架构风格。是最初由Roy Fielding在他的博士论文中提出,并成为了HTTP协议的一种应用方式。
RESTful架构的设计目标是:使网络应用程序具有简介、可伸缩、可维护、可扩展和易于理解。
RESTful的核心概念:
- 资源(Resources):在RESTful中,所有事物都被看做为资源,例如用户、订单,并且每个资源都有一个唯一的标识符(通常是URL)用于访问资源和操作资源。
- 无状态性:RESTful架构要求每一个请求都应该包含足够的信息,使服务器能够理解和处理,不需要依赖之前的请求或者会话状态,服务器不保存客户端的状态信息,这使得系统更具伸缩性和简洁性。
可伸缩性示例:
假设有一个电子商务网站,它使用RESTful API来处理客户端的请求。由于RESTful架构是无状态的,服务器不会保存客户端的状态信息,每个请求都包含足够的信息来执行操作。这使得该网站可以轻松地水平扩展,即通过增加服务器节点来处理更多的请求负载。
如果服务器需要保存大量的客户端状态信息,例如会话信息、购物车内容等,那么在进行水平扩展时,需要确保所有服务器节点之间的状态同步,这增加了复杂性并降低了可伸缩性。而在RESTful架构下,无状态性消除了这种状态同步的需求,使得系统的扩展更加简单和高效。
简洁性示例:
考虑一个社交媒体应用程序,使用RESTful API来处理用户发布新帖子的请求。用户在每个请求中提供了必要的信息,例如帖子内容、标签等。服务器无需维护用户的会话状态,而是根据请求的信息处理每个帖子的发布。
在这种情况下,RESTful架构简化了服务器的逻辑和状态管理。服务器无需关心用户的上下文或会话状态,只需根据请求的内容处理每个帖子。这种简洁性使得服务器的代码更易于编写、测试和维护。
- 统一接口:RESTful架构使用统一的接口规范来定义资源的操作方式。这种统一性使得不同的客户端可以通过相同的接口与服务器进行通信。
RESTful API使用标准的HTTP方法(GET、POST、PUT、DELETE等)来对资源进行操作。客户端通过不同的HTTP方法来执行不同的操作,比如获取资源、创建新资源、更新资源或删除资源。
- 按需编码:服务器可以将资源在不同的表示形式(如JSON、XML等)之间进行转换,根据客户端需求返回不同的表现形式。客户端通过HTTP头部信息来指定期望的表示形式。
符合RESTful原则的架构方式就可以称为RESTful。
四、共识算法
共识算法常常被用于集群服务中的主从模式中。
什么是共识算法:让集群中的各个节点的数据保持一致性的一种策略。
Raft共识算法
相关文章:

【Spring Cloud一】微服务基本知识
系列文章目录 微服务基本知识 系列文章目录前言一、系统架构的演变1.1单体架构1.2分层架构1.3分布式架构1.4微服务架构1.5分布式、SOA、微服务的异同点 二、CAP原则三、RESTfulRESTful的核心概念: 四、共识算法 前言 在实际项目开发过程中,目前负责开发…...

swift - 如何在数组大小更改后刷新 ForEach 显示元素的数量(SwiftUI、Xcode 11 Beta 5)
我正在尝试实现一个 View ,该 View 可以在内容数组的大小发生变化时更改显示项目的数量(由 ForEach 循环创建),就像购物应用程序可能会在用户下拉刷新后更改其可用项目的数量一样 这是我到目前为止尝试过的一些代码。如果我没记错的话,这些适…...
编程导航算法村第七关 |二叉树的遍历
编程导航算法村第七关 | 二叉树的遍历 前序遍历(递归) public List<Integer> preorderTraversal(TreeNode root) {ArrayList<Integer> result new ArrayList<Integer>();preorder(root, result);return result;}public void preorde…...
【docker】docker-compose安装带ui页面的kafka集群
docker-compose 安装带kafka-ui 的kafka集群 在日常的工作当中,kafka集群作为常用的中间件,其搭建过程略显繁琐,需要配置的文件颇多,为了方便各位初学者快速体验kafka的魅力,本文采取一键式安装kafka-3.3.1࿰…...
java实现多级菜单
/** * 查询所有菜单 */ public BaseWebResponse<Object> getAllMenus() { List<SystemMenuInfo> systemMenuInfoList menuInfoMapper.getAllMenus(); List<SystemMenuInfo> menuTree buildMenuTree(systemMenuInfoList); return setResultSuccess(&q…...

HTML中元素和标签有什么区别?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 标签(Tag)⭐元素(Element)⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&a…...

android 如何分析应用的内存(十三)——perfetto
android 如何分析应用的内存(十三) 本篇文章是native内存的最后一篇文章——perfetto perfetto简介 从2018年始,android开发者峰会正式推出perfetto工具。从此perfetto成为安卓最重要的工具之一。在2018年以前,android使用syst…...
Chapter20 音乐
目录 音乐 琴键 哆来咪 振动与调式 利萨如曲线 和声与音调与和弦 音乐 在音乐理论中,一个八音度(octave)是一个频率范围相差二倍的区间。在大多数西洋乐器中,一个八音度被分为12个频率比相等的半音程(semitone&a…...
详解Nodejs中的模块化
Nodejs是一个基于Chrome V8引擎的JavaScript运行时环境,它允许开发者使用JavaScript在服务器端运行代码。在Nodejs中,模块化是一种组织和重用代码的重要方式。模块化允许我们将代码拆分成小块,使得代码结构更清晰、易于维护,并促进…...

debug思路 - maven构建报错
问题:maven面板中,进行compile、deploy操作时报错。 debug步骤: 1、鼠标右键选择“修改运行配置”。在运行命令中添加参数-X,用于产生执行调试输出。例如:compile -f -X pom.xml。 2、再次进行compile、deploy操作&…...

DSP学习笔记
间接寻址(通过放在辅助寄存器里面,可以对地址包括很多操作,1,-1,/-平移量,辅助寄存器内容的修改是在ARAU0和ARAU1中完成的。分为单操作数和双操作数,有很多模式在ARAU。单操作数间接寻址&#x…...
Java中的Apache Commons Math是什么?
Java中的Apache Commons Math是一个开源的数学库,它提供了许多常用的数学函数和算法,例如线性代数、微积分、统计、插值、拟合等。这个库对于需要处理大量数据的开发者来说非常有用,因为它可以大大简化代码并提高效率。 让我们从新手的角度来…...

规划路线(微信小程序、H5)
//地图getLocationDian(e1, e2) {console.log(e1, e2);let self this;self.xx1 [];self.xx2 [];self.points [];// self.markers[]console.log(self.markers, >marks);// self.$jsonp(url, data).then(re > {// var coors re.result.routes[0].polyline;// for (v…...

【CSS】视频文字特效
效果展示 index.html <!DOCTYPE html> <html><head><title> Document </title><link type"text/css" rel"styleSheet" href"index.css" /></head><body><div class"container"&g…...

linux-MySQL的数据目录
总结: window中的my.ini linux 中 /etc/my.cnfwindow中的D:\soft\mysql-5.7.35-winx64\data linux 中 /var/lib/mysql 1.查找与mysql有关的目录 find / -name mysql [rootVM-4-6-centos etc]# find / -name mysql /opt/mysql /etc/selinux/targeted/tmp/modul…...

AI绘图实战(十二):让AI设计LOGO/图标/标识 | Stable Diffusion成为设计师生产力工具
S:AI能取代设计师么? I :至少在设计行业,目前AI扮演的主要角色还是超级工具,要顶替?除非甲方对设计效果无所畏惧~~ 预先学习: 安装及其问题解决参考:《Windows安装Stable Diffusion …...

机器视觉系统设计:基础知识
机器视觉系统的设计 机器视觉系统集成是将各种不同的组件和子系统组合在一起并使它们充当单个统一系统的过程。 视觉系统集成包括光源,镜头,相机,相机接口和图像处理软件等等。您可能想知道如何设计和实现一个完整,成功的机器视…...

C# Blazor 学习笔记(11):路由跳转和信息传值
文章目录 前言路由跳转测试用例路由传参/路由约束想法更新:2023年8月4日 前言 Blazor对路由跳转进行了封装。 ASP.NET Core Blazor 路由和导航 NavigationManager 类 本文的主要内容就是全局的跳转 路由跳转 路由跳转就要用到NavigationManager 类。 其实最常用…...
Centos 7 安装 Python 时 zlib not available 错误解决
Centos 7 安装 Python 时 zlib not available 错误解决 报错信息, zipimport.ZipImportError: cant decompress data; zlib not available解决方法, sudo yum install -y zlib zlib-devel完结!...
python sqllite基本操作
以下是一些基本的SQLite3操作: 连接到数据库:使用sqlite3.connect()函数连接到数据库,返回一个Connection对象,我们就是通过这个对象与数据库进行交互。例如: import sqlite3 conn sqlite3.connect(example.db)创建…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...