likes
comments
collection
share

给没看过Spring Cloud的小白一篇启蒙文微服务架构已经是现代应用开发中的主流,而 Spring Cloud 作为

作者站长头像
站长
· 阅读数 48

微服务架构已经是现代应用开发中的主流,而 Spring Cloud 作为微服务的顶级工具库,提供了许多组件来简化服务的开发、部署和管理。如果你是第一次接触 Spring Cloud,不用担心,这篇文章将带你从零开始,一步步了解 Spring Cloud 的关键组件和它们的工作原理。

一、Spring Cloud 简介

Spring Cloud 是 Spring 的一个扩展项目,专门为微服务架构提供解决方案。它集成了多种工具,帮助开发者在分布式环境中构建健壮、灵活的系统。Spring Cloud 主要解决的问题有:

  1. 服务注册与发现
  2. 负载均衡
  3. 配置管理
  4. 服务调用
  5. 断路器
  6. API 网关
  7. 分布式跟踪

核心概念

  • 微服务:将一个大而全的应用拆分为多个独立的服务,每个服务专注于完成某一特定业务功能。
  • 分布式系统:微服务架构下,系统通常由多个服务组成,这些服务可能运行在不同的服务器上。

接下来,我们逐一讲解一下这些核心组件和它们的工作原理。

二、服务注册与发现:Eureka

什么是服务注册与发现呢?

在微服务架构中,服务之间相互调用。为了能够找到对方,Spring Cloud 使用了 服务注册与发现 机制。每个服务启动后会向一个服务注册中心注册自己的信息(如 IP、端口等),其他服务需要调用它时,可以通过这个中心获取它的位置。

emmmm

假设你在一个购物中心,商店的布局经常会变,有的店开业,有的店关门。为了避免顾客迷路,购物中心有一个 信息台,负责实时更新所有商店的位置、营业状态等信息。顾客只需到信息台询问,不需要记住每个商店的具体位置。

Eureka 就是购物中心的信息台,所有的服务(商店)启动时会在 Eureka 这里登记自己的位置(IP 地址、端口等),然后其他服务(顾客)通过信息台找到它们。

Eureka 介绍

Eureka 是 Netflix 开源的一个服务注册和发现的组件。Spring Cloud 对其进行了封装,非常容易使用。

核心原理

  • Eureka Server:服务注册中心,负责管理所有注册的服务。
  • Eureka Client:每个微服务都作为客户端,启动时会将自己的信息注册到 Eureka Server,并定期发送心跳告诉服务器自己还活着。

举个栗子

  1. 添加依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
  1. 启动 Eureka Server:
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}
  1. Eureka Client 注册:
@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaClientApplication.class, args);
    }
}

通过这种方式,Eureka 能够管理各个微服务的注册和发现,从而让服务不需要记住其他服务的具体地址,而是动态获取

三、负载均衡:Ribbon

什么是负载均衡嘞?

当一个服务有多个实例时,客户端调用服务时需要知道该请求发送到哪个实例。负载均衡 就是通过一定的策略,决定请求发给哪个实例。

emmmmm

假设购物中心里有好几家奶茶店(同一个服务的多个实例),你想买杯奶茶。这时,信息台告诉你所有奶茶店的位置,但你还得决定去哪个店。你发现有些店门口排队长,有些队伍短,于是你选择了一个排队最短的店。

Ribbon 就像顾客选择哪家奶茶店,它会从信息台(Eureka)获取所有奶茶店的位置,并根据负载均衡策略(比如队伍长短)选择一个实例(奶茶店)来服务。

Ribbon 介绍

Ribbon 是 Spring Cloud 中的客户端负载均衡器,它会从 Eureka Server 获取服务列表,然后根据负载均衡策略选择一个实例进行请求。

核心原理

Ribbon 会从 Eureka 获得服务实例列表,然后使用负载均衡策略(如轮询、随机等)挑选一个实例发送请求。

Ribbon 的使用

Spring Cloud 默认集成了 Ribbon,只需在调用端引入依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

然后在服务调用时,Ribbon 会自动从注册中心获取可用实例并进行负载均衡。

四、配置管理:Spring Cloud Config

什么是配置管理?

在微服务架构中,每个服务都有许多配置项,手动管理和更新这些配置非常麻烦。配置管理 解决了这个问题,集中管理所有服务的配置,并可以在不重启服务的情况下进行动态更新。

emmmmm

购物中心里的每个商店都有自己的营业时间、促销活动等信息。这些信息如果要手动贴在每家店门口会很麻烦。于是,购物中心建立了一个 中央公告板,每个商店可以从公告板上获取最新的政策、活动信息,并且可以实时更新。

Spring Cloud Config 就是这个中央公告板,它集中管理各个微服务的配置信息。当某个配置项改变时,商店(微服务)可以自动获取最新配置,而不需要手动去修改。

Spring Cloud Config 介绍

Spring Cloud Config 提供了集中化的配置管理服务,支持从 Git、SVN 等版本控制系统中加载配置文件。

核心原理

  • Config Server:集中配置中心,管理配置文件。
  • Config Client:每个微服务作为客户端从 Config Server 获取配置。

举个栗子

  1. 创建 Config Server:
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }
}
  1. bootstrap.yml 中配置 Config Server 的信息:
spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/your-repo/config-repo
  1. 在客户端的 bootstrap.yml 中配置 Config Server 的地址:
spring:
  cloud:
    config:
      uri: http://localhost:8888

这样,客户端启动时会自动从 Config Server 获取配置信息。

五、断路器:Hystrix

什么是断路器?

在分布式系统中,服务间的调用有时会失败。断路器 的作用是在调用失败时,及时中断调用链,避免请求雪崩(即大量请求阻塞导致系统崩溃)。

emmmm

假设购物中心里有一家很受欢迎的快餐店,每天都有很多顾客。如果有一天这个快餐店突然因为设备问题服务很慢,门口排队的人越来越多,甚至堵住了通道,影响了其他商店的生意。购物中心的管理方为了不让整个商场的运营受影响,决定 临时关闭 这个快餐店的入口,提醒顾客去其他餐厅就餐。

Hystrix 就是这个“临时关闭”的措施,它负责当某个微服务(快餐店)出问题时,迅速切断它的调用,并提供一个备用服务(提示顾客去别的地方吃),避免系统崩溃或请求雪崩。

Hystrix 介绍

Hystrix 是 Netflix 开发的一个断路器库,用于处理服务故障。Spring Cloud 对其进行了封装,简化了使用。

核心原理

当服务请求失败时,Hystrix 会快速返回一个预设的降级响应,而不是继续等待超时,从而保护系统。

举个栗子

  1. 引入依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
  1. 在服务方法上使用 @HystrixCommand 注解:
@HystrixCommand(fallbackMethod = "fallbackMethod")
public String someServiceCall() {
    // 调用可能失败的服务
}
public String fallbackMethod() {
    return "Fallback response";
}

这样,当 someServiceCall 调用失败时,Hystrix 会执行 fallbackMethod 返回默认值。

六、API 网关:Zuul

什么是 API 网关?

在微服务架构中,API 网关充当客户端与后端服务的入口点,管理所有服务的访问和路由。

emmmm

购物中心有多个出入口,每个入口负责导流不同的顾客,比如有的入口专门给开车来的顾客,有的入口负责步行的顾客。入口还有保安,检查每个进来的顾客是否有门票(权限),并指引他们去合适的楼层和商店。

Zuul 就是购物中心的出入口,它是 API 网关,负责把外部的请求(顾客)引导到正确的微服务(商店),同时可以进行权限检查、限流等功能,保证系统安全和顺畅。

Zuul 介绍

Zuul 是 Netflix 的开源 API 网关组件,Spring Cloud 提供了对 Zuul 的集成。

核心原理

Zuul 负责将外部请求转发到具体的微服务,并提供权限校验、负载均衡、限流等功能。

举个栗子

  1. 引入依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
  1. 启用 Zuul:
@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication {
    public static void main(String[] args) {
        SpringApplication.run(ZuulApplication.class, args);
    }
}

Zuul 会根据配置自动将请求路由到相应的微服务。

七、分布式跟踪:Sleuth + Zipkin

什么是分布式跟踪?

在微服务系统中,服务间的调用链复杂,为了追踪问题,我们需要知道每个请求经过了哪些服务。这就是 分布式跟踪 的作用。

emmmmm

假设购物中心为每个顾客发放一张带有编号的购物卡,每个顾客从进门到离开时,购物卡上都会记录他去过哪些商店、买了什么东西。如果有顾客投诉某家商店的服务问题,管理方可以通过购物卡的记录,追踪整个购物过程,找出问题的根源。

Sleuth 就像这个购物卡,它为每个请求(顾客)生成一个唯一的标识,并记录它经过的所有服务。Zipkin 则负责收集这些记录,帮助我们可视化每个请求的完整流转路径,从而找到问题发生在哪个环节。

Sleuth 和 Zipkin 介绍

Sleuth 是 Spring Cloud 的分布式跟踪库,负责为每个请求添加唯一的标识符。Zipkin 是用于收集和展示跟踪数据的工具。

核心原理

Sleuth 会为每个请求生成一个 Trace ID,并将其传递给所有参与请求的服务,Zipkin 则负责收集这些 Trace 并可视化显示请求链路。

举个栗子

  1. 引入依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
  1. 配置 Zipkin 地址:
spring:
  sleuth:
    sampler:
      probability: 1.0
  zipkin:
    base-url: http://

localhost:9411

通过这些配置,我们就可以追踪每个请求在微服务中的流转过程。

这就是Spring Cloud 中的核心组件,包括服务注册与发现、负载均衡、配置管理、断路器、API 网关和分布式跟踪。这些组件极大地简化了微服务架构的开发和管理,让我们能够轻松应对分布式系统中的各种挑战。

如果你是初次接触 Spring Cloud,建议从简单的项目开始,逐步尝试这些功能,体验体验它们带来的便利。

转载自:https://juejin.cn/post/7422829057517813786
评论
请登录