Spring Cloud:微服务架构的基石

目录

  1. 微服务架构简介

  2. Spring Cloud 简介

  3. Spring Cloud 组件详解

    • Eureka 服务注册与发现

    • Ribbon 负载均衡

    • Feign 声明式 HTTP 客户端

    • Hystrix 服务容错保护

    • Zuul 网关

    • Config 配置管理

    • Sleuth 链路追踪

    • Spring Cloud Stream 消息驱动

  4. Spring Cloud 与 Docker 的结合

  5. 总结

一、微服务架构简介

1. 什么是微服务

微服务是一种架构模式,它将单个应用程序划分为一组小的、独立的服务,每个服务运行在其自己的进程中,并通过轻量级的通讯机制(通常是 HTTP API)相互交互。每个服务围绕特定的业务能力构建,并且可以通过自动化的部署机制独立地部署。

2. 微服务架构的优势

  • 解耦:每个服务都是独立的模块,降低了模块之间的耦合度。

  • 独立部署:各个服务可以独立部署,更新某个服务无需重新部署整个系统。

  • 容错:某个服务的故障不会影响到整体系统。

  • 灵活性:可以根据需要对某些服务进行独立扩展,提升资源利用效率。

3. 微服务架构的挑战

  • 运维复杂度:更多的服务意味着更多的部署单元,运维复杂度增加。

  • 分布式系统的复杂性:涉及分布式事务、数据一致性等问题。

  • 服务间通信:需要处理服务发现、负载均衡等通信问题。

二、Spring Cloud 简介

Spring Cloud 是一系列框架的集合,旨在解决微服务架构中的各种常见问题。它建立在 Spring Boot 之上,提供了包括服务发现、负载均衡、断路器、网关、配置管理等功能,简化了微服务架构的开发和运维。

Spring Cloud 主要由以下几个组件构成:

  • Spring Cloud Netflix

  • Spring Cloud Config

  • Spring Cloud Sleuth

  • Spring Cloud Gateway

  • Spring Cloud Stream

接下来,我们将详细介绍这些组件及其应用。

三、Spring Cloud 组件详解

1. Eureka 服务注册与发现

1.1 概述

Eureka 是 Netflix 开源的一个服务注册与发现组件。在微服务架构中,服务实例通常是动态变化的,Eureka 能够自动发现和注册服务实例,并通过心跳机制保证服务的可用性。

1.2 核心概念
  • Eureka Server:服务注册中心,负责维护服务实例的注册信息。

  • Eureka Client:服务提供者,负责将自己的服务注册到 Eureka Server 上。

  • Eureka Discovery Client:服务消费者,通过 Eureka Server 获取服务实例的信息。

1.3 使用指南
1.3.1 搭建 Eureka Server

在一个 Spring Boot 项目中引入 spring-cloud-starter-netflix-eureka-server 依赖:


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

在主应用类上添加 @EnableEurekaServer 注解:


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

application.yml 中配置 Eureka Server:


server:port: 8761eureka:client:register-with-eureka: falsefetch-registry: falseserver:wait-time-in-ms-when-sync-empty: 0
1.3.2 Eureka Client 配置

在另一个 Spring Boot 项目中引入 spring-cloud-starter-netflix-eureka-client 依赖:


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

在主应用类上添加 @EnableEurekaClient 注解:


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

application.yml 中配置 Eureka Client:


server:port: 8080eureka:client:service-url:defaultZone: http://localhost:8761/eureka/
1.3.3 服务发现示例

在服务消费者中,通过 Eureka Discovery Client 获取服务实例列表:


@RestControllerpublic class DiscoveryController {@Autowiredprivate DiscoveryClient discoveryClient;@RequestMapping("/services")public List<String> services() {return discoveryClient.getServices();}}

2. Ribbon 负载均衡

2.1 概述

Ribbon 是 Netflix 开源的一个客户端负载均衡器,能够自动从 Eureka Server 获取服务实例的信息,并提供多种负载均衡策略。

2.2 使用指南

在 Spring Boot 项目中引入 spring-cloud-starter-netflix-ribbon 依赖:


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

在服务消费者中配置 Ribbon:


# 配置 ribbon 的服务名称service-ribbon:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

通过 @LoadBalanced 注解启用 Ribbon 的负载均衡功能:


@Configurationpublic class RibbonConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}}

使用 RestTemplate 调用服务:


@RestControllerpublic class RibbonController {@Autowiredprivate RestTemplate restTemplate;@RequestMapping("/ribbon")public String ribbon() {return restTemplate.getForObject("http://SERVICE-NAME/path", String.class);}}

3. Feign 声明式 HTTP 客户端

3.1 概述

Feign 是一个声明式的 HTTP 客户端,与 Ribbon 结合可以实现负载均衡调用。通过 Feign,可以更为优雅地操作 HTTP 请求,无需手动编写大量的模板代码。

3.2 使用指南

在 Spring Boot 项目中引入 spring-cloud-starter-openfeign 依赖:


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

在主应用类上添加 @EnableFeignClients 注解:


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

定义 Feign 客户端接口:


@FeignClient(name = "service-name")public interface ServiceClient {@RequestMapping(value = "/path", method = RequestMethod.GET)String getPath();}

使用 Feign 调用服务:


@RestControllerpublic class FeignController {@Autowiredprivate ServiceClient serviceClient;@RequestMapping("/feign")public String feign() {return serviceClient.getPath();}}

4. Hystrix 服务容错保护

4.1 概述

Hystrix 是 Netflix 开源的一个延迟和容错库,能够实现服务的熔断与降级,防止系统因某个服务的过载而崩溃。

4.2 使用指南

在 Spring Boot 项目中引入 spring-cloud-starter-netflix-hystrix 依赖:


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

在主应用类上添加 @EnableHystrix 注解:


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

在服务中使用 @HystrixCommand 注解实现熔断与降级:


@RestControllerpublic class HystrixController {@Autowiredprivate RestTemplate restTemplate;@HystrixCommand(fallbackMethod = "fallback")@RequestMapping("/hystrix")public String hystrix() {return restTemplate.getForObject("http://SERVICE-NAME/path", String.class);}public String fallback() {return "Fallback response";}}

在 Feign 客户端中启用 Hystrix:


feign:hystrix:enabled: true

定义 fallback 类:


@Componentpublic class ServiceClientFallback implements ServiceClient {@Overridepublic String getPath() {return "Fallback response";}}

在 Feign 客户端接口中配置 fallback:


@FeignClient(name = "service-name", fallback = ServiceClientFallback.class)public interface ServiceClient {@RequestMapping(value = "/path", method = RequestMethod.GET)String getPath();}

5. Zuul 网关

5.1 概述

Zuul 是 Netflix 开源的一款 API 网关,提供动态路由、监控、弹性、验证、安全等功能,是构建微服务架构中不可或缺的组件。

5.2 使用指南

在 Spring Boot 项目中引入 spring-cloud-starter-netflix-zuul 依赖:


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

在主应用类上添加 @EnableZuulProxy 注解:


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

application.yml 中配置 Zuul 路由:


zuul:routes:service-name:path: /api/**serviceId: service-namestripPrefix: false

6. Config 配置管理

6.1 概述

Spring Cloud Config 提供配置管理服务,支持将配置信息存储在 Git、SVN 等版本控制系统中,并提供配置更新、版本控制等功能。

6.2 使用指南
6.2.1 搭建 Config Server

在 Spring Boot 项目中引入 spring-cloud-config-server 依赖:


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

在主应用类上添加 @EnableConfigServer 注解:


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

application.yml 中配置 Git 仓库地址:


server:port: 8888spring:cloud:config:server:git:uri: https://github.com/your-repo/config-repo
6.2.2 Config Client 配置

在客户端项目中引入 spring-cloud-starter-config 依赖:


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

bootstrap.yml 中配置 Config Server 地址:


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

在服务中读取配置:


@RestControllerpublic class ConfigController {@Value("${config.property}")private String configProperty;@RequestMapping("/config")public String config() {return configProperty;}}

7. Spring Cloud Sleuth 链路追踪

7.1 概述

Spring Cloud Sleuth 提供分布式系统的调用链追踪功能,可以跟踪请求的调用路径,帮助分析性能瓶颈和故障点。

7.2 使用指南

在 Spring Boot 项目中引入 spring-cloud-starter-sleuth 依赖:


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

在服务中添加日志打印:


@RestControllerpublic class SleuthController {private static Logger log = LoggerFactory.getLogger(SleuthController.class);@RequestMapping("/sleuth")public String sleuth() {log.info("Handling sleuth request");return "Sleuth response";}}

通过查看日志,可以看到 Sleuth 自动添加的 traceId 和 spanId 信息。

8. Spring Cloud Stream 消息驱动

8.1 概述

Spring Cloud Stream 是一个构建消息驱动微服务的框架,支持多种消息中间件,如 Kafka、RabbitMQ 等,通过绑定器(Binder)抽象,实现消息的生产和消费。

8.2 使用指南

在 Spring Boot 项目中引入 spring-cloud-starter-stream-rabbit 依赖:


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

配置消息通道:


spring:cloud:stream:bindings:output:destination: my-topicinput:destination: my-topic

定义消息通道接口:


public interface MessageChannels {String OUTPUT = "output";String INPUT = "input";@Output(OUTPUT)MessageChannel output();@Input(INPUT)SubscribableChannel input();}

使用消息通道发送和接收消息:


@EnableBinding(MessageChannels.class)public class StreamService {@Autowiredprivate MessageChannels messageChannels;public void sendMessage(String message) {messageChannels.output().send(MessageBuilder.withPayload(message).build());}@StreamListener(MessageChannels.INPUT)public void handleMessage(String message) {System.out.println("Received message: " + message);}}

四、Spring Cloud 与 Docker 的结合

Spring Cloud 与 Docker 的结合使用可以进一步提升微服务架构的灵活性和可维护性。通过 Docker,可以将微服务打包成独立的容器,方便部署和管理。

1. 创建 Dockerfile

在每个 Spring Boot 项目中创建 Dockerfile


FROM openjdk:8-jdk-alpineVOLUME /tmpCOPY target/*.jar app.jarENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

2. 构建 Docker 镜像

在项目根目录下执行以下命令构建 Docker 镜像:


mvn clean packagedocker build -t my-service .

3. 运行 Docker 容器

使用以下命令运行构建的 Docker 容器:


docker run -d -p 8080:8080 my-service

五、总结

Spring Cloud 提供了一整套解决方案,帮助开发者在构建微服务架构时应对各种复杂问题。从服务注册与发现、负载均衡、断路器到配置管理、链路追踪等,Spring Cloud 覆盖了微服务架构中常见的各类问题,并通过与 Spring Boot 的无缝集成,极大地简化了微服务系统的开发和运维流程。

在实际应用中,Spring Cloud 与 Docker 的结合使用,可以进一步提升微服务系统的灵活性和可维护性。通过本文的介绍,希望读者能够对 Spring Cloud 有一个全面的认识,并能够在实际项目中灵活应用这些组件,构建高效、可靠的微服务系统。

参考文献

  • Spring Cloud 官方文档

  • Netflix OSS

  • Spring Boot 官方文档

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

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

相关文章

LeetCode583:两个字符串的删除操作

题目描述 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 代码 解法1 /*dp[i][j]&#xff1a;以i-1为结尾的wrod1中有以j-1为尾的word2的个数为了让word1和word2相同&#xff0c;最少操作…

linux开发之设备树基本语法一

设备树的根节点 设备树子节点和子子节点,子节点在根节点范围内 包含子节点以及子子节点 节点名称 比如这里led就是这个gpio的小名,可以直接用 gpio22020101是这里的名字,也就是要用这个gpio,符号后面的一串数字使用了这个gpio的寄存器地址,因为可能会用很多gpio,所以加入寄存…

Linux完整版命令大全(二十二)

uux 功能说明&#xff1a;在远端的UUCP主机上执行指令。语  法&#xff1a;uux [-bcCIjlnrvz][-a<地址>][-g<等级>][-s<文件>][-x<层级>][--help][指令]补充说明&#xff1a;uux可在远端的UUCP主机上执行指令或是执行本机上的指令&#xff0c;但在执…

Pushmall共享分销电商SaaS版2024年 5月模块开发优化完成

Pushmall共享分销电商 2024年 5月模块开发优化完成 1、**实现SaaS框架业务&#xff1a;**多租户、多商家、多门店&#xff0c;及商家入驻、商品管理。 2、租户小程序管理&#xff1a;对租户的小程序业务管理。 3、店铺小程序管理&#xff1a;对租户多店铺小程序绑定。 4、会员分…

新火种AI|警钟长鸣!教唆自杀,威胁人类,破坏生态,AI的“反攻”值得深思...

作者&#xff1a;小岩 编辑&#xff1a;彩云 在昨天的文章中&#xff0c;我们提到了谷歌的AI Overview竟然教唆情绪低迷的网友“从金门大桥跳下去”。很多人觉得&#xff0c;这只是AI 模型的一次错误判断&#xff0c;不会有人真的会因此而照做。但现实就是比小说电影中的桥段…

精酿啤酒:品质与口感对啤酒市场价格的影响

啤酒作为一种大众化的产品&#xff0c;其品质与口感对市场价格有着显著的影响。对于Fendi club啤酒而言&#xff0c;其卓着的品质和与众不同的口感又加上市场价格相对实惠&#xff0c;受到消费者的青睐。 品质是决定啤酒市场价格的重要因素。Fendi club啤酒选用天然小麦原料&am…

【leetcode2765--最长交替子数组】

要求&#xff1a;给定一个数组&#xff0c;找出符合【x, x1,x,x-1】这样循环的最大交替数组长度。 思路&#xff1a;用两层while循环&#xff0c;第一个while用来找到符合这个循环的开头位置&#xff0c;第二个用来找到该循环的结束位置&#xff0c;并比较一下max进行记录。 …

太速科技-16通道24bit 256kHZ 的振动信号千兆网络采集器

16通道24bit 256kHZ 的振动信号千兆网络采集器 一、产品概述 数据采集器是一台运行Linux操作系统的智能终端&#xff0c;在以太网络的支持下&#xff0c;可迅速构建起大规模的分布式智能数据采集系统。采集器终端体积小&#xff0c;功耗低&#xff0c;易集成&#xff0c…

ubuntu linux (20.04) 源码编译cryptopp库 - apt版本过旧

下载最新版 https://www.cryptopp.com/#download 编译安装&#xff1a; ​#下载Cryptopp源码 #git clone https://gitee.com/PaddleGitee/cryptopp.git#进入文件夹 cd cryptopp #编译&#xff0c;多cpu处理 make -j8 #安装&#xff0c;默认路径&#xff1a;/usr/local sudo m…

Apache Impala 4.4.0正式发布了!

历时半年多&#xff0c;Impala 4.4终于发布了&#xff01;本次更新带来了不少新功能&#xff0c;受限于篇幅&#xff0c;这里简要列举一些&#xff0c;后续文章再挑重点的进行介绍。 支持更多Iceberg表上的语句 支持对 Iceberg V2 表的 UPDATE 语句&#xff0c;用来更新已有数…

解析新加坡裸机云多IP服务器网线路综合测评解析

在数字化高速发展的今天&#xff0c;新加坡裸机云多IP服务器以其卓越的性能和稳定性&#xff0c;成为了众多企业和个人用户的首选。源库主机评测将对新加坡裸机云多IP服务器的网线路进行综合测评&#xff0c;以帮助读者更深入地了解这一产品的优势。 一、性能表现 新加坡裸机云…

代码随想录算法训练营第四十三天 动态规划 part05● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

1049. 最后一块石头的重量 II 题目链接&#xff1a; . - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;主要是要找到两个近似相等的子集和&#xff0c;去求这两个和的最小值; 之后就是和从子集中找相对应和的思路是一样的了 注意点&#xff1a;1&#xff09;dp 初始…

【RocketMQ】安装RocketMQ5.2.0(单机版)

下载 官网下载地址&#xff1a;下载 | RocketMQ github地址&#xff1a;Tags apache/rocketmq GitHub 选择对应的版本下载。https://dist.apache.org/repos/dist/release/rocketmq/5.2.0/rocketmq-all-5.2.0-bin-release.zip 5.2.0的二进制包&#xff1a;下载地址 5.2.0的…

设计模式:装饰模式(Decorator)

设计模式&#xff1a;装饰模式&#xff08;Decorator&#xff09; 设计模式&#xff1a;装饰模式&#xff08;Decorator&#xff09;模式动机模式定义模式结构时序图模式实现在单线程环境下的测试在多线程环境下的测试模式分析优缺点适用场景应用场景应用实例模式扩展参考 设计…

Git多人协作场景的使用

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

Firefox浏览器网页上的按钮点击无效解决办法

我在github下点下载经常不好使&#xff0c;查了原因&#xff0c;原来是浏览器的问题。在Firefox浏览器的设置里面&#xff0c;去掉一些cookies的禁用即可。之后&#xff0c;就可以点击按钮成功响应了。

2024 全新 Javascript 面试题目基础篇

1. JavaScript 是单线程的吗&#xff1f; 没错&#xff0c;JavaScript 是 一种 单线程语言。这意味着它只有 一个调用栈和一个内存堆。每次只执行一组指令。 此外&#xff0c;JavaScript 是同步和阻塞 的性质。这意味着代码是逐行执行的&#xff0c;一个任务必须在下一个任务…

JVM的相关知识

目录 JVM内存划分 类加载过程 类加载中的“双亲委派模型” JVM内存划分 JVM也就是java进程。这个进程一旦跑起来之后&#xff0c;就会从操作系统里&#xff0c;申请一大块内存空间。JVM接下来就要进一步的对这个大的空间进行划分。划分成不同区域&#xff0c;从而每个区域都…

如何实时掌握手机号状态的API利器分析

在移动互联网的时代&#xff0c;手机号码不仅是通信的连接点&#xff0c;也是用户身份的关键识别。手机状态查询API 通过提供实时的手机号码状态查询服务&#xff0c;协助企业和组织更有效地管理用户信息&#xff0c;提升服务流程。 手机状态查询API 通过与电信运营商的数据库进…

Golang | Leetcode Golang题解之第117题填充每个节点的下一个右侧节点指针II

题目&#xff1a; 题解&#xff1a; func connect(root *Node) *Node {start : rootfor start ! nil {var nextStart, last *Nodehandle : func(cur *Node) {if cur nil {return}if nextStart nil {nextStart cur}if last ! nil {last.Next cur}last cur}for p : start; …