Spring Cloud 背后技术详解

Spring Cloud 是基于 Spring Boot 的一套微服务架构解决方案。它为开发者提供了一系列的工具,用于快速构建分布式系统中的一些常见模式(例如配置管理、服务发现、断路器等)。Spring Cloud 利用 Spring Boot 的自动配置和独立运行能力,使得构建微服务变得异常简单。在本博客中,我们将深入探讨 Spring Cloud 背后的关键技术,并通过实际代码示例来讲解其工作原理。

第一部分:Spring Cloud 微服务架构基础

1.1 微服务概述

微服务架构是一种设计方法,其中应用程序由一系列小型、独立的服务组成,这些服务共同组成一个整体的应用。每个服务都是围绕特定业务能力构建的,并且可以独立部署和扩展。微服务架构有助于加快开发周期,提高系统的可扩展性和可维护性。

1.2 Spring Cloud 的核心组件

Spring Cloud 提供了多个组件,以支持微服务架构的开发。这些组件包括:

  • Spring Cloud Config:用于集中管理应用程序配置的服务。
  • Spring Cloud Netflix Eureka:一个服务发现和注册服务器。
  • Spring Cloud Netflix Hystrix:一个断路器,用于处理服务调用时的延迟和容错。
  • Spring Cloud Netflix Zuul:一个路由服务器,用于为微服务架构中的服务提供统一的访问入口。
  • Spring Cloud Stream:一个用于构建消息驱动微服务的框架。
  • Spring Cloud Sleuth:用于在分布式系统中追踪服务调用链路的工具。

1.3 创建第一个 Spring Cloud 应用

下面,我们将通过一个简单的示例来展示如何创建一个 Spring Cloud 应用。

1.3.1 创建 Spring Boot 应用

首先,我们需要创建一个 Spring Boot 应用。这可以通过 Spring Initializr(https://start.spring.io/)来完成。选择 Maven 或 Gradle 作为构建工具,并添加 Spring Web 依赖。

1.3.2 添加 Spring Cloud 依赖

在创建好的 Spring Boot 应用中,我们需要添加 Spring Cloud 的依赖。例如,如果我们想要使用 Spring Cloud Config,我们可以在 pom.xml 文件中添加如下依赖:

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

1.3.3 配置 Spring Cloud 组件

接下来,我们需要在应用的配置文件中配置 Spring Cloud 组件。例如,如果我们使用 Spring Cloud Config,我们可以在 application.yml 文件中指定配置服务的地址:

spring:cloud:config:uri: http://localhost:8888

1.3.4 编写业务代码

最后,我们可以编写业务代码,利用 Spring Cloud 提供的组件来实现微服务架构中的功能。例如,我们可以创建一个 REST 控制器,用于获取配置信息:

@RestController
@RequestMapping("/config")
public class ConfigController {@Value("${config.example.property}")private String property;@GetMappingpublic String getProperty() {return property;}
}

在这个例子中,@Value("${config.example.property}") 注解用于从配置服务器获取属性值。

1.4 运行和测试 Spring Cloud 应用

完成上述步骤后,我们可以运行 Spring Boot 应用,并测试 Spring Cloud 组件的功能。例如,我们可以启动 Spring Cloud Config 服务器,然后运行我们的应用,并通过 REST 接口获取配置信息。

在后续部分,我们将深入探讨 Spring Cloud 的各个核心组件,并详细讲解它们的工作原理和最佳实践。通过这些内容的学习,你将能够更好地理解和使用 Spring Cloud 来构建分布式系统和微服务架构。

第二部分:Spring Cloud Config

Spring Cloud Config 是 Spring Cloud 的配置管理组件,它提供了服务器和客户端支持,用于集中管理应用程序的配置。这使得在不同环境中部署的应用程序可以使用相同的配置源,并且可以轻松地更新配置而无需重新部署应用程序。

2.1 Spring Cloud Config 服务器

Spring Cloud Config 服务器是一个可以存储后端存储库(如 Git、SVN)中配置文件的服务器。它支持配置文件的动态刷新,并且可以将配置属性加密和解密。

2.1.1 创建 Config 服务器

要创建一个 Config 服务器,首先需要在项目中添加 spring-cloud-config-server 依赖。

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId>
</dependency>

然后,在主应用程序类上添加 @EnableConfigServer 注解。

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

在 application.yml 或 application.properties 文件中,配置服务器的存储库信息。

spring:cloud:config:server:git:uri: https://github.com/yourusername/config-repo.git

2.1.2 访问配置属性

Config 服务器提供了多个端点,用于访问配置属性。例如,要获取 development 环境的 application 配置,可以使用以下 URL:

http://localhost:8888/application/development

2.2 Spring Cloud Config 客户端

Spring Cloud Config 客户端是用于从 Config 服务器获取配置的应用程序。要创建一个 Config 客户端,首先需要在项目中添加 spring-cloud-starter-config 依赖。

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

在 bootstrap.yml 或 bootstrap.properties 文件中,配置客户端以指向 Config 服务器的位置。

spring:cloud:config:uri: http://localhost:8888profile: developmentname: application

客户端应用程序可以使用 @Value 或 @ConfigurationProperties 注解来注入配置属性。

2.3 配置刷新

Spring Cloud Config 支持配置的动态刷新。要启用这个功能,需要在客户端应用程序中添加 spring-cloud-starter-bus-amqp 依赖,以连接到消息代理(如 RabbitMQ)。

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

然后,可以通过发送 POST 请求到 /actuator/refresh 端点来触发配置的刷新。

curl -X POST http://localhost:8080/actuator/refresh

第三部分:Spring Cloud Netflix Eureka

Spring Cloud Netflix Eureka 是一个服务发现和注册服务器。它提供了一个中心化的服务注册表,服务实例可以在启动时注册到 Eureka,并且可以通过 Eureka 来发现其他服务实例。

3.1 Eureka 服务器

Eureka 服务器是服务发现和注册的中心节点。要创建一个 Eureka 服务器,首先需要在项目中添加 spring-cloud-starter-netflix-eureka-server 依赖。

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

然后,在主应用程序类上添加 @EnableEurekaServer 注解。

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

在 application.yml 或 application.properties 文件中,配置 Eureka 服务器的相关属性。

eureka:client:registerWithEureka: falsefetchRegistry: falseserviceUrl:defaultZone: http://localhost:8761/eureka/

3.2 Eureka 客户端

Eureka 客户端是用于注册服务实例的应用程序。要创建一个 Eureka 客户端,首先需要在项目中添加 spring-cloud-starter-netflix-eureka-client 依赖。

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

在 application.yml 或 application.properties 文件中,配置客户端以连接到 Eureka 服务器。

eureka:client:serviceUrl:defaultZone: http://localhost:8761/eureka/

在应用程序启动时,Eureka 客户端会自动将服务实例注册到 Eureka 服务器。其他服务可以通过 Eureka 服务器来发现这个服务实例。

3.3 服务发现

在 Eureka 环境中,服务可以通过 Eureka 客户端来发现其他服务。Spring Cloud 提供了 DiscoveryClient 接口,用于从 Eureka 获取注册的服务实例信息。

@Autowired
private DiscoveryClient discoveryClient;public List<ServiceInstance> getServiceInstances(String serviceName) {return discoveryClient.getInstances(serviceName);
}

此外,Spring Cloud 还提供了 @LoadBalanced 注解,用于创建一个负载均衡的 RestTemplate 实例,这样就可以通过服务 ID 来调用服务,而无需知道服务的具体地址。

@Bean
@LoadBalanced
public RestTemplate restTemplate() {return new RestTemplate();
}

使用 RestTemplate 调用服务:

restTemplate.getForObject("http://SERVICE-NAME/path", String.class);

第四部分:Spring Cloud Netflix Hystrix

Spring Cloud Netflix Hystrix 是一个断路器,用于处理服务调用时的延迟和容错。它通过线程隔离、超时检测和断路器模式来防止级联故障,提高系统的整体稳定性。

4.1 Hystrix 断路器

要使用 Hystrix 断路器,首先需要在项目中添加 spring-cloud-starter-netflix-hystrix 依赖。

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

然后,在主应用程序类上添加 @EnableCircuitBreaker 或 @EnableHystrix 注解。

@SpringBootApplication
@EnableCircuitBreaker
public class HystrixApplication {public static void main(String[] args) {SpringApplication.run(HystrixApplication.class, args);}
}

4.2 Hystrix 命令

Hystrix 命令是用于封装对依赖服务的调用的对象。通过定义 Hystrix 命令,可以实现对服务调用的线程隔离、超时检测和断路器逻辑。

@HystrixCommand(fallbackMethod = "getDefaultValue")
public String getValueFromService() {// 服务调用逻辑
}public String getDefaultValue() {// 服务降级逻辑return "default";
}

在上述代码中,@HystrixCommand 注解用于指定服务调用方法和服务降级方法。当服务调用失败时,Hystrix 会自动调用服务降级方法。

4.3 Hystrix Dashboard

Hystrix Dashboard 是一个实时监控 Hystrix 断路器状态的工具。要使用 Hystrix Dashboard,首先需要在项目中添加 spring-cloud-starter-netflix-hystrix-dashboard 依赖。

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

然后,在主应用程序类上添加 @EnableHystrixDashboard 注解。

@SpringBootApplication
@EnableHystrixDashboard
public class HystrixDashboardApplication {public static void main(String[] args) {SpringApplication.run(HystrixDashboardApplication.class, args);}
}

启动应用后,访问 http://localhost:8080/hystrix,可以看到 Hystrix Dashboard 的界面。通过输入 Hystrix 监控端点的 URL,可以监控特定服务的 Hystrix 状态。

第五部分:Spring Cloud Netflix Zuul

Spring Cloud Netflix Zuul 是一个路由服务器,用于为微服务架构中的服务提供统一的访问入口。它支持动态路由、负载均衡、安全认证等功能。

5.1 Zuul 代理

要使用 Zuul 代理,首先需要在项目中添加 spring-cloud-starter-netflix-zuul 依赖。

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

然后,在主应用程序类上添加 @EnableZuulProxy 注解。

@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication {public static void main(String[] args) {SpringApplication.run(ZuulApplication.class, args);}
}

在 application.yml 或 application.properties 文件中,配置 Zuul 代理的相关属性。

zuul:routes:service-name:path: /service-name/**serviceId: service-name

在上面的配置中,service-name 是 Zuul 路由的名称,serviceId 是目标服务的服务 ID。

5.2 Zuul 过滤器

Zuul 支持自定义过滤器,用于在请求和响应的生命周期中插入逻辑。要创建一个 Zuul 过滤器,需要实现 ZuulFilter 接口。

@Component
public class MyZuulFilter implements ZuulFilter {@Overridepublic String filterType() {// 返回过滤器类型,例如 pre、post、errorreturn "pre";}@Overridepublic int filterOrder() {// 返回过滤器顺序return 1;}@Overridepublic boolean shouldFilter() {// 返回是否执行过滤器逻辑return true;}@Overridepublic Object run() {// 过滤器逻辑return null;}
}

在上述代码中,filterType 定义了过滤器的类型,filterOrder 定义了过滤器的执行顺序,shouldFilter 定义了是否执行过滤器逻辑,run 方法包含了过滤器的具体逻辑。

5.3 Zuul 安全

Zuul 支持多种安全认证机制,例如 OAuth2。要使用 OAuth2 认证,首先需要在项目中添加 spring-cloud-starter-security 依赖。

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

然后,在 application.yml 或 application.properties 文件中配置 OAuth2 客户端信息。

security:oauth2:client:client-id: your-client-idclient-secret: your-client-secretscope: read,writegrant-type: client_credentials

总结

Spring Cloud 是一套完整的微服务架构解决方案,它为开发者提供了一系列的工具和组件,用于快速构建分布式系统中的一些常见模式。通过本博客的探讨,我们了解了 Spring Cloud 的核心组件和它们的工作原理。

Spring Cloud Config 提供了集中管理应用程序配置的服务,Spring Cloud Eureka 提供了服务发现和注册的功能,Spring Cloud Hystrix 提供了断路器以处理服务调用时的延迟和容错,Spring Cloud Zuul 提供了路由服务器以统一访问微服务架构中的服务。

掌握 Spring Cloud 的这些组件和技术,可以帮助开发者构建稳定、可扩展的微服务架构。随着 Spring Cloud 生态系统的不断发展和完善,我们可以期待更多的创新和改进,进一步推动微服务架构的发展。对于希望在这个快速变化的技术领域中保持竞争力的开发者来说,深入理解和掌握 Spring Cloud 是一个不可或缺的技能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/11718.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言例题41、八进制转换为十进制

#include<stdio.h>void main() {int x;printf("请输入一个8进制整数&#xff1a;");scanf("%o", &x);printf("转换成十进制后的整数为%d\n", x); }运行结果&#xff1a; 本章C语言经典例题合集&#xff1a;http://t.csdnimg.cn/FK0Qg…

Java基础(33)Java Web拦截器作用和用法

Java Web拦截器&#xff08;Interceptor&#xff09;是Java Web开发中一个重要的概念&#xff0c;它允许开发者在处理HTTP请求和响应之前或之后执行特定的代码&#xff0c;从而实现如权限检查、日志记录、事务管理等功能。拦截器可以作用于Java EE的Servlet、Spring框架、Strut…

redis试题按知识点归类(四)

十六、实战应用 1.如何使用 Redis 存储用户会话&#xff1f; 2.Redis 在电子商务平台中的应用是什么&#xff1f; 3.如何使用 Redis 进行实时数据分析&#xff1f; 十七、面试题综合 1.描述一次你解决 Redis 性能问题的经历。 2.你如何理解 Redis 中的“单线程”模型&…

Java入门基础学习笔记21——Scanner

在程序中接收用户通过键盘输入的数据&#xff1a; 需求&#xff1a; 请在程序中&#xff0c;提示用户通过键盘输入自己的姓名、年龄、并能在程序中收到这些信息&#xff0c;怎么解决&#xff1f; Java已经写好了实现程序&#xff0c;我们调用即可。 API&#xff1a;Applicat…

2024 年中国大学生程序设计竞赛全国邀请赛(郑州)暨第六届CCPC河南省大学生程序设计竞赛 problem K. 树上问题

//先找一个美丽的树&#xff0c;然后遍历树找节点,分析是否符合条件。 //画几个图&#xff0c;思考下。 #include<bits/stdc.h> using namespace std; #define int long long const int n1e611; int a,b,c[n],d,l,r,k,w,an; vector<int>t[n]; void dfs(int x,int…

MLT剪辑sample

#include <framework/mlt.h> int main(int argc, char **argv) { // 初始化MLT mlt_factory factory mlt_factory_init(NULL); // 加载素材&#xff08;这里假设我们有一个名为"video.mp4"的视频文件&#xff09; mlt_profile profile mlt_prof…

什么是页分裂、页合并?

数据组织方式 在InnoDB存储引擎中&#xff0c;表数据都是根据主键顺序组织存放的&#xff0c;这种存储方式的表称为索引组织表(index organized table IOT)。 行数据&#xff0c;都是存储在聚集索引的叶子节点上的。而我们之前也讲解过InnoDB的逻辑结构图&#xff1a; 在I…

61、内蒙古工业大学、内蒙科学技术研究院:CBAM-CNN用于SSVEP - BCI的分类方法[脑机二区还是好发的]

前言&#xff1a; 之前写过一篇对CBAM模型改进的博客&#xff0c;在CBAM中引入了ECANet结构&#xff0c;对CBAM中的CAM、SAM模块逐一改进&#xff0c;并提出ECA-CBAM单链双链结构&#xff0c;我的这个小的想法已经被一些同学实现了&#xff0c;并进行了有效的验证&#xff0c;…

快速对比 找出2个名单不同之处

import pandas as pd# 读取两个Excel文件 df1 pd.read_excel(1.xlsx) df2 pd.read_excel(2.xlsx)# 检查两个DataFrame的列是否相同 if list(df1.columns) ! list(df2.columns):print("两个Excel文件的列不一致。")print("文件1的列&#xff1a;", df1.co…

AI智能体|手把手教你申请一个Kimi(Moonshot)的API KEY

大家好&#xff0c;我是无界生长。 今天分享一下如何申请一个Kimi(Moonshot)的API KEY&#xff0c;为后面Kimi(Moonshot)接入微信机器人做铺垫。学会了的话&#xff0c;欢迎分享转发&#xff01; 前提 拥有一个Kimi(Moonshot)账号 使用手机号注册即可&#xff0c;新用户可免费…

oracle如何设计生成token给程序使用

在Oracle中设计生成token&#xff08;令牌&#xff09;供程序使用通常涉及几个步骤&#xff0c;这些步骤可能因您的具体需求和使用的技术栈而有所不同。以下是一个基本的指南&#xff0c;描述了如何设计并生成token&#xff1a; 确定token的用途和属性&#xff1a; 确定token…

【线程创建】——三种方式➕多线程案例练习

02 线程创建 Thread , Runnable , Callable 三种创建方式 Thread class - 继承Thread类 (重点) Runnable接口 - 实现Runnable接口 (重点) Callable接口 - 实现Callable接口 (了解) Thread 类实现 它继承了老祖宗 Object java.lang.Object java.lang.Thread 它实现了 Runnab…

文本到语音的学习笔记:从Docker开始

1.docker 是什么意思&#xff1f; Docker 是一种开源的容器化平台&#xff0c;它允许开发者将应用及其依赖打包到一个轻量级、可移植的容器中&#xff0c;然后可以在任何支持Docker的系统上运行这个应用&#xff0c;而不必担心环境差异导致的问题。 以下是Docker的一些关键特…

原子操作std::atomic

std::atomic是 C11 标准库提供的一个模板类&#xff0c;用于实现原子操作。原子操作是指不会被线程调度机制打断的操作&#xff0c;即这种操作一旦开始&#xff0c;就一直运行到结束&#xff0c;中间不会有任何线程切换。在多线程编程中&#xff0c;原子操作对于确保数据的一致…

EasyExcel 导出,保留两位小数并显示 千分位

实体类 属性类型为 BigDecimal 注解 NumberFormat("#,###.00") 试过了不顶用&#xff0c;原因不太清楚 值为 0.81 这种&#xff0c;导出后变为 .81 所以&#xff0c;换个思路&#xff0c;写个转换器&#xff0c;就是麻烦点 转换器 BigDecimalConvert import cn.h…

【go项目01_学习记录11】

操作数据库 1 文章列表2 删除文章 1 文章列表 &#xff08;1&#xff09;先保证文章已经有多篇&#xff0c;可以直接在数据库中添加&#xff0c;或者访问链接: localhost:3000/articles/create&#xff0c;增加几篇文章。 &#xff08;2&#xff09;之前设置好了articles.ind…

【Web后端】监听器Listener

1、简介 用来监听Servlet组件对象状态发生变化的组件可以监听的源包括:ServetRequest、HttpSession、ServletContext当监听到事件源状态发生变化时&#xff0c;会有对应的响应行为 2、使用方法 在web.xml文件中配置 <listener> <listener-class>com.coder.util.…

【DevOps】详解 Linux 用户和权限管理:添加用户、分组及文件权限设置

目录 1. 用户管理 用户分类 用户相关文件 常用命令 2. 组管理 组相关文件 常用命令 3. 权限管理 文件权限 权限表示 修改权限 修改所有者和所属组 特殊权限 4. 示例 命令的详细解释 权限解释 示例&#xff1a;文件权限 -rw-r--r-- 的含义 在 Linux 中&#xf…

栈队列经典OJ题(详细过程)

1. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 第一题判断有效的括号&#xff0c;这道题我们会用到栈的知识&#xff0c;栈是后进先出的&#xff0c;可以根据这个来解这道题&#xff0c;先看一下题目和示例。 1.1整体思路 我们通过示例可以看出括号匹配就返回true&am…

【JAVA】BOSS系统发版艺术:构建高效、优雅的微服务部署策略

在现代软件开发领域&#xff0c;微服务架构与容器化部署已迅速成为行业新趋势。微服务架构通过将应用拆分成多个小型、自治的服务单元&#xff0c;每个服务承担某项特定的业务功能。而容器化部署则以其轻量级和高度可移植的特性&#xff0c;为这些微服务的有效打包、分发和运行…