0
点赞
收藏
分享

微信扫一扫

分布式-单元化架构1

引言


1. 认识微服务

下图表示了服务架构从单体应⽤逐渐转变为微服务应⽤的过程


1. 单体架构

示例:电商系统

以电商系统为例,该系统包括用户管理、商品管理、订单管理、支付管理、库存管理、物流管理等模块。在项目的早期阶段,这些模块都被写入同一个Web项目中,统一部署到一个Web服务器上。单体架构的优势在于开发和部署都相对简单,所有功能都集成在一个项目中,省去了多个项目之间的交互和调用消耗。


2. 集群与分布式架构

优化方式

为了解决这些问题,我们可以从两个方面进行优化:

  • 横向扩展:通过添加服务器,将单台机器扩展为多个机器的集群。
  • 纵向拆分:将单个应用按业务进行拆分,形成多个独立项目,这种架构也称为垂直架构。

集群与分布式的关系

  • 概念上:集群是多个计算机做同样的事,而分布式是多个计算机做不同的事。
  • 功能上:集群的每个节点功能相同,且可替代;分布式系统的每个节点完成不同的业务。
  • 实践中:分布式和集群常常是互相配合使用的,很多分布式架构建立在集群之上。

3. 微服务架构

在分布式架构下,随着服务数量的增加,重复的功能开发和服务调用关系也会变得复杂。我们可以将一些通用的、被多个服务调用的共享业务提取为独立的基础服务,形成微服务。

微服务的定义

微服务是指非常小的服务,每个服务对应单一功能,能够独立部署和运行。微服务之间可以通过REST和RPC协议进行通信,具有良好的架构设计特点。

微服务架构与分布式架构的关系

  • 分布式架构:强调服务的分散化,主要关注于压力的分散。
  • 微服务架构:强调服务的专业化和精细分工,是分布式架构的一种扩展,通常意味着需要解决分布式架构的各种难题。

4. 微服务带来的挑战

尽管微服务架构有诸多优势,但随着产品复杂性和流量增加,管理和运维也变得更加复杂。

优势

  • 易开发和维护:每个微服务的业务逻辑清晰,体量小,降低了开发和维护成本。
  • 容错性高:一个服务故障可以隔离在单个服务中,不影响整体服务的可用性。
  • 扩展性好:每个服务独立运行,可以根据需求灵活扩展。
  • 技术选型灵活:各微服务可以根据业务特点和团队选择适合的技术栈。

挑战

  • 服务依赖:随着服务数量增多,服务之间的关系变得复杂,一个服务的变更需要考虑其他服务的影响。
  • 运维成本:涉及多个微服务的业务流程需要管理更多的服务,运维难度增大。
  • 开发与测试:多服务间的调用引入网络延迟,如何处理这些问题对开发和测试提出挑战。
  • 服务监控:在微服务架构中,需要对每个服务和整个链路进行监控,增加了实现难度。
  • 负载均衡:微服务实例数量庞大,需要有效的服务发现和负载均衡机制以保证高可用性。

5. Spring Cloud 在微服务集群中的应用

1. Eureka —— 服务注册与发现

Eureka 是 Netflix 开发的服务发现组件,主要用于解决微服务架构中的服务注册和发现问题。

  • 服务注册:每个微服务在启动时会向 Eureka Server 注册自己的服务信息(如 IP 地址、端口、服务名称等)。
  • 服务发现:当一个服务需要调用其他服务时,可以从 Eureka Server 获取其他服务的地址信息,而无需手动配置,增强了系统的动态性。

Spring Cloud 通过 Eureka 让微服务可以互相发现,减少了服务地址的硬编码,并且支持集群模式,保证高可用性。


2. Ribbon —— 客户端负载均衡

Ribbon 是 Netflix 提供的客户端负载均衡器,和 Eureka 配合使用。

  • 当一个微服务需要调用其他服务时,Ribbon 从 Eureka 获取服务的实例列表,并根据一定的负载均衡策略(如轮询、随机、加权等)选择合适的服务实例进行调用。
  • 这种客户端负载均衡机制可以分散请求压力,避免单个服务实例过载,提高系统的可靠性和响应速度。

3. Feign —— 声明式服务调用

Feign 是 Spring Cloud 提供的一个声明式 HTTP 客户端,简化了微服务之间的调用。

  • 使用 Feign,开发者只需要定义接口,并通过注解的方式声明需要调用的服务和具体的请求路径。Feign 会自动根据 Eureka 的服务发现机制,找到对应的服务实例,并发起 HTTP 请求。
  • Feign 内部集成了 Ribbon,支持负载均衡功能。

4. Hystrix —— 熔断器

Hystrix 是 Netflix 开发的熔断器组件,主要用于提升系统的容错能力,防止服务之间的调用出现连锁故障。

  • 熔断器模式:当某个服务调用失败达到一定次数时,Hystrix 会开启熔断,后续的请求将不会继续调用该服务,而是直接返回一个预设的降级结果,避免大量请求堆积导致系统崩溃。
  • 隔离策略:通过线程池或信号量对每个服务调用进行隔离,避免单个服务的故障影响整个系统的可用性。

5. Zuul/Gateway —— API 网关

Zuul 和 Spring Cloud Gateway 都是用于处理所有微服务的外部请求的 API 网关。

  • API 路由:网关根据请求的 URL 路由到相应的微服务。
  • 负载均衡:网关可以和 Ribbon 配合进行负载均衡。
  • 安全和鉴权:网关可以统一处理请求的认证、授权、日志记录等,保证系统的安全性。
  • Spring Cloud Gateway 是 Spring 官方推出的新一代网关解决方案,替代了 Netflix Zuul,具有更高的性能和更灵活的路由配置。

6. Config Server —— 分布式配置管理

在微服务架构中,每个服务可能有不同的配置文件,管理起来比较繁琐。Spring Cloud Config 组件提供了一个集中化的配置管理服务。

  • 集中管理:所有的微服务配置都可以存储在远程的 Git 或 SVN 仓库中,Config Server 可以实时获取最新的配置。
  • 动态刷新:当某个服务的配置发生变更时,Config Server 可以通过 Spring Cloud Bus 实现配置的动态刷新,无需重启服务。

7. Sleuth 和 Zipkin —— 分布式链路追踪

在微服务架构中,服务之间的调用链路非常复杂,定位问题变得更加困难。Spring Cloud Sleuth 和 Zipkin 是用于解决分布式系统中链路追踪的工具。

  • Sleuth:在每个服务的调用链路中,Sleuth 会自动生成唯一的追踪 ID 和跨度 ID,帮助记录每个请求的详细调用路径。
  • Zipkin:Zipkin 是一个分布式追踪系统,能够收集并展示 Sleuth 生成的追踪数据,帮助开发者监控和分析服务之间的调用关系和性能瓶颈。

8. Spring Cloud Bus —— 消息总线

Spring Cloud Bus 是基于消息队列的轻量级消息传递组件,主要用于微服务之间的事件传播。

  • 配置刷新:通过 Spring Cloud Bus,配置中心的更新可以实时广播到所有微服务,实现配置的动态更新。
  • 事件通知:Bus 也可以用于在多个微服务之间传递事件,简化了微服务之间的通信。

Spring Cloud 为微服务架构提供了全面的解决方案,涵盖了服务注册与发现、负载均衡、熔断、配置管理、链路追踪等方面,帮助开发者轻松构建和管理大规模分布式系统。在实际应用中,Spring Cloud 常与 Docker、Kubernetes 等容器化技术配合使用,进一步增强微服务的可扩展性和弹性。


6. 结论

举报

相关推荐

0 条评论