微服务知识体系梳理

一.微服务的基础和概念

一.什么是微服务

微服务是一种架构风格,旨在将一个应用拆分为小的、独立的服务,每个服务负责一个明确的业务功能,提高了可伸缩性和灵活性。每个微服务可以使用适当的技术栈,独立部署,通过API进行通信。尽管带来解耦和并行开发的优势,微服务也带来了分布式系统复杂性和运维挑战。实施微服务需要仔细的设计、版本控制、服务发现、负载均衡、监控等策略,以确保系统的一致性、可靠性和性能。

二.微服务与单体应用对比

对比方面:

  1. 架构模式:

    • 单体应用:整个应用作为一个单一的、紧密集成的单体运行。
    • 微服务:应用被拆分为多个小而独立的微服务,每个服务负责一个明确的业务功能。
  2. 规模与复杂性:

    • 单体应用:随着功能增加,单体应用变得庞大和复杂,难以维护。
    • 微服务:微服务架构可以更容易地管理和扩展,每个服务相对较小且易于理解。
  3. 部署与扩展:

    • 单体应用:整个应用需要一次性部署和扩展,可能导致资源浪费。
    • 微服务:每个微服务可以独立部署和扩展,根据需要分配资源,提高资源利用率。
  4. 技术多样性:

    • 单体应用:通常采用单一技术栈。
    • 微服务:不同的微服务可以使用适合其需求的不同技术栈和语言。
  5. 团队协作:

    • 单体应用:多个团队在同一代码库中开发,可能导致协作问题。
    • 微服务:不同团队可以独立开发、测试和部署各自的微服务,加强协作。

微服务优势:

  1. 可伸缩性: 微服务架构支持水平扩展,只需扩展需要的服务,避免资源浪费。
  2. 灵活性: 不同的服务可以独立更新和部署,实现快速交付。
  3. 独立性: 故障在一个服务中发生时,不会影响整个应用,提高系统弹性。
  4. 技术选型: 不同的服务可以使用最适合的技术栈,促进创新和灵活性。
  5. 快速迭代: 每个服务可以独立进行快速迭代和更新,提高开发效率。
  6. 团队协作: 不同团队可以并行开发,加速项目开发进程。

微服务劣势:

  1. 复杂性: 管理多个微服务以及它们之间的通信和数据一致性可能变得复杂。
  2. 分布式系统挑战: 处理分布式事务、服务发现和跨服务通信等问题需要额外的设计和工作。
  3. 部署和监控: 部署和监控多个微服务可能需要更复杂的工具和流程。
  4. 测试复杂性: 在微服务环境中进行端到端测试可能更具挑战性。
  5. 初始开发成本: 拆分和设计微服务架构需要额外的初始开发成本和计划。

综合考虑,微服务架构在灵活性、可伸缩性和团队协作方面具有明显优势,但也需要应对复杂性和分布式系统挑战。在选择架构时,组织需要根据自身需求和情况权衡这些优势和劣势。

三.微服务架构设计原则

  1. 单一职责原则 (SRP):

    • 每个微服务应专注于一个明确的业务领域,保持高内聚性和低耦合性,以便实现独立部署和维护。
  2. 松耦合与强内聚 (Loose Coupling and High Cohesion):

    • 微服务之间应松耦合,通过定义清晰的接口和通信方式来实现,同时每个微服务应具有强内聚性,专注于一个特定的业务功能。
  3. 自治性 (Autonomy):

    • 每个微服务应该具有自主性,能够独立进行部署、伸缩和决策,以减少对其他服务的依赖。
  4. API设计优先:

    • 在开发微服务之前,首先定义清晰的 API 设计,以确保良好的接口和通信机制(Rest或者消息队列)。
  5. 去中心化数据管理:

    • 每个微服务应该拥有自己的数据存储,采用数据库拆分策略,以避免数据竞争和提高自治性。
  6. 服务拆分与组合 (Service Splitting and Composition):

    • 微服务的拆分和组合应根据业务领域划分,同时考虑服务之间的协同和相互作用。
  7. 扩展优先:

    • 设计微服务时考虑可伸缩性,使系统能够容易地水平扩展,以满足高负载需求。
  8. 自动化部署和持续集成 (Automated Deployment and Continuous Integration):

    • 采用自动化部署和持续集成流程,实现快速、可靠的微服务部署和更新。
  9. 外部化配置:

    • 将配置信息外部化,以支持不同环境和部署的配置变更。

二.微服务拆分策略

  1. 业务能力拆分(Business Capability Splitting):

    • 将系统按照业务领域的不同能力(例如订单处理、库存管理)拆分成微服务,每个微服务专注于一个独立的业务领域。
  2. 子域拆分(Subdomain Splitting):

    • 基于领域驱动设计(DDD)的原则,将系统划分为多个子域,每个子域可以对应一个或多个微服务。
  3. 单一职责拆分(Single Responsibility Splitting):

    • 将单个服务的职责细分成多个微服务,每个微服务负责一个特定的功能或任务,实现高内聚和低耦合。
  4. 数据拆分(Data Splitting):

    • 基于数据模型,将数据存储拆分成多个微服务,每个微服务管理自己的数据,并通过API与其他服务通信。
  5. 界面拆分(Interface Splitting):

    • 将用户界面和业务逻辑拆分成不同的微服务,实现前后端分离,提高开发、部署和维护的独立性。
  6. 多租户拆分(Multi-Tenancy Splitting):

    • 将多租户系统中的不同租户拆分成独立的微服务,以实现隔离和个性化的租户需求。
  7. 按用户角色拆分(User Role Splitting):

    • 将系统功能按照不同用户角色进行拆分,每个微服务负责满足特定用户角色的需求。
  8. 外部依赖拆分(External Dependency Splitting):

    • 将系统中依赖的外部服务或组件拆分成独立的微服务,以提高可替换性和灵活性。
  9. 按团队拆分(Team-based Splitting):

    • 将微服务的拆分与开发团队的结构对应,每个团队负责一个或多个微服务的开发和维护。

这些微服务拆分策略可以根据项目需求和架构目标进行选择和组合,以帮助设计出适合的微服务架构。不同的策略可能在不同的情况下更加适用,因此需要根据具体情况进行权衡和决策。

三.微服务通信与协同方式

1.同步通信(Synchronous Communication)

  • 场景使用: 适用于需要实时响应的情况,如用户请求等。
  • 简要介绍: 微服务通过直接调用其他微服务的API来进行通信,调用方会等待响应返回后继续执行。

2.异步通信(Asynchronous Communication)

  • 场景使用: 适用于不需要即时响应,可以在后台处理的情况,如异步任务、事件处理等。
  • 简要介绍: 微服务通过消息队列等方式发布消息,接收方在合适的时间处理消息,实现解耦和异步处理。

3.发布-订阅(Publish-Subscribe)

  • 场景使用: 适用于多个微服务对同一事件感兴趣的情况,如事件通知、广播等。
  • 简要介绍: 一个微服务发布事件,其他订阅者微服务监听并处理这些事件,实现松耦合的消息传递。

4.API 网关(API Gateway)

  • 场景使用: 适用于将多个微服务的API集中暴露给客户端,以简化客户端与微服务之间的通信。
  • 简要介绍: 客户端通过调用API网关来访问不同微服务的功能,API网关处理路由和协议转换等。

5.请求-响应(Request-Response)

  • 场景使用: 适用于需要明确请求和响应的场景,如远程调用等。
  • 简要介绍: 一个微服务发送请求给另一个微服务,等待响应返回后继续执行。

6.事件驱动(Event-Driven)

  • 场景使用: 适用于需要基于事件触发的场景,如状态变更、业务流程等。
  • 简要介绍: 微服务通过发布和订阅事件来进行通信,一个事件的发生触发其他微服务的相应动作。

以上请求-响应(Request-Response)和同步通信(Synchronous Communication)看似相同,但是略有差异,请求-响应模式包含同步通信模式,同时请求-响应模式也支持异步通信模式实现。我们用一个案例来说明区分:

同步通信示例:

  1. 用户下订单,订单服务需要检查库存。订单服务向库存服务发送请求,等待库存服务的响应。
  2. 库存服务收到请求,查询库存情况后,发送响应给订单服务。
  3. 订单服务收到响应后,根据库存情况决定是否继续处理订单。
    在这个示例中,订单服务在检查库存时采用了同步通信方式。订单服务发送请求给库存服务,并等待库存服务的即时响应,然后根据响应做出相应的决策。

请求-响应方式示例:

  1. 用户下订单,订单服务需要检查库存。订单服务向库存服务发起请求,但不等待响应。
  2. 同时,订单服务可以继续处理其他任务,如生成订单确认通知。
  3. 库存服务在后台处理请求,查询库存情况后,生成响应。
  4. 库存服务将响应发送给订单服务。
    在这个示例中,虽然订单服务在检查库存时也采用了请求-响应方式,但它并没有立即等待响应。相反,它可以在后台继续处理其他任务,而库存服务在后续时间内发送响应。

四.数据管理和一致性

一.面临哪些数据管理和一致性问题?

1.数据一致性的挑战

数据一致性问题指的是在微服务架构中,由于数据被拆分到不同的微服务中,可能导致数据的一致性难以保证的情况。当多个微服务同时访问和修改相同的数据时,可能出现以下问题:

  1. 数据冲突: 不同的微服务同时对同一数据进行修改,可能会导致数据冲突和不一致性
  2. 事务跨越: 由于微服务的自治性,每个微服务可能有自己的数据库事务。当一个操作需要跨越多个微服务时,很难维护全局的事务,可能导致操作不完整或不一致。
  3. 数据复制和同步: 不同的微服务可能会复制和缓存数据副本,但是在数据变更时如何进行同步和更新可能会引发一致性问题。
如何解决该问题?
  1. 分布式事务组件的使用,比如:Seata/Himma
  2. 最终一致性: 通过事件驱动架构或者异步通信方式实现核心数据状态的最终一致性。
  3. 事件溯源: 将系统的状态变化表示为事件,将事件存储在事件日志中,可以用于回放和恢复数据状态,保持数据的一致性和准确性。

2.客户端跨微服务数据访问复杂性提升

  1. 多次网络请求: 客户端需要发起多个网络请求,导致延迟和网络开销增加。

  2. 性能问题: 多次网络请求可能降低客户端性能,特别是在网络延迟高的情况下。

  3. 复杂性增加: 客户端需要管理多个微服务的数据请求和响应,代码复杂性增加,维护困难。

  4. 耦合问题: 直接访问多个微服务可能导致与微服务紧密耦合,微服务接口变化需要相应调整。

  5. 安全性问题: 直接访问微服务可能绕过微服务架构的安全机制,需要额外安全措施。

  6. 数据一致性问题: 不同微服务的数据分散,客户端需要确保获取和展示数据的一致性。

  7. 性能优化难题: 客户端需进行性能优化,如数据缓存和预加载,以减少多次微服务请求。

为解决这些问题,可考虑使用 API网关 作为客户端与微服务的中间层,将多个微服务的数据聚合和转换为单个请求,降低网络请求次数、耦合性,提升性能,确保数据一致性和安全性。

3.数据安全面临挑战

  1. 数据分散和多地存储: 微服务架构中的数据分散在不同微服务中,可能存储在不同数据库,增加了数据管理和保护的难度。

  2. 微服务边界模糊: 微服务之间的边界不清晰,访问和共享数据变得复杂,需要明确的数据边界和权限控制。

  3. 跨微服务访问: 跨多个微服务访问数据可能涉及到数据传递,需要保证数据在传递过程中的安全性。

  4. 数据共享问题: 微服务之间共享数据时需要确保数据传输过程中的加密和完整性,防止数据泄露和篡改。

  5. 安全通信: 微服务之间的通信需要进行加密和认证,以防止中间人攻击和数据泄露。

  6. 鉴权和认证: 不同微服务的鉴权和认证需要协调和管理,确保只有合法用户和服务可以访问数据。

  7. 审计和监控: 微服务架构下的数据访问需要进行审计和监控,以追踪数据使用和异常行为。

为了应对这些挑战,需要在微服务架构中采取适当的安全措施,包括数据加密、权限管理、认证和授权、安全通信、审计和监控等,以保护数据的安全性和隐私。

五.部署和自动化

微服务部署面临的挑战

  1. 服务拓扑和依赖关系: 微服务之间可能存在复杂的依赖关系,正确地部署这些服务以满足它们之间的通信需求可能会变得复杂,导致拓扑错误或通信问题。

  2. 服务发现和注册: 在多个微服务实例之间进行负载均衡和通信时,确保服务能够被正确地发现、识别和注册,以便其他服务能够找到它们并进行交互。

  3. 版本控制和回滚: 管理不同微服务的版本以及升级和回滚可能会变得复杂。确保新旧版本之间的兼容性,并在需要时能够回滚到之前的版本,是一个挑战。

  4. 配置管理: 不同微服务可能需要不同的配置参数。有效地管理和分发配置,以确保各个服务的正确配置和行为,可能会变得复杂。

  5. 弹性和容错性: 在微服务架构中,弹性和容错性至关重要,即在服务失败时能够快速恢复。需要设置适当的监控、自动化和故障处理机制。

  6. 部署一致性: 在多个环境(开发、测试、生产等)中保持一致的部署,尤其是当部署涉及多个微服务和依赖项时,可能是挑战。

  7. 安全性: 部署微服务需要确保适当的安全措施,包括访问控制、认证和加密等,以保护敏感数据和服务。

  8. 数据迁移: 当微服务发生更改时,可能需要进行数据迁移,以确保数据模型的变化与服务版本的升级保持一致。

自动化部署解决方案

1.容器化技术: 比如Docker和Kubernetes,对微服务进行隔离和管理,确保服务之间的依赖关系得到正确管理。

2.实施持续集成和部署,主要包含一下方面:
1.自动化构建和集成,常见组件如:jenkins、gitlab CI/CD。

2.自动化测试支持,常用方式:通过jenkins集成TestNG、Selenium、Cucumber等自动化测试工具实现构建过程中自动测试并输出测试报告。

3.自动化部署 ,通过结合 Jenkins 和 Kubernetes、Docker、gitlab等工具 实现从代码提交到应用程序在 Kubernetes 集群中自动部署的完整自动化流程。
4.快速回滚 ,快速回滚包括代码回滚(git)、容器回滚(Docker/Kubernetes)、应用程序状态回滚、数据库恢复等。

总结

  1. 以上微服务内容主要参考《Microservices Patterns: With examples in Java》和《Building Microservices: Designing Fine-Grained Systems》两本书内容,通过chatgpt对书中内容进行归纳总结提炼出来的。效率提升明显。chatgpt归纳过程中存在错误输出,需要进行纠正。

  2. 通过本次梳理,加深了整体微服务知识体系理解,理解了概念化思维的重要性。

  3. 脑图总结:
    在这里插入图片描述

  4. 微服务技术架构实例:
    在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值