当前位置: 首页 > news >正文

微服务架构学习笔记

#1024程序员节|征文#

 微服务架构作为现代软件开发中的热门技术架构,因其灵活性和可扩展性,逐渐成为许多企业系统设计的首选。以下是关于微服务的一些学习笔记,涵盖微服务的核心概念、优缺点、设计原则以及常用工具等方面。

1. 微服务是什么?

微服务是一种架构风格,旨在将应用程序分解为一系列独立部署的、功能专一的小型服务。这些服务通常围绕某个业务能力构建,彼此通过轻量级的协议(如HTTP、消息队列等)进行通信。

2. 微服务的优点

  • 独立部署:每个微服务可以独立部署、扩展和升级,减少了对整个系统的影响。
  • 技术异构:各个微服务可以使用不同的编程语言、数据库和框架。
  • 可扩展性强:根据需求对特定服务进行独立扩展,资源利用更加灵活。
  • 容错性:一个微服务的失败不会导致整个系统崩溃,增加系统的健壮性。

3. 微服务的缺点

  • 复杂性增加:系统被分解为多个服务,增加了系统的设计和管理复杂度。
  • 通信成本:微服务之间的网络通信开销较大,且需要解决服务发现、负载均衡等问题。
  • 数据一致性问题:由于数据分散在不同的微服务中,维护数据的一致性变得更加困难。

4. 设计原则

  • 单一职责原则:每个微服务应当专注于完成单一功能或业务。
  • 去中心化治理:鼓励服务之间自治,各个团队负责自己的服务。
  • 轻量级通信:服务之间的通信应尽量轻量化,避免过多的依赖和紧耦合。
  • 故障隔离:设计时应考虑到服务的独立性,避免单个服务故障影响整个系统。
  • 弹性设计:考虑到不同服务的负载情况,应引入熔断、限流等机制。

5. 常见的微服务模式

  • API Gateway:提供一个统一的接口供客户端调用,将请求分发给不同的微服务。
  • Service Discovery:通过服务注册中心来实现微服务的自动发现和调用。
  • Circuit Breaker(熔断器模式):在某个服务出现故障时,快速失败,避免故障扩散。
  • Event-Driven Architecture(事件驱动架构):通过消息队列等实现服务之间的松耦合。

6. 常用工具

  • Spring Cloud:Java中非常流行的微服务框架,支持服务发现、配置管理、断路器等功能。
  • Docker & Kubernetes:用于微服务的容器化和集群管理,便于服务的自动化部署和扩展。
  • ConsulEureka:服务注册和发现工具。
  • RabbitMQKafka:常用的消息队列,用于实现微服务之间的异步通信。
  • PrometheusGrafana:用于监控微服务的运行状态。

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&#xff1a; #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 的全方位指南

前言 在人工智能的浪潮中&#xff0c;语音识别技术正逐渐成为我们日常生活中不可或缺的一部分。随着 OpenAI 的 Whisper 模型的推出&#xff0c;语音转文本的过程变得前所未有的简单和高效。无论是从 YouTube 视频中提取信息&#xff0c;还是将播客内容转化为文本&#xff0c;…...

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手机恢复出厂设置 &#xff0c; 或者 线刷 enchilada_22_K.52_210716_repack--HOS-10.0.11.zip &#xff1a; https://gitee.com/OnePlus6-brick-enchilada_22_K_52_210716_repack-HOS-10_0_11-zip OnePlus6Hydrogen_22…...

偷懒总结篇|贪心算法|动态规划|单调栈|图论

由于这周来不及了&#xff0c;先过一遍后面的思路&#xff0c;具体实现等下周再开始详细写。 贪心算法 这个图非常好 122.买卖股票的最佳时机 II(妙&#xff0c;拆分利润) 把利润分解为每天为单位的维度&#xff0c;需要收集每天的正利润就可以&#xff0c;收集正利润的区间…...

C语言初阶七:C语言操作符详解(1)

#1024程序员节|征文# 这篇文章是对之前文章中操作符的补充&#xff0c;可以看之前的文章&#xff1a;C语言初阶&#xff1a;六.算数操作_如何用编程表示除法-CSDN博客 C语言操作符是用于执行各种运算和操作的符号。包括算术操作符&#xff08;如、-、*、/、%&#xff09;&#…...

GO excelize 读取excel进行时间类型转换(自动转换)

GO excelize 读取excel进行时间类型转换&#xff08;自动转换&#xff09; 需求分析 需求&#xff1a;如何自动识别excel中的时间类型数据并转化成对应的 "Y-m-d H:i:s"类型数据。 分析&#xff1a;excelize在读取excel时&#xff0c;GetRows() 返回的都是字符串类…...

【算法与数据结构】二分查找思想

#1024程序员节&#xff5c;征文# 正文&#xff1a; 二分查找&#xff08;binary search&#xff09;是一种基于分治策略的高效搜索算法。它利用数据的有序性&#xff0c;每轮缩小一半搜索范围&#xff0c;直至找到目标元素或搜索区间为空为止&#xff0c;其实有时候数据没有序…...

PHP PDO:安全、灵活的数据持久层解决方案

PHP PDO&#xff1a;安全、灵活的数据持久层解决方案 PHP PDO&#xff08;PHP Data Objects&#xff09;是一个轻量级的、具有兼容接口的数据持久层抽象层。它提供了一个统一的API来访问多种数据库系统&#xff0c;如MySQL、PostgreSQL、SQLite、Oracle等。PDO扩展在PHP 5.1.0…...

九、Linux实战案例:项目部署全流程深度解析

Linux实战案例&#xff1a;项目部署全流程深度解析 在当今信息技术领域&#xff0c;Linux服务器凭借其卓越的稳定性、安全性以及强大的性能表现&#xff0c;被广泛应用于各类项目部署场景之中。本文将全面深入地介绍如何将一个项目成功部署至Linux服务器的完整流程&#xff0c…...

GIS常见前端开发框架

#1024程序员节&#xff5c;征文# 伴随GIS的发展&#xff0c;陆续出现了众多开源地图框架&#xff0c;这些地图框架与众多行业应用融合&#xff0c;极大地拓展了GIS的生命力&#xff0c;这里介绍几个常见的GIS前端开发框架&#xff0c;排名不分先后。 1.Leaflet https://leafl…...

Java | Leetcode Java题解之第506题相对名次

题目&#xff1a; 题解&#xff1a; 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定义 堆是一种特殊的二叉树&#xff0c;并且满足以下两个特性&#xff1a; &#xff08;1&#xff09;堆是一棵完全二叉树&#xff1b; &#xff08;2&#xff09;堆中任意一个节点元素值都小于等于&#xff08;或大于等于&#xff09;左…...

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双向链表的节点&#xff0c;而不是指ziplist里面的数据项个数参数list-compress-depth的取值含义如下: 0:是个特殊值&#xff0c;表示都不压缩。这是Redis的默认值…...

Elasticsearch 与 Lucene 的区别和联系

Elasticsearch 与 Lucene 的区别和联系 Elasticsearch 与 Lucene 的区别和联系一、知识背景Elasticsearch 简介Lucene 简介 二、Elasticsearch 和 Lucene 的区别适用场景性能优势和劣势架构设计的异同点 三、Elasticsearch和Lucene的联系四、Elasticsearch和Lucene的应用案例及…...

OpenCV视觉分析之运动分析(5)背景减除类BackgroundSubtractorMOG2的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 基于高斯混合模型的背景/前景分割算法。 该类实现了在文献[320]和[319]中描述的高斯混合模型背景减除。 cv::BackgroundSubtractorMOG2 类是 O…...

【SAP Hana】X-DOC:数据仓库ETL如何抽取SAP中的CDS视图数据

【SAP Hana】X-DOC&#xff1a;数据仓库ETL如何抽取SAP中的CDS视图数据 1、无参CDS对应数据库视图2、有参CDS对应数据库表函数3、封装有参CDS为无参CDS&#xff0c;从而对应数据库视图 1、无参CDS对应数据库视图 select * from ZFCML_REP_V where mandt 300;2、有参CDS对应数…...

WPF的UpdateSourceTrigger属性

在WPF中&#xff0c;UpdateSourceTrigger属性用于控制数据绑定中何时将绑定目标&#xff08;通常是UI元素&#xff09;的值更新回绑定源&#xff08;通常是数据对象&#xff09;。这个属性有以下几个值&#xff1a; Default&#xff1a;这是默认值&#xff0c;对于不同的绑定目…...

2024-09-25 环境变量,进程地址空间

一、认识常见的环境变量 1. echo $HOME 输出当前用户对应的家目录 当用户登录系统时&#xff0c;流程如下&#xff1a; &#xff08;1&#xff09;用户登录系统后&#xff0c;系统启动Shell程序。 &#xff08;2&#xff09;启动bash shell&#xff0c;准备接收用户指令。 &a…...

中国移动机器人将投入养老场景;华为与APUS共筑AI医疗多场景应用

AgeTech News 一周行业大事件 华为与APUS合作&#xff0c;共筑AI医疗多场景应用 中国移动展出人形机器人&#xff0c;预计投入养老等场景 作为科技与奥富能签约&#xff0c;共拓智能适老化改造领域 天与养老与香港科技园&#xff0c;共探智慧养老新模式 中山大学合作中国…...

青少年编程能力等级测评CPA C++ 四级试卷(1)

青少年编程能力等级测评CPA C 四级试卷&#xff08;1&#xff09; 一、单项选择题&#xff08;共15题&#xff0c;每题3分&#xff0c;共45分&#xff09; CP4_1_1.在面向对象程序设计中&#xff0c;与数据构成一个相互依存的整体的是&#xff08; &#xff09;。 A. 对数据…...

树上任意两点的距离

题目描述 给出 n 个点的一棵树&#xff0c;多次询问两点之间的最短距离。 注意&#xff1a;边是双向的。 输入描述 第一行为两个整数 n 和 m。n 表示点数&#xff0c;m 表示询问次数&#xff1b; 下来 n−1 行&#xff0c;每行三个整数 x,y,k&#xff0c;表示点 x 和点 y 之间…...

【 thinkphp8 】00008 thinkphp8数据查询,常用table,name方法,进行数据查询汇总

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【 t…...

Git的命令合集

关于Git的一些命令合集&#xff0c;会慢慢更新&#xff01; 20241024程序员节开始写的&#xff0c;记录一下~~ git查看log、查看详细提交记录 会显示之前的提交记录 , 排序由近及远 git log log按q退出 git回退到某个commit命令&#xff1a; 退到/进到指定commit的sha码&…...

博客搭建之路:hexo搜索引擎收录

文章目录 hexo搜索引擎收录以百度为例 hexo搜索引擎收录 hexo版本5.0.2 npm版本6.14.7 next版本7.8.0 写博客的目的肯定不是就只有自己能看到&#xff0c;想让更多的人看到就需要可以让搜索引擎来收录对应的文章。hexo支持生成站点地图sitemap 在hexo下的_config.yml中配置站点…...

创建Windows系统还原点

系统保护...

Linux等保测评需要用到的命令

三权设置 查看账户情况 cd /home/ ll 设置审计账户 useradd shenji passwd shenji 修改密码 passwd新密码 设置管理账户 useradd guanli passwd guanli compgen -u 查看用户 切换到root账户 su root 设置审计用户权限 vim /etc/sudoers shenji ALL (root) NOPASSWD:…...

做微课的网站有哪些方面/seo优化在线

第 20 卷 第 5 期 四川理工学院学报(自然科学版) Vol&#xff0e;20 No&#xff0e;5 JOURNAL OF SICHUAN UNIVERSITY OF 2007年10月 SCIENCE & ENGINEERING(NATURAL SCIENCE EDITION) Oct&#xff0e;2007 文章编号&#xff1a;1673-1549(2007)05-0006-04 基于人工神经网络…...

制作wordpress静态首页/站长工具查询网

查看porm.xml父工程spring-boot-starter-parent&#xff0c;再查看他的父工程spring-boot-dependencies 可以看到写着很多依赖的版本号&#xff08;测试&#xff1a;log4j不写版本提示报错&#xff0c;查找里面没有log4j&#xff0c;只有log4j2的版本号&#xff09;...

天元建设集团有限公司 伊永成 电话/小程序seo推广技巧

随着现在电子产品的流行&#xff0c;很多小伙伴可能都避免不了近视&#xff0c;有这么一个老板&#xff0c;看中卖眼镜的商机&#xff0c;开始去做眼镜。卖眼镜的老板&#xff0c;靠着一款499元的眼镜&#xff0c;一个月就卖了1450多万。看到这里&#xff0c;大家伙肯定不信&am…...

做摄影网站的目的是什么意思/快速搭建网站的工具

一.描述 均值漂移聚类是另一种基于质心的算法&#xff0c;旨在发现一个样本密度平滑的blobs。它的工作原理与K均值聚类十分相似&#xff0c;但也存在一些明显差异。首先&#xff0c;均值漂移聚类不需要像k均值聚类那样指定集群数量&#xff1b;其次&#xff0c;均值漂移聚类会…...

网站建设与网页设计教程/百度网盘app下载安装

linux passwd批量修改用户密码原文&#xff1a;http://blog.csdn.net/xuwuhao/article/details/46618913对系统定期修改密码是一个很重要的安全常识&#xff0c;通常&#xff0c;我们修改用户密码都使用 passwd user 这样的命令来修改密码&#xff0c;但是这样会进入交互模式&a…...

上海平台网站建设企业/惠州seo怎么做

一、需求Mac自带的JDK一般为1.6&#xff0c;安装IDE时会提示版过旧&#xff0c;从而需要替换成更高的版本&#xff1b;安装 Gradle&#xff1b;在 Eclipse 上导入并构建 Gradle 项目&#xff1b;二、配置 JAVA_HOME由于在添加 Gradle 环境变量时&#xff0c;发现 JAVA_HOME 的路…...