微服务架构学习笔记

news2024/10/25 5:46:02

#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网关层实现请求限流与熔断机制,避免后端服务被恶意请求淹没。

总结

微服务架构带来了灵活性、可扩展性和独立性,但同时也增加了系统的复杂度。成功的微服务架构需要结合领域驱动设计、良好的服务拆分策略、完善的监控与日志系统、合理的通信方式和事务处理机制。掌握这些原则和工具,能够帮助开发者在实际项目中更好地应用微服务架构。

 

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

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

相关文章

【Docker】docker | 部署nginx

一、概述 记录下nginx的部署流程;将conf配置文件映射到宿主机 前提依赖:自行准备nginx的镜像包 二、步骤 1、运行、无映射 docker run --name nginx -p 80:80 -d nginx:1.18.0-alpine 80:80,前面是宿主机端口;如果冲…

Spring Boot植物健康系统:智慧农业的新趋势

6系统测试 6.1概念和意义 测试的定义:程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为: 目的:发现程序的错误; 任务:通过在计算机上执行程序,暴露程序中潜在的错误。 另一个…

ripro-v5-8.3开心版主题源码

1、下载主题源码ripro-v5.zip进行安装。 2、下载激活文件ripro-v5-active.php上传到wp根目录,访问一次,即可激活。 源码下载:https://download.csdn.net/download/m0_66047725/89915698 更多资源下载:关注我。

队列(数据结构)——C语言

目录 1.概念与结构 2.队列的实现 初始化QueueInit 申请新节点BuyNode 入队QueuePush 判断队为空QueueEmpty 出队QueuePop 读取队头数据QueueFront 读取队尾数据QueueBack 元素个数QueueSize 销毁队列QueueDestroy 3.整体代码 (文章中结点和节点是同一个意思) 1.概…

闯关leetcode——203. Remove Linked List Elements

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/remove-linked-list-elements/description/ 内容 Given the head of a linked list and an integer val, remove all the nodes of the linked list that has Node.val val, and return the new …

C语言实现二叉树和堆

1.二叉树概念及结构 1.1概念 一棵二叉树是结点的一个有限集合,该集合: 1. 或者为空 2. 由一个根结点加上两棵别称为左子树和右子树的二叉树组成 从上图可以看出: 1. 二叉树不存在度大于2的结点 2. 二叉树的子树有左右之分,次序不能颠倒&…

案例分析-系统开发基础

案例分析考点分类: 软件架构设计:考质量属性、软件架构分析(第一题)、软件架构评估、MVC架构、SOA架构、ESB、J2EE架构、DSSA、ABSD等(第二题)、系统开发基础:考UML的图、关系的识别,尤其是类图、用例图、活动图、状态图、设计模式…

Flutter 状态管理框架Get

状态管理框架 Get的使用 目录 状态管理框架 Get的使用 GetMaterialApp 路由的注册 路由的跳转 middlewares的使用 组件使用 defaultDialog bottomSheet snackbar 状态刷新有很多种方式 ValueBuilder Obx 基础使用 是时候引入GetxController, 也是Get里面的常用的 G…

DevOps实践:在GitLab CI/CD中集成静态分析Helix QAC的工作原理与优势

基于云的GitLab CI/CD平台使开发团队能够简化其CI/CD流程,并加速软件开发生命周期(SDLC)。 将严格的、基于合规性的静态分析(如Helix QAC所提供)作为新阶段添加到现有的GitLab CI/CD流程中,将进一步增强SD…

华为云购买弹性云服务器(教程)

配置弹性云服务器 基础配置 实例 操作系统

1.CentOS安装

CentOS安装 新建虚拟机 选择安装方式 指定镜像方式 选择操作系统类型 设置虚拟机名称和位置 指定磁盘大小 点击“自定义硬件” 指定内存大小 指定镜像位置 点击“开启此虚拟机” 选择“Install CentOS 7”并回车 选择语言 选择安装“GNOME桌面”环境 配置安装位置 配置网络和…

排序05 排序模型的特征

特征介绍: id embedding,通常用32或64维向量 特征处理 线上服务的系统架构 统计数据是有时效性的,不能缓存在服务器本地。画像可以,保证读取快就好。 tf serving 这里 tensorflow会给笔记打分,分数返回给排序服务器&…

本地docker部署中间件和应用

Docker Desktop搭建 安装完成之后使用docker下载镜像,报以下错误: 解决办法: Docker Engine配置能访问的镜像地址: {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled…

搭建 mongodb 副本集,很详细

搭建 mongodb 副本集,很详细 一、前言二、创建用户1、创建 root 用户2、创建测试用户3、修改用户密码 三、修改配置文件(主节点)1、开启登录认证2、加上副本集3、最终配置文件 四、副本节点1、创建副本节点目录2、编辑配置文件3、启动副本节点…

【python实操】python小程序之参数化以及Assert(断言)

引言 python小程序之参数化以及Assert(断言) 文章目录 引言一、参数化2.1 题目2.2 代码2.3 代码解释 二、Assert(断言)2.1 概念2.1.1 Assert语句的基本语法:2.1.2 基本断言2.1.3 断言函数参数2.1.4 断言前后状态一致 2…

网页HTML编写练习:华语榜中榜

网页效果 HTML代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice…

NLP--一起学习Word Vector【实践】

纸上得来终觉浅&#xff0c;绝知此事要躬行。 《冬夜读书示子聿》 值此1024的程序员节&#xff0c;我们一起学习 Word Vector。 本章一起学习文本向量化&#xff0c;掌握文本向量的相关概念&#xff0c;了解各个文本向量&#xff0c;实现文本向量的算法 我开启了一个NLP共学坊…

arm ubuntu22.04 安装es7.16.2

1、更新软件包 sudo apt update && sudo apt upgrade -y 2、安装jdk11 sudo apt install openjdk-11-jdk -y 安装查看版本 java -version 输出应该是这样的 openjdk version "11.0.11" 2021-04-20 OpenJDK Runtime Environment (build 11.0.119-Ub…

【主机漏洞扫描常见修复方案】:Tomcat安全(机房对外Web服务扫描)

文章目录 引言I SSL/TLS Not ImplementedTomcat 服务器 SSL 证书安装部署(JKS 格式)Tomcat 服务器 SSL 证书安装部署(PFX 格式)HTTP 自动跳转 HTTPS 的安全配置(可选)修复SSL证书版本低II 主机漏洞扫描常见修复方案Apache JServ protocol serviceSlow HTTP DEnial of Ser…

Ubuntu 上安装 Redmine 5.1 指南

文章目录 官网安装文档&#xff1a;命令步骤相关介绍GemRubyRailsBundler 安装 Redmine更新系统包列表和软件包&#xff1a;安装必要的依赖&#xff1a;安装 Ruby&#xff1a;安装 bundler下载 Redmine 源代码&#xff1a;安装 MySQL配置 Redmine 的数据库配置文件&#xff1a;…