Spring Cloud 微服务全面概述

news2024/10/28 1:23:53

Spring Cloud 微服务全面概述

1. 微服务架构概述

微服务架构(Microservices Architecture)是将应用程序拆分为多个小的、独立的服务,每个服务围绕特定的业务功能构建。这种架构使得应用程序能够更灵活地扩展和维护。

1.1 微服务的特点

  • 模块化:服务可以独立开发、测试、部署和扩展。
  • 异构技术:不同的服务可以使用不同的技术栈(编程语言、数据库等)。
  • 分布式:服务通常通过 HTTP REST、消息队列等网络协议通信。
  • 弹性:系统能在部分服务故障时保持可用。

1.2 微服务架构的优势

  • 可扩展性:可以根据需求独立扩展某些服务。
  • 开发效率:小团队可以并行开发不同的服务,加快交付速度。
  • 容错性:某个服务的失败不会导致整个系统崩溃。

2. Spring Cloud 介绍

Spring Cloud 是一套基于 Spring Boot 的开源工具,帮助开发者快速构建分布式系统。它提供了多个模块,支持服务发现、配置管理、负载均衡、断路器等功能。

2.1 Spring Cloud 的核心模块

  • Spring Cloud Netflix:提供了与 Netflix 生态系统集成的组件,如 Eureka、Ribbon、Hystrix、Zuul 等。
  • Spring Cloud Config:集中管理服务的配置。
  • Spring Cloud Gateway:API 网关,用于路由和负载均衡。
  • Spring Cloud Sleuth:提供分布式追踪功能。
  • Spring Cloud Bus:用于事件传播和配置更新。

3. Spring Cloud 核心知识点

3.1 服务注册与发现

Eureka 是一个服务注册与发现的组件。它允许微服务在启动时注册到 Eureka 服务器,并可以通过服务名查找其他服务。

3.1.1 Eureka 服务器的设置
  1. 添加依赖
    pom.xml 中添加 Eureka 服务器依赖:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka-server</artifactId>
    </dependency>
    
  2. 主类配置
    在应用主类上添加 @EnableEurekaServer 注解,启动 Eureka 服务器。

    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaServerApplication {
        public static void main(String[] args) {
            SpringApplication.run(EurekaServerApplication.class, args);
        }
    }
    
  3. 配置文件
    application.yml 中配置 Eureka 服务器:

    server:
      port: 8761
    eureka:
      client:
        register-with-eureka: false
        fetch-registry: false
    
  4. 启动 Eureka 服务器
    运行应用,访问 http://localhost:8761 查看 Eureka Dashboard。

3.1.2 Eureka 客户端的设置
  1. 添加依赖
    在微服务的 pom.xml 中添加:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka-client</artifactId>
    </dependency>
    
  2. 主类配置
    在微服务的主类上添加 @EnableEurekaClient 注解。

    @SpringBootApplication
    @EnableEurekaClient
    public class MyServiceApplication {
        public static void main(String[] args) {
            SpringApplication.run(MyServiceApplication.class, args);
        }
    }
    
  3. 配置文件
    application.yml 中配置 Eureka 客户端信息:

    spring:
      application:
        name: my-service
      cloud:
        discovery:
          client:
            serviceUrl:
              defaultZone: http://localhost:8761/eureka/
    
  4. 服务启动
    启动微服务,查看 Eureka Dashboard 可以看到注册的服务。

3.2 负载均衡

Ribbon 是一个客户端负载均衡器,支持服务的自动负载均衡。

3.2.1 Ribbon 的设置
  1. 添加依赖
    在微服务的 pom.xml 中添加:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-ribbon</artifactId>
    </dependency>
    
  2. 使用 Ribbon
    在微服务中,可以使用 RestTemplate 发起请求,并利用 Ribbon 进行负载均衡。

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
    
    @GetMapping("/call-service")
    public String callOtherService() {
        return restTemplate.getForObject("http://my-service/api", String.class);
    }
    

3.3 API 网关

Spring Cloud Gateway 提供了一种简单的方式来路由请求到后端服务,支持负载均衡和安全性。

3.3.1 Gateway 的设置
  1. 添加依赖
    pom.xml 中添加:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    
  2. 配置路由
    application.yml 中配置路由规则:

    spring:
      cloud:
        gateway:
          routes:
            - id: my-service-route
              uri: lb://my-service
              predicates:
                - Path=/my-service/**
    
  3. 访问网关
    启动网关服务后,通过网关访问后端服务,例如 http://localhost:8080/my-service/api

3.4 配置管理

Spring Cloud Config 提供了集中管理微服务配置的功能。

3.4.1 Config 服务器的设置
  1. 添加依赖
    在 Config 服务器的 pom.xml 中添加:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-config-server</artifactId>
    </dependency>
    
  2. 启用 Config 服务器
    在主类上添加 @EnableConfigServer 注解。

    @SpringBootApplication
    @EnableConfigServer
    public class ConfigServerApplication {
        public static void main(String[] args) {
            SpringApplication.run(ConfigServerApplication.class, args);
        }
    }
    
  3. 配置 Git 仓库
    application.yml 中配置 Git 仓库地址:

    spring:
      cloud:
        config:
          server:
            git:
              uri: https://github.com/your-repo/config-repo
    
  4. 客户端配置
    微服务客户端在 application.yml 中配置:

    spring:
      application:
        name: my-service
      cloud:
        config:
          uri: http://localhost:8888
    

3.5 断路器

Hystrix 是一个用于服务容错的库,通过断路器模式来保护服务。

3.5.1 Hystrix 的设置
  1. 添加依赖
    在微服务的 pom.xml 中添加:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-hystrix</artifactId>
    </dependency>
    
  2. 启用 Hystrix
    在主类上添加 @EnableCircuitBreaker 注解。

    @SpringBootApplication
    @EnableCircuitBreaker
    public class MyServiceApplication {
        public static void main(String[] args) {
            SpringApplication.run(MyServiceApplication.class, args);
        }
    }
    
  3. 使用 Hystrix 注解
    在需要保护的方法上使用 @HystrixCommand 注解:

    @HystrixCommand(fallbackMethod = "fallbackMethod")
    public String callExternalService() {
        // 可能会失败的外部调用
    }
    
    public String fallbackMethod() {
        return "服务暂时不可用,请稍后再试";
    }
    

好的,我们接着讲解 Spring Cloud Bus 的设置以及其他相关内容。

3.6 消息总线

Spring Cloud Bus 可以用于将配置更改、事件等信息广播到所有服务实例,从而实现服务间的事件传播和配置更新。

3.6.1 消息总线的设置
  1. 添加依赖
    在微服务的 pom.xml 中添加 RabbitMQ 或 Kafka 相关依赖。这里以 RabbitMQ 为例:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bus-amqp</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-rabbit</artifactId>
    </dependency>
    
  2. 配置 RabbitMQ
    application.yml 中配置 RabbitMQ 的连接信息:

    spring:
      rabbit:
        host: localhost
        port: 5672
        username: guest
        password: guest
    
  3. 发送事件
    在微服务中,使用 @RefreshScope 注解来自动刷新配置:

    @RefreshScope
    @RestController
    public class MyController {
        @Value("${my.property}")
        private String myProperty;
    
        @GetMapping("/property")
        public String getProperty() {
            return myProperty;
        }
    }
    

    当配置发生变化时,发送 POST 请求到 /bus/refresh 来通知所有服务更新配置:

    curl -X POST http://localhost:8888/bus/refresh
    

4. 实际案例

下面是一个简单的微服务案例,演示如何将前面的组件整合在一起。

4.1 项目结构
/microservices
    /eureka-server
    /config-server
    /gateway
    /service-a
    /service-b
4.2 Eureka 服务器

使用之前介绍的方法设置 Eureka 服务器。

4.3 Config 服务器

使用之前介绍的方法设置 Config 服务器,并在 Git 仓库中存放配置文件,如 application.yml

4.4 微服务 A 和 B
  1. 创建微服务 A

    @SpringBootApplication
    @EnableEurekaClient
    @EnableCircuitBreaker
    public class ServiceAApplication {
        public static void main(String[] args) {
            SpringApplication.run(ServiceAApplication.class, args);
        }
    
        @HystrixCommand(fallbackMethod = "fallbackMethod")
        public String callServiceB() {
            // 通过服务名调用服务 B
            return restTemplate.getForObject("http://service-b/endpoint", String.class);
        }
    
        public String fallbackMethod() {
            return "服务 B 暂时不可用";
        }
    }
    
  2. 创建微服务 B

    @SpringBootApplication
    @EnableEurekaClient
    public class ServiceBApplication {
        public static void main(String[] args) {
            SpringApplication.run(ServiceBApplication.class, args);
        }
    
        @GetMapping("/endpoint")
        public String endpoint() {
            return "Hello from Service B";
        }
    }
    
4.5 Gateway

配置 Gateway,以便路由请求到微服务 A 和 B。

spring:
  cloud:
    gateway:
      routes:
        - id: service-a
          uri: lb://service-a
          predicates:
            - Path=/service-a/**
        - id: service-b
          uri: lb://service-b
          predicates:
            - Path=/service-b/**

5. 总结

通过使用 Spring Cloud 的一系列组件,你可以快速构建一个健壮的微服务架构,具备服务发现、负载均衡、断路器、配置管理等特性。每个组件都能为你的微服务提供必要的功能,帮助你提高开发效率和系统的可靠性。

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

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

相关文章

在虚拟化环境中,虚拟机的资源分配是否真的能够完全等效于物理服务器?是否有某些特定的工作负载在虚拟化环境中始终无法达到理想表现?

目录 1. 虚拟化技术的基本原理与资源管理 2. 资源分配的等效性问题 3. 特定工作负载在虚拟化环境中的表现 4. 性能优化与虚拟化环境的选择 5. 结论 虚拟化技术的广泛应用为数据中心的资源管理与部署带来了革命性的变化。虚拟机&#xff08;VM&#xff09;通过抽象化的方式…

【了解一下静态代理与动态代理】

文章目录 一.什么是静态代理与动态代理二.静态代理三.动态代理1.jdk动态代理2.cglib动态代理 四.小结 一.什么是静态代理与动态代理 什么是代理&#xff1f;代理是一种设计模式&#xff0c;在这种模式中&#xff0c;一个类&#xff08;代理类&#xff09;代表另一个类&#xff…

【ArcGIS Pro实操第8期】绘制WRF三层嵌套区域

【ArcGIS Pro实操第8期】绘制WRF三层嵌套区域 数据准备ArcGIS Pro绘制WRF三层嵌套区域Map-绘制三层嵌套区域更改ArcMap地图的默认显示方向指定数据框范围 Map绘制研究区Layout-布局出图 参考 本博客基于ArcGIS Pro绘制WRF三层嵌套区域&#xff0c;具体实现图形参考下图&#xf…

cloak斗篷伪装下的独立站

随着互联网的不断进步&#xff0c;越来越多的跨境电商卖家开始认识到独立站的重要性&#xff0c;并纷纷建立自己的独立站点。对于那些有志于进入这一领域的卖家来说&#xff0c;独立站是什么呢&#xff1f;独立站是指个人或小型团队自行搭建和运营的网站。 独立站能够帮助跨境…

C++ 模板编程:解锁高效编程的神秘密码

快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 目录 &#x1f4af;前言 &#x1f4af;泛型编程 &#x1f4af;函数模板 1.函数模板概念 2.函数模板格式 3.函数模板的原理 4.函数模板的实例化 5.模板参…

如何使用DBeaver连接flink

通过DBeaver配置并连接flink&#xff1a; 1. 打开Dbeaver&#xff0c;选择“数据库”--》“数据库驱动管理器” 2.在驱动管理器界面点击新建按钮 3.在新建弹窗输入flink相关的驱动信息&#xff0c;主要包括&#xff1a; org.apache.flink.table.jdbc.FlinkDriver jdbc:flink…

Spring+ActiveMQ

1. 环境搭建 1.1 env-version JDK 1.8 Spring 2.7.13 Maven 3.6 ActiveMQ 5.15.2 1.2 docker-compose.yml version: 3.8services:activemq:image: rmohr/activemq:5.16.3container_name: activemqports:- "61616:61616"- "8161:8161"environment…

图解:什么是多租户?

大家好&#xff0c;我是汤师爷~ 什么是多租户&#xff1f; 多租户是SaaS&#xff08;软件即服务&#xff09;领域里特有的一个概念。在SaaS服务中&#xff0c;“租户”指的就是使用这个SaaS系统的客户。 那么租户和用户有什么区别呢&#xff1f;举个例子。假设你正在使用一款…

SQL实战训练之,力扣:1532最近的三笔订单

目录 一、力扣原题链接 二、题目描述 三、建表语句 四、题目分析 五、SQL解答 六、最终答案 七、验证 八、知识点 一、力扣原题链接 1532. 最近的三笔订单 二、题目描述 客户表&#xff1a;Customers ------------------------ | Column Name | Type | --------…

【C++单调栈 贡献法】907. 子数组的最小值之和|1975

本文涉及的基础知识点 C单调栈 LeetCode907. 子数组的最小值之和 给定一个整数数组 arr&#xff0c;找到 min(b) 的总和&#xff0c;其中 b 的范围为 arr 的每个&#xff08;连续&#xff09;子数组。 由于答案可能很大&#xff0c;因此 返回答案模 109 7 。 示例 1&#x…

ArcGIS计算多个面要素范围内栅格数据各数值的面积

本文介绍在ArcMap软件中&#xff0c;基于面积制表工具&#xff08;也就是Tabulate Area工具&#xff09;&#xff0c;基于1个面要素数据集与1个栅格数据&#xff0c;计算每一个面要素中各栅格数据分布面积的方法。 首先&#xff0c;来看一下本文的需求。现有一个矢量面的要素集…

动态规划 —— 斐波那契数列模型-解码方法

1. 解码方法 题目链接&#xff1a; 91. 解码方法 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/decode-ways/description/ 2. 题目解析 1. 对字母A - Z进行编码1-26 2. 11106可以解码为1-1-10-6或者11-10-6, 但是11-1-06不能解码 3. 0n不能解码 4. …

springboot项目测试环境构建出的依赖包比本地构建出的依赖包多

本地能够正常启动服务&#xff0c;但是测试环境启动报错。 上述druid是服务pom文件中之前引入的依赖包&#xff0c;后续由于某种原因而不需要该依赖包了&#xff0c;故已在pom文件中移除掉了该依赖包。 移除该依赖包之后&#xff0c;本地服务可正常构建和启动。 而测试环境却…

C语言 | Leetcode C语言题解之第504题七进制数

题目&#xff1a; 题解&#xff1a; char * convertToBase7(int num){if (num 0) {return "0";}bool negative num < 0;num abs(num);char * digits (char *)malloc(sizeof(char) * 32);int pos 0;while (num > 0) {digits[pos] num % 7 0;num / 7;}if…

cm211-1刷机教程镜像包

cm211-1刷机教程 包含镜像包酷看桌面 s905l3-l3b通用 镜像包&#xff1a;https://www.123684.com/s/WGAwjv-5tlv3 1.刷机教程 镜像为线刷镜像包&#xff0c;需要短接刷机 短接刷机&#xff0c;导入镜像包 开始即可。到100%就证明可以了。

四期书生大模型实战营(【入门岛】- 第4关 | 玩转HF/魔搭/魔乐社区)

文章目录 1. 任务介绍闯关任务 2. 平台介绍2.1. HF 平台2.1.1. HF的Transformers库介绍 2.2. GitHub CodeSpaces 和 Hugging Face Spaces 介绍。2.2.1. GitHub CodeSpaces2.2.2. Hugging Face Spaces2.2.3. 总结 3. 模型下载3.1. GitHub CodeSpaces使用3.1.下载internlm2_5-7b-…

MySQL任意版本安装卸载和数据库原理图绘制

MYSQL任意版本安装和卸载 安装&#xff1a; 1、解压文件 --- 不能出现中文路径 2、在解压目录&#xff08;安装目录&#xff09;下&#xff1a; 1>.创建data文件夹 2>.创建配置文件my.txt 然后修改成ini格式 3、修改配置文件 basedirD:\\mysql\\mysql-5.7.28-winx64…

006:看图软件ACDSeePhotoStudio2019安装教程

摘要&#xff1a;本文主要介绍看图软件ACDSee Photo Studio2019的安装流程。 一、软件概述 ACDSee Photo Studio是ACDSee公司开发的一款面向摄影师和图像编辑者的专业软件。它提供了全面的图像处理、管理和发布功能&#xff0c;帮助用户高效地浏览、编辑、分类和分享数字照片。…

新160个crackme - 084-slayer_crackme1

运行分析 点击check&#xff0c;提示注册失败 PE分析 ASM程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 ida搜索到关键字符串发现注册文件reg.key 通过动态调试&#xff0c;获得计算机名称为’CONCEALBEAR’通过计算得到int_2 接下来有一个剪贴板判断&#xff0…

从“摸黑”到“透视”:AORO A23热成像防爆手机如何改变工业检测?

在工业检测领域&#xff0c;传统的检测手段常因效率低下、精度不足和潜在的安全风险而受到诟病。随着科技的不断进步&#xff0c;一种新兴的检测技术——红外热成像技术&#xff0c;正逐渐在该领域崭露头角。近期&#xff0c;小编对一款集成红外热成像技术的AORO A23防爆手机进…