微服务架构学习笔记
#1024程序员节|征文#

微服务架构作为现代软件开发中的热门技术架构,因其灵活性和可扩展性,逐渐成为许多企业系统设计的首选。以下是关于微服务的一些学习笔记,涵盖微服务的核心概念、优缺点、设计原则以及常用工具等方面。
1. 微服务是什么?
微服务是一种架构风格,旨在将应用程序分解为一系列独立部署的、功能专一的小型服务。这些服务通常围绕某个业务能力构建,彼此通过轻量级的协议(如HTTP、消息队列等)进行通信。
2. 微服务的优点
- 独立部署:每个微服务可以独立部署、扩展和升级,减少了对整个系统的影响。
- 技术异构:各个微服务可以使用不同的编程语言、数据库和框架。
- 可扩展性强:根据需求对特定服务进行独立扩展,资源利用更加灵活。
- 容错性:一个微服务的失败不会导致整个系统崩溃,增加系统的健壮性。
3. 微服务的缺点
- 复杂性增加:系统被分解为多个服务,增加了系统的设计和管理复杂度。
- 通信成本:微服务之间的网络通信开销较大,且需要解决服务发现、负载均衡等问题。
- 数据一致性问题:由于数据分散在不同的微服务中,维护数据的一致性变得更加困难。
4. 设计原则
- 单一职责原则:每个微服务应当专注于完成单一功能或业务。
- 去中心化治理:鼓励服务之间自治,各个团队负责自己的服务。
- 轻量级通信:服务之间的通信应尽量轻量化,避免过多的依赖和紧耦合。
- 故障隔离:设计时应考虑到服务的独立性,避免单个服务故障影响整个系统。
- 弹性设计:考虑到不同服务的负载情况,应引入熔断、限流等机制。
5. 常见的微服务模式
- API Gateway:提供一个统一的接口供客户端调用,将请求分发给不同的微服务。
- Service Discovery:通过服务注册中心来实现微服务的自动发现和调用。
- Circuit Breaker(熔断器模式):在某个服务出现故障时,快速失败,避免故障扩散。
- Event-Driven Architecture(事件驱动架构):通过消息队列等实现服务之间的松耦合。
6. 常用工具
- Spring Cloud:Java中非常流行的微服务框架,支持服务发现、配置管理、断路器等功能。
- Docker & Kubernetes:用于微服务的容器化和集群管理,便于服务的自动化部署和扩展。
- Consul、Eureka:服务注册和发现工具。
- RabbitMQ、Kafka:常用的消息队列,用于实现微服务之间的异步通信。
- Prometheus、Grafana:用于监控微服务的运行状态。
7. 微服务开发中的挑战
- 数据管理:如何在多个服务之间保持数据的一致性和完整性。
- 事务管理:跨多个微服务的事务问题,可以使用分布式事务或基于事件的补偿机制。
- 服务治理:随着服务数量的增加,如何有效地管理服务的生命周期、监控和日志。
- 测试和调试:微服务系统由于服务之间的依赖性较强,测试和调试变得更加复杂,特别是在模拟生产环境时。
9. 微服务的拆分策略
微服务的核心思想之一是将复杂的单体应用分解为多个独立的服务。这一过程并非简单的技术问题,更需要深刻理解业务需求和领域逻辑。以下是一些常见的微服务拆分策略:
1. 按业务能力拆分
微服务应该围绕业务能力进行划分。例如,在一个电商系统中,可以将订单管理、商品管理、用户管理、支付等功能各自拆分为一个微服务。这种方式是最常见的微服务划分策略,符合领域驱动设计(DDD)的理念。
2. 按领域模型拆分
使用领域驱动设计(DDD)的方式,根据领域模型的聚合根(Aggregate Root)拆分微服务。例如在电商系统中,"订单"作为一个聚合根,可以构成一个独立的微服务。同理,"用户"、"商品"也可以作为聚合根进行拆分。
3. 按团队组织拆分
一个常见的做法是按团队的组织结构拆分微服务。每个开发团队负责一个或多个微服务的开发与维护。这种方式可以有效减少跨团队的沟通成本,提高开发效率。
4. 按非功能需求拆分
依据非功能性需求(如性能、扩展性、安全性等)来进行拆分。例如,某些需要高并发处理的功能(如支付)可以拆分为独立的微服务,以便进行专门的优化和扩展。
5. 按数据边界拆分
以数据为边界来拆分微服务,使得每个微服务只负责管理与自身相关的数据。例如,"用户服务"负责用户数据的管理,"订单服务"负责订单数据的管理。这样可以降低服务之间的数据耦合性,避免频繁的跨服务数据库访问。
10. 微服务间通信方式
在微服务架构中,服务间的通信方式直接影响到系统的稳定性、性能和扩展性。常见的通信方式有同步通信和异步通信:
1. 同步通信
- HTTP REST:最常用的微服务间通信方式,简单易用,基于HTTP协议。每个微服务通过API暴露自己的功能,其他服务通过HTTP请求调用这些API。REST的优点是轻量、标准化,但在高并发场景下,可能会有性能瓶颈。
- gRPC:基于HTTP/2协议的远程过程调用(RPC)框架,具有高效的二进制序列化方式,支持多种语言。相比REST,gRPC在性能上有较大优势,尤其适合高性能要求的场景。
2. 异步通信
- 消息队列(MQ):使用消息队列(如RabbitMQ、Kafka等)进行异步通信,适合事件驱动的架构。消息队列可以实现服务之间的松耦合,服务A发送消息到队列中,服务B监听并处理这些消息。异步通信可以提高系统的鲁棒性,避免请求阻塞。
- 事件驱动架构:服务通过事件发布/订阅模式进行通信。服务A发布事件(如"订单已创建"),其他服务可以订阅这些事件并作出响应。这种模式可以有效解耦服务之间的依赖关系。
3. 服务间通信选择的考虑
- 耦合度:同步通信会增加服务间的耦合度,需要注意服务的可靠性和故障隔离问题。
- 性能需求:异步通信适合高并发、松耦合的场景,但实现复杂度较高。同步通信更简单直观,但性能和扩展性可能受到限制。
- 数据一致性:异步通信可能导致数据一致性问题,需要采用补偿机制来解决。
11. 微服务的监控和日志
在微服务架构中,由于服务数量较多,服务间的调用复杂,监控和日志显得尤为重要。以下是一些常见的监控和日志管理方式:
1. 集中式日志管理
使用集中式日志系统(如ELK Stack:Elasticsearch、Logstash、Kibana)来收集、存储和分析分布式微服务的日志。日志数据可以帮助开发人员调试、跟踪系统问题,尤其是在服务间通信故障时。
2. 分布式追踪
分布式追踪系统(如Jaeger、Zipkin)可以跟踪多个微服务之间的调用链,帮助开发人员定位延迟和性能瓶颈。通过追踪每个请求在系统中的路径,可以更容易发现哪个微服务出了问题。
3. 监控和报警
使用Prometheus、Grafana等工具进行监控。Prometheus可以定期抓取各个微服务的指标数据,并在服务出现异常时发出报警。Grafana则提供丰富的可视化界面,展示系统的健康状态和性能情况。
4. 健康检查
每个微服务都应实现健康检查接口,供负载均衡器或服务发现机制调用。健康检查可以定期检查服务是否正常运行,及时移除不健康的实例。
12. 微服务中的安全性
安全性在微服务架构中非常重要,因为服务之间的通信通过网络进行,容易受到攻击。以下是一些常见的微服务安全措施:
1. 认证与授权
-
OAuth 2.0 和 OpenID Connect:在微服务中,常通过OAuth 2.0和OpenID Connect实现分布式认证与授权。服务间通过令牌(Token)进行访问控制,确保只有经过认证的请求才能访问某些微服务。
-
JWT(JSON Web Token):JWT是一种常见的令牌格式,微服务可以通过验证JWT中的签名来确保请求的合法性。
2. 加密
- HTTPS 加密通信:微服务之间的通信应通过HTTPS进行加密,防止中间人攻击。
- API Gateway 安全性:API Gateway可以作为微服务的入口,所有外部请求都需要经过API Gateway进行认证、授权和审计。
3. 安全审计
所有的服务调用和用户操作都应该记录在日志中,以备后续审计和分析。安全审计日志可以帮助管理员发现潜在的安全威胁。
13. 微服务中的事务处理
在微服务中,事务的处理是一个复杂的问题,因为微服务的分布式特性导致单体应用中的传统事务(ACID)无法直接应用。以下是微服务中常见的分布式事务处理方式:
1. 两阶段提交(2PC)
两阶段提交协议是一种强一致性的分布式事务协议。在第一个阶段,协调者会询问每个参与者是否可以提交事务。在第二阶段,如果所有参与者都同意,事务将会被提交。
缺点:2PC会阻塞参与者的资源,增加系统的复杂性,且在网络不稳定的情况下可能导致性能问题。
2. 基于事件的补偿机制
使用事件驱动架构进行事务管理。每个服务完成自己的操作后,发布一个事件给其他服务,其他服务进行处理。如果某个步骤失败,执行补偿逻辑(即撤销之前的操作)。
3. Saga模式
Saga是一种分布式事务的模式。每个微服务都通过一系列的步骤来完成自己的事务。如果某个步骤失败,服务会调用反向操作来撤销之前的事务。
14. 微服务的API网关(API Gateway)
API网关是微服务架构中常见的设计模式。它充当客户端与微服务之间的中介,提供以下功能:
- 请求路由:根据请求的路径或其他参数,将请求转发到对应的微服务。
- 负载均衡:API网关可以实现对多个微服务实例的负载均衡。
- 认证与授权:在API网关层处理所有的认证与授权逻辑,确保只有合法的请求能访问后端服务。
- 缓存:API网关可以对频繁访问的数据进行缓存,减少后端服务的压力。
- 限流与熔断:可以在API网关层实现请求限流与熔断机制,避免后端服务被恶意请求淹没。
总结
微服务架构带来了灵活性、可扩展性和独立性,但同时也增加了系统的复杂度。成功的微服务架构需要结合领域驱动设计、良好的服务拆分策略、完善的监控与日志系统、合理的通信方式和事务处理机制。掌握这些原则和工具,能够帮助开发者在实际项目中更好地应用微服务架构。
相关文章:
微服务架构学习笔记
#1024程序员节|征文# 微服务架构作为现代软件开发中的热门技术架构,因其灵活性和可扩展性,逐渐成为许多企业系统设计的首选。以下是关于微服务的一些学习笔记,涵盖微服务的核心概念、优缺点、设计原则以及常用工具等方面。 1. 微服务是什么&…...
代码优化之简化if臃肿的判断条件
简化if判断条件 方法1: #include <iostream> #include <vector> #include <functional>// 封装参数的结构体 struct ConditionParams {int facenum;double zoomRatio;int iso;double facelv;int face_w;double qualityScore;int xx;int yy; };//…...
【OpenAI】第六节(语音生成与语音识别技术)从 ChatGPT 到 Whisper 的全方位指南
前言 在人工智能的浪潮中,语音识别技术正逐渐成为我们日常生活中不可或缺的一部分。随着 OpenAI 的 Whisper 模型的推出,语音转文本的过程变得前所未有的简单和高效。无论是从 YouTube 视频中提取信息,还是将播客内容转化为文本,…...
Docker 下备份恢复oracle
1.docker导出容器镜像 ##docker save -o 导出后的镜像名称.tar 容器名称|镜像id docker save -o oracle_11g.tar 3fa112fd3642 2.下载镜像上传镜像略 3.加载镜像 ##docker load -i <archive_file> docker load -i oracle11g11201.tar 4.添加版本号…...
oneplus3t-android_framework
0.确认oneplus6 root正常 oneplus6 root材料 oneplus6手机恢复出厂设置 , 或者 线刷 enchilada_22_K.52_210716_repack--HOS-10.0.11.zip : https://gitee.com/OnePlus6-brick-enchilada_22_K_52_210716_repack-HOS-10_0_11-zip OnePlus6Hydrogen_22…...
偷懒总结篇|贪心算法|动态规划|单调栈|图论
由于这周来不及了,先过一遍后面的思路,具体实现等下周再开始详细写。 贪心算法 这个图非常好 122.买卖股票的最佳时机 II(妙,拆分利润) 把利润分解为每天为单位的维度,需要收集每天的正利润就可以,收集正利润的区间…...
C语言初阶七:C语言操作符详解(1)
#1024程序员节|征文# 这篇文章是对之前文章中操作符的补充,可以看之前的文章:C语言初阶:六.算数操作_如何用编程表示除法-CSDN博客 C语言操作符是用于执行各种运算和操作的符号。包括算术操作符(如、-、*、/、%)&#…...
GO excelize 读取excel进行时间类型转换(自动转换)
GO excelize 读取excel进行时间类型转换(自动转换) 需求分析 需求:如何自动识别excel中的时间类型数据并转化成对应的 "Y-m-d H:i:s"类型数据。 分析:excelize在读取excel时,GetRows() 返回的都是字符串类…...
【算法与数据结构】二分查找思想
#1024程序员节|征文# 正文: 二分查找(binary search)是一种基于分治策略的高效搜索算法。它利用数据的有序性,每轮缩小一半搜索范围,直至找到目标元素或搜索区间为空为止,其实有时候数据没有序…...
PHP PDO:安全、灵活的数据持久层解决方案
PHP PDO:安全、灵活的数据持久层解决方案 PHP PDO(PHP Data Objects)是一个轻量级的、具有兼容接口的数据持久层抽象层。它提供了一个统一的API来访问多种数据库系统,如MySQL、PostgreSQL、SQLite、Oracle等。PDO扩展在PHP 5.1.0…...
九、Linux实战案例:项目部署全流程深度解析
Linux实战案例:项目部署全流程深度解析 在当今信息技术领域,Linux服务器凭借其卓越的稳定性、安全性以及强大的性能表现,被广泛应用于各类项目部署场景之中。本文将全面深入地介绍如何将一个项目成功部署至Linux服务器的完整流程,…...
GIS常见前端开发框架
#1024程序员节|征文# 伴随GIS的发展,陆续出现了众多开源地图框架,这些地图框架与众多行业应用融合,极大地拓展了GIS的生命力,这里介绍几个常见的GIS前端开发框架,排名不分先后。 1.Leaflet https://leafl…...
Java | Leetcode Java题解之第506题相对名次
题目: 题解: class Solution {public String[] findRelativeRanks(int[] score) {int n score.length;String[] desc {"Gold Medal", "Silver Medal", "Bronze Medal"};int[][] arr new int[n][2];for (int i 0; i &…...
数据结构 - 堆
今天我们将学习新的数据结构-堆。 01定义 堆是一种特殊的二叉树,并且满足以下两个特性: (1)堆是一棵完全二叉树; (2)堆中任意一个节点元素值都小于等于(或大于等于)左…...
html----图片按钮,商品展示
源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>图标</title><style>.box{width:…...
YOLOv11改进策略【卷积层】| ECCV-2024 小波卷积WTConv 增大感受野,降低参数量计算量,独家创新助力涨点
一、本文介绍 本文记录的是利用小波卷积WTConv模块优化YOLOv11的目标检测网络模型。WTConv的目的是在不出现过参数化的情况下有效地增加卷积的感受野,从而解决了CNN在感受野扩展中的参数膨胀问题。本文将其加入到深度可分离卷积中,有效降低模型参数量和计算量,并二次创新C3…...
redis高级篇之redis源码分析List类型quicklist底层演变 答疑159节
(1)ziplist压缩配置:list-compress-depth 0 表示一个quicklist两端不被压缩的节点个数。这里的节点是指quicklist双向链表的节点,而不是指ziplist里面的数据项个数参数list-compress-depth的取值含义如下: 0:是个特殊值,表示都不压缩。这是Redis的默认值…...
Elasticsearch 与 Lucene 的区别和联系
Elasticsearch 与 Lucene 的区别和联系 Elasticsearch 与 Lucene 的区别和联系一、知识背景Elasticsearch 简介Lucene 简介 二、Elasticsearch 和 Lucene 的区别适用场景性能优势和劣势架构设计的异同点 三、Elasticsearch和Lucene的联系四、Elasticsearch和Lucene的应用案例及…...
OpenCV视觉分析之运动分析(5)背景减除类BackgroundSubtractorMOG2的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 基于高斯混合模型的背景/前景分割算法。 该类实现了在文献[320]和[319]中描述的高斯混合模型背景减除。 cv::BackgroundSubtractorMOG2 类是 O…...
【SAP Hana】X-DOC:数据仓库ETL如何抽取SAP中的CDS视图数据
【SAP Hana】X-DOC:数据仓库ETL如何抽取SAP中的CDS视图数据 1、无参CDS对应数据库视图2、有参CDS对应数据库表函数3、封装有参CDS为无参CDS,从而对应数据库视图 1、无参CDS对应数据库视图 select * from ZFCML_REP_V where mandt 300;2、有参CDS对应数…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...
C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...
