架构设计系列(七):微服务架构

一、概述

  随着业务规模的不断扩大,开发团队不断扩张,传统的单体服务会出现团队协助和系统性能上的问题。例如:

  • 部署效率低:代码越来越多,所依赖的资源不断增长,导致打包部署的时间越来越长。
  • 团队开发效率低:随着团队的扩张,多人协同在同一个分支同一个模块中编写代码,增大了代码冲突的概率,就算是细微的修改也需要重启服务,在不断重启中浪费测试资源,导致开发效率低。
  • 系统可用性差:由于所有的业务都在服务中,一旦有功能模块出现故障,则整个服务都将无法使用。

  基于以上的痛点,微服务在业务开发上的应用越来越广。其实在初期的技术选型上,是选用微服务还是使用单体,需要根据当时的团队规模,业务量等综合因素作为评估。而不是一股脑的拍板新的就是好的。

二、微服务架构组成

  我们经常说的微服务,并不是单单指的是业务服务,它是一个整体的概念,总得来说可以分成两类,基础组件和业务服务。基础组件是处理一些非业务逻辑及整个系统的管理和监控(服务自治)而业务服务则复杂整体的业务实现。

在这里插入图片描述

下图展示了一个典型的微服务架构体系:

  • 负载均衡器 (Load Balancer):负责将传入流量分发到多个后端服务。
  • 内容分发网络 (CDN):由地理分布的服务器集群组成,用于缓存静态内容以加速交付。客户端会首先在CDN中查找所需内容,如果未找到,才会进一步访问后端服务。
  • API网关 (API Gateway):处理传入请求并将其路由至相应服务。其功能包括与身份提供者交互以及执行服务发现。
  • 身份提供者(Identity Provider):负责用户的身份认证(Authentication)和授权(Authorization)。
  • 服务注册与发现 (Service Registry &Discovery):微服务的注册和发现均在此组件完成,API网关通过此组件定位需要通信的目标服务。
  • 管理组件(Management):负责服务的监控与管理。
  • 业务服务(Microservices):按不同业务域设计和部署的独立服务。每个业务域拥有专属数据库。API网关通过RESTAPI或其他协议与微服务通信,而同一业务域内的微服务之间则通过RPC(远程过程调用)进行交互。

三、微服务最佳实践

在这里插入图片描述
在开发微服务时,我们需要遵循以下最佳实践:

  • 为每个微服务使用独立的数据存储:
    每个微服务拥有专属数据库(如 MySQL、PostgreSQL),避免跨服务直接访问数据。 数据所有权明确,确保服务间解耦。
  • 保持代码的成熟度一致:
    确保所有微服务的代码质量、测试覆盖率和文档水平处于相近水平。 避免因部分服务技术债务过高而影响整体系统稳定性。
  • 为每个微服务独立构建:
    每个微服务拥有独立的代码库与构建流水线(CI/CD Pipeline)。 支持独立部署与版本管理,避免服务间耦合。
  • 为每个微服务分配单一职责:
    每个微服务专注于单一业务功能(如支付、用户管理)。 避免服务功能过重(Monolithic Service)导致维护困难。
  • 容器化部署:
    使用 Docker 将微服务打包为容器镜像,确保环境一致性。 通过 Kubernetes 实现自动化部署、扩缩容与滚动更新。
  • 设计无状态服务:
    服务不保存客户端会话状态,所有状态信息存储于外部(如 Redis、数据库)。 支持水平扩展,提升系统弹性。
  • 采用领域驱动设计(DDD):
    通过事件风暴(Event Storming)明确业务边界(Bounded Context)。
    使用聚合根(Aggregate Root)管理领域对象的一致性。
  • 设计微前端架构:
    将前端应用拆分为多个独立模块,每个模块对应一个微服务。
    支持独立开发、测试与部署。
  • 微服务编排
    使用编排工具(如 Kubernetes、Docker Compose)管理服务依赖与生命周期。
    支持服务发现、负载均衡与故障恢复。

四、微服务涉及到的技术栈

在这里插入图片描述

4.1 开发阶段

  • API定义:适用openAPI或者postman等工具,定义前后端的API接口。同时后端的接口发生变更也需要通过工具让前端有所感知。
  • 开发语言:前端适用react、node.j等,而后端则使用java/python/go等
  • 持续集成:使用jenkins进行服务的构建与发布,通过集成junit 实现自动化测试。

4.2 发布上线

  • 使用nginx作为负载均衡器,统一管理请求,并结合cdn加快用户对静态资源的读取。
  • API网关使用springClould的gateway进行路由分发和身份验证,同时配合着zuul与Eureka或者nacos实现服务的注册与发现。
  • 服务上云,国外比较多的是在aws、Azure上,而国内更多的使用 阿里云及腾讯云。
  • 分布式缓存:在缓存的选型上基本使用redis。
  • 全文检索:es
  • 消息中间件:kafaka、rocketmq
  • 关系型数据库:mysql、pgsql、oracle等
  • 对象存储:s3、oss及minio
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Resean0223

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值