Spring Cloud微服务超详细讲解

news/2024/11/13 15:44:05/

Spring Cloud 是一个基于 Spring Boot 的微服务框架,它提供了一系列工具和服务来帮助开发者构建和管理微服务架构。以下是一个超级详细的讲解,涵盖了 Spring Cloud 的核心概念、组件以及如何构建一个简单的微服务应用。

1. 微服务架构概述

什么是微服务

微服务架构是一种设计模式,将一个大型的单体应用拆分为多个小型的、独立的服务。每个服务负责一个特定的业务功能,并且可以独立部署、扩展和维护。

微服务的优势:
  • 独立开发和部署:每个服务可以独立开发、测试、部署和扩展。
  • 技术多样性:不同的服务可以选择最适合的技术栈。
  • 故障隔离:一个服务的故障不会影响整个系统。
  • 易于扩展:可以根据需求独立扩展每个服务。

2. Spring Cloud 核心概念

服务发现
  • Eureka: 一个用于服务注册与发现的组件。
  • Consul: 一个支持多数据中心的分布式服务网格。
  • Zookeeper: 一个高性能的协调服务。
配置管理
  • Config Server: 一个集中式的配置管理工具,可以将配置信息存储在 Git 或 SVN 中。
API 网关
  • Spring Cloud Gateway: 一个用于路由和过滤请求的网关。
  • Zuul: 一个 Netflix 开发的边缘服务,用于路由和过滤请求。
断路器
  • Hystrix: 一个断路器实现,用于处理服务调用失败的情况。
  • Resilience4j: 一个轻量级的故障处理库,用于替代 Hystrix。
服务链路追踪
  • Sleuth: 一个用于生成唯一标识符和跟踪信息的工具。
  • Zipkin: 一个收集和展示跟踪数据的工具。

3. 构建一个简单的 Spring Cloud 应用

3.1 创建项目结构

假设我们要构建一个简单的微服务应用,包含以下服务:

  • Config Server: 配置中心。
  • Eureka Server: 服务注册与发现。
  • Service A: 一个简单的服务。
  • Service B: 另一个简单的服务。
  • API Gateway: 网关服务。
3.2 配置 Config Server
  1. 创建 Config Server 项目

    spring init --dependencies=config-server config-server
    
  2. 修改 pom.xml

    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId>
    </dependency>
    
  3. 启用 Config Server: 在 src/main/java/com/example/configserver/ConfigServerApplication.java 中添加:

    @EnableConfigServer
    @SpringBootApplication
    public class ConfigServerApplication {public static void main(String[] args) {SpringApplication.run(ConfigServerApplication.class, args);}
    }
    
  4. 配置 application.yml

    server:port: 8888spring:cloud:config:server:git:uri: https://github.com/your-repo/config-repoclone-on-start: true
    
3.3 配置 Eureka Server
  1. 创建 Eureka Server 项目

    spring init --dependencies=eureka-server eureka-server
    
  2. 修改 pom.xml

    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    
  3. 启用 Eureka Server: 在 src/main/java/com/example/eurekaserver/EurekaServerApplication.java 中添加:

    @EnableEurekaServer
    @SpringBootApplication
    public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);}
    }
    
  4. 配置 application.yml

    server:port: 8761eureka:client:register-with-eureka: falsefetch-registry: falseservice-url:defaultZone: http://localhost:8761/eureka/
    
3.4 创建 Service A 和 Service B
  1. 创建 Service A 项目

    spring init --dependencies=web,actuator,eureka-client config-client-a
    
  2. 修改 pom.xml

    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId>
    </dependency>
    
  3. 启用 Eureka Client 和 Config Client: 在 src/main/java/com/example/clienta/ClientAApplication.java 中添加:

    @SpringBootApplication
    @EnableDiscoveryClient
    public class ClientAApplication {public static void main(String[] args) {SpringApplication.run(ClientAApplication.class, args);}@RestControllerclass MessageController {@Value("${message:Hello default}")private String message;@GetMapping("/message")public String getMessage() {return this.message;}}
    }
    
  4. 配置 bootstrap.yml

    spring:application:name: client-acloud:config:uri: http://localhost:8888eureka:client:service-url:defaultZone: http://localhost:8761/eureka/
    
  5. 创建 Service B 项目,步骤与 Service A 类似,只是 application.namemessage 不同。

3.5 配置 API Gateway
  1. 创建 API Gateway 项目

    spring init --dependencies=cloud-gateway,actuator,eureka-client api-gateway
    
  2. 修改 pom.xml

    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    
  3. 启用 Eureka Client: 在 src/main/java/com/example/apigateway/ApiGatewayApplication.java 中添加:

    @SpringBootApplication
    @EnableDiscoveryClient
    public class ApiGatewayApplication {public static void main(String[] args) {SpringApplication.run(ApiGatewayApplication.class, args);}
    }
    
  4. 配置 application.yml

    server:port: 8080spring:cloud:gateway:routes:- id: client-auri: lb://client-apredicates:- Path=/client-a/**- id: client-buri: lb://client-bpredicates:- Path=/client-b/**eureka:client:service-url:defaultZone: http://localhost:8761/eureka/
    

4. 测试微服务应用

  1. 启动 Config Server

    cd config-server
    ./mvnw spring-boot:run
    
  2. 启动 Eureka Server

    cd eureka-server
    ./mvnw spring-boot:run
    
  3. 启动 Service A 和 Service B

    cd config-client-a
    ./mvnw spring-boot:run
    
    cd config-client-b
    ./mvnw spring-boot:run
    
  4. 启动 API Gateway

    cd api-gateway
    ./mvnw spring-boot:run
    
  5. 访问服务

    • 访问 http://localhost:8080/client-a/message 应该返回 Service A 的消息。
    • 访问 http://localhost:8080/client-b/message 应该返回 Service B 的消息。

5. 进阶主题

5.1 断路器
  1. 添加 Hystrix 依赖

    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    </dependency>
    
  2. 启用 Hystrix: 在 ClientAApplication.java 中添加:

    @EnableHystrix
    
  3. 使用 @HystrixCommand

    @RestController
    class MessageController {@Value("${message:Hello default}")private String message;@GetMapping("/message")@HystrixCommand(fallbackMethod = "fallbackMessage")public String getMessage() {// Simulate a failureif (new Random().nextInt(10) < 5) {throw new RuntimeException("Service A is down");}return this.message;}public String fallbackMessage() {return "Fallback message";}
    }
    
5.2 服务链路追踪
  1. 添加 Sleuth 和 Zipkin 依赖

    <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>
    
  2. 配置 application.yml

    spring:zipkin:base-url: http://localhost:9411
    
  3. 启动 Zipkin 服务器

    docker run -d -p 9411:9411 openzipkin/zipkin
    
  4. 访问 Zipkin UI

    • 打开浏览器,访问 http://localhost:9411,查看服务链路追踪信息。

总结

通过以上步骤,您已经构建了一个简单的 Spring Cloud 微服务应用,包括配置中心、服务注册与发现、API 网关、断路器和服务链路追踪。希望这些内容对您有所帮助!


http://www.ppmy.cn/news/1546710.html

相关文章

【开源免费】基于SpringBoot+Vue.JS医疗病历交互系统(JAVA毕业设计)

博主说明&#xff1a;本文项目编号 T 072 &#xff0c;文末自助获取源码 \color{red}{T072&#xff0c;文末自助获取源码} T072&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

Java从入门到精通笔记篇(十二)

枚举类型与泛型 枚举类型可以取代以往常量的定义方式&#xff0c;即将常量封装在类或接口中 使用枚举类型设置常量 关键字为enum 枚举类型的常用方法 values()方法 枚举类型实例包含一个values()方法&#xff0c;该方法将枚举中所有的枚举值以数组的形式返回。 valueOf()可…

初始化mysql5.7

-- 环境变量 MYSQL_HOME %MYSQL_HOME%\bin -- 新增配置文件 my.ini [mysqld] port 3306 basedir D:/develop/MySQL/mysql-5.7.44-winx64 datadir D:/develop/MySQL/mysql-5.7.44-winx64/data max_connections 200character-set-serverutf8 default-storage-engineINNODB …

科研绘图系列:R语言差异分析双侧柱状图(grouped barplot)

文章目录 介绍加载R包数据画图系统信息介绍 双侧柱状图(grouped barplot),也称为分组柱状图,是一种用于展示不同组别之间比较的数据可视化图表。它通过将不同组别的柱状图并排放置,可以直观地比较不同组在各个类别上的表现或特征。以下是双侧柱状图的一些关键特点和用途:…

VBA高级应用30例应用3在Excel中的ListObject对象:插入行和列

《VBA高级应用30例》&#xff08;版权10178985&#xff09;&#xff0c;是我推出的第十套教程&#xff0c;教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开&#xff0c;这套教程案例与理论结合&#xff0c;紧贴“实战”&#xff0c;并做“战术总结”&#xff0c;以…

软考系统架构设计师论文:论多源数据集成及应用

试题二 论多源数据集成及应用 在如今信息爆炸的时代,企业、组织和个人面临着大量的数据。这些数据来自不同的渠道和资源,包括传感器、社交媒体、销售记录等,它们各自具有不同的数据格式、分布和存储方式。因此如何收集、整理和清洗数据,以建立一个一致、完整的数据集尤为重…

推荐一个Star超过2K的.Net轻量级的CMS开源项目

推荐一个具有模块化和可扩展的架构的CMS开源项目。 01 项目简介 Piranha CMS是一个轻量级且跨平台的CMS库&#xff0c;专为.NET 8设计。 该项目提供多种模板&#xff0c;具备CMS基本功能&#xff0c;也有空模板方便从头开始构建新网站&#xff0c;甚至可以作为移动应用的后端…

Oceanbase-Topk直方图

文章目录 计算公式&#xff1a;公式的含义&#xff1a;举例解释场景设定直方图记录情况结果分析 总结 计算公式&#xff1a; (1 - (1 / bucket_size)) * 100 这个计算公式&#xff0c;用来确定在 Topk 直方图中&#xff0c;哪些值会被认为是“重要值”&#xff0c;即超过特定的…