”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用 Spring Boot 和 Spring Cloud 开发微服务

使用 Spring Boot 和 Spring Cloud 开发微服务

发布于2024-11-06
浏览:598

Developing Microservices with Spring Boot and Spring Cloud

微服务架构已成为构建可扩展和模块化系统的流行解决方案。通过微服务,您可以将单一应用程序分解为更小的、独立的和专业的服务,这使得系统的维护和发展变得更加容易。在这篇文章中,我们将探讨如何使用 Spring Boot 和 Spring Cloud 创建健壮且高效的微服务。

微服务简介
微服务背后的主要思想是将应用程序拆分为可以独立开发、部署和扩展的小型服务。每个微服务应该负责特定的功能,并以轻量级的方式与其他服务进行通信,通常使用 REST API 或消息传递。

微服务的一些优点包括:

  • 独立扩展:每个服务都可以单独扩展。
  • 持续部署:您可以更新或修复微服务而不影响其他微服务。
  • 技术灵活性:每个服务可以使用不同的技术和框架来实现。 现在,让我们看看如何使用 Spring Boot 和 Spring Cloud 创建和管理微服务。

现在,让我们看看如何使用Spring BootSpring Cloud创建和管理微服务。

使用 Spring Boot 创建微服务

Spring Boot 专注于最少的配置和快速启动,因此可以轻松构建微服务。让我们首先创建两个微服务:“用户”服务(User-service)和“订单”服务(Order-service)。

  1. 设置 Spring Boot 项目

要设置微服务,您可以使用 Spring Initializr 生成具有所需依赖项的新项目,例如 Spring Web 和 Spring Data JPA。以下是用户服务中 REST 控制器的基本示例:

@RestController
@RequestMapping("/users")
public class UserController {

    @GetMapping("/{id}")
    public ResponseEntity getUserById(@PathVariable Long id) {
        User user = new User(id, "Matheus");
        return ResponseEntity.ok(user);
    }
}

每个微服务可以拥有自己的数据库,保证服务独立、解耦。对于用户服务,我们可以使用 H2 或 PostgreSQL 等配置。

  1. 公开 REST API 每个微服务都通过 REST API 公开其资源,允许其他服务或客户端使用其功能。下面是 Order-service 中使用用户服务 API 的端点示例:
@RestController
@RequestMapping("/orders")
public class OrderController {

    private final RestTemplate restTemplate;

    public OrderController(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    @GetMapping("/{id}")
    public ResponseEntity getOrderById(@PathVariable Long id) {
        User user = restTemplate.getForObject("http://user-service/users/"   id, User.class);
        Order order = new Order(id, user, "Order details");
        return ResponseEntity.ok(order);
    }
}

RestTemplate 用于在微服务之间发出 HTTP 请求。

使用 Spring Cloud 管理微服务
虽然 Spring Boot 有助于快速创建微服务,但 Spring Cloud 提供了额外的工具来管理分布式环境中这些服务的通信和弹性。让我们介绍一些基本组件。

  1. 尤里卡发现服务器 微服务的挑战之一是服务发现。 Eureka 是一个发现服务器,允许服务注册自身并发现其他服务,而无需固定 URL。
  • 将 spring-cloud-starter-netflix-eureka-server 依赖添加到 Eureka 服务器。
  • 在User-service和Order-service中配置application.yml文件,注册到Eureka服务器:
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

现在,服务将自动注册到Eureka,使它们更容易发现彼此。

  1. API 网关与 Spring Cloud Gateway 在微服务架构中,为所有服务提供单一入口点至关重要。 API 网关充当客户端和微服务之间的中介,有效地路由请求。

添加 spring-cloud-starter-gateway 依赖以创建简单网关:

spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://USER-SERVICE
          predicates:
            - Path=/users/**
        - id: order-service
          uri: lb://ORDER-SERVICE
          predicates:
            - Path=/orders/**

这样,任何对 /users/** 的请求都将被路由到用户服务,这同样适用于 /orders/**。

3.** 断路器的弹性 (Hystrix)**

在微服务环境中,失败是不可避免的。 Hystrix 是一个断路器,通过隔离故障来保护服务免受过载。以下是如何将其应用到使用其他服务的方法的示例:

@HystrixCommand(fallbackMethod = "fallbackGetUser")
public User getUser(Long id) {
    return restTemplate.getForObject("http://user-service/users/"   id, User.class);
}

public User fallbackGetUser(Long id) {
    return new User(id, "Default User");
}

如果用户服务失败,将调用fallbackGetUser方法,确保系统保持功能。

Spring Boot 与 Spring Cloud 相结合,为开发可扩展且有弹性的微服务提供了出色的基础设施。借助服务发现、路由和故障管理等功能,您的应用程序将为在分布式动态环境中运行做好充分准备。

无论您是从单体应用程序迁移到微服务还是从头开始,Spring Boot 和 Spring Cloud 都可以加速您的流程并确保坚实的架构。

您喜欢这篇文章吗?如果您有任何问题或建议,请在评论中留下!并且不要忘记与可以从这些技巧中受益的其他开发人员分享。

版本声明 本文转载于:https://dev.to/matheusmartinello/developing-microservices-with-spring-boot-and-spring-cloud-5feh?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • JavaScript 中的 require 与 import
    JavaScript 中的 require 与 import
    我记得当我开始编码时,我会看到一些js文件使用require()来导入模块和其他文件使用import。这总是让我感到困惑,因为我并不真正理解其中的区别是什么,或者为什么项目之间存在不一致。如果您想知道同样的事情,请继续阅读! 什么是 CommonJS? CommonJS 是一组用于在...
    编程 发布于2024-11-07
  • 使用镜像部署 Vite/React 应用程序:完整指南
    使用镜像部署 Vite/React 应用程序:完整指南
    在 GitHub Pages 上部署 Vite/React 应用程序是一个令人兴奋的里程碑,但这个过程有时会带来意想不到的挑战,特别是在处理图像和资产时。这篇博文将引导您完成整个过程,从最初的部署到解决常见问题并找到有效的解决方案。 无论您是初学者还是有经验的人,本指南都将帮助您避免常见的陷阱,并...
    编程 发布于2024-11-07
  • 我如何在我的 React 应用程序中优化 API 调用
    我如何在我的 React 应用程序中优化 API 调用
    作为 React 开发者,我们经常面临需要通过 API 同步多个快速状态变化的场景。对每一个微小的变化进行 API 调用可能效率低下,并且会给客户端和服务器带来负担。这就是去抖和巧妙的状态管理发挥作用的地方。在本文中,我们将构建一个自定义 React 钩子,通过合并有效负载和去抖 API 调用来捕获...
    编程 发布于2024-11-07
  • 我们走吧!
    我们走吧!
    为什么你需要尝试 GO Go 是一种快速、轻量级、静态类型的编译语言,非常适合构建高效、可靠的应用程序。它的简单性和简洁的语法使其易于学习和使用,特别是对于新手来说。 Go 的突出功能包括内置的 goroutine 并发性、强大的标准库以及用于代码格式化、测试和依赖管理的强大工具。...
    编程 发布于2024-11-06
  • 如何将 PNG 图像编码为 CSS 数据 URI 的 Base64?
    如何将 PNG 图像编码为 CSS 数据 URI 的 Base64?
    在 CSS 数据 URI 中对 PNG 图像使用 Base64 编码为了使用数据 URI 将 PNG 图像嵌入到 CSS 样式表中,PNG 数据必须首先编码为 Base64 格式。此技术允许将外部图像文件直接包含在样式表中。Unix 命令行解决方案:base64 -i /path/to/image....
    编程 发布于2024-11-06
  • API 每小时数据的响应式 JavaScript 轮播
    API 每小时数据的响应式 JavaScript 轮播
    I almost mistook an incomplete solution for a finished one and moved on to work on other parts of my weather app! While working on the carousel that w...
    编程 发布于2024-11-06
  • 用于 Web 开发的 PHP 和 JavaScript 之间的主要区别是什么?
    用于 Web 开发的 PHP 和 JavaScript 之间的主要区别是什么?
    PHP 与 JavaScript:服务器端与客户端 PHP 的作用与 JavaScript 不同。 PHP 运行在服务器端。服务器运行应用程序。除其他外,它还处理表单。当您提交表单时,PHP 会对其进行处理。另一方面,JavaScript 是客户端的。它在浏览器中运行。它处理页面交...
    编程 发布于2024-11-06
  • 如何在 C++ 中迭代结构和类成员以在运行时访问它们的名称和值?
    如何在 C++ 中迭代结构和类成员以在运行时访问它们的名称和值?
    迭代结构体和类成员在 C 中,可以迭代结构体或类的成员来检索它们的名称和价值观。以下是实现此目的的几种方法:使用宏REFLECTABLE 宏可用于定义允许自省的结构。该宏将结构体的成员定义为以逗号分隔的类型名称对列表。例如:struct A { REFLECTABLE ( ...
    编程 发布于2024-11-06
  • 如果需要准确答案,请避免浮动和双精度
    如果需要准确答案,请避免浮动和双精度
    float 和 double 问题: 专为科学和数学计算而设计,执行二进制浮点运算。 不适合货币计算或需要精确答案的情况。 无法准确表示10的负次方,例如0.1,从而导致错误。 示例1: 减去美元金额时计算错误: System.out.println(1.03 - 0.42); // Result...
    编程 发布于2024-11-06
  • 在 Go 中使用 WebSocket 进行实时通信
    在 Go 中使用 WebSocket 进行实时通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    编程 发布于2024-11-06
  • 如何在 Python 中使用代理运行 Selenium Webdriver?
    如何在 Python 中使用代理运行 Selenium Webdriver?
    使用 Python 中的代理运行 Selenium Webdriver当您尝试将 Selenium Webdriver 脚本导出为 Python 脚本并从命令行执行时,可能会遇到在使用代理的情况下出现错误。本文旨在解决此问题,提供一种使用代理有效运行脚本的解决方案。代理集成要使用代理运行 Selen...
    编程 发布于2024-11-06
  • || 什么时候运算符充当 JavaScript 中的默认运算符?
    || 什么时候运算符充当 JavaScript 中的默认运算符?
    理解 || 的目的JavaScript 中非布尔操作数的运算符在 JavaScript 中,||运算符通常称为逻辑 OR 运算符,通常用于计算布尔表达式。但是,您可能会遇到 || 的情况。运算符与非布尔值一起使用。在这种情况下,||运算符的行为类似于“默认”运算符。它不返回布尔值,而是根据某些规则返...
    编程 发布于2024-11-06
  • 探索 Java 23 的新特性
    探索 Java 23 的新特性
    亲爱的开发者、编程爱好者和学习者, Java 开发工具包 (JDK) 23 已正式发布(2024/09/17 正式发布),标志着 Java 编程语言发展的又一个重要里程碑。此最新更新引入了大量令人兴奋的功能和增强功能,旨在改善开发人员体验、性能和模块化。 在本文中,我将分享 JDK 23 的一些主要...
    编程 发布于2024-11-06
  • ES6 数组解构:为什么它没有按预期工作?
    ES6 数组解构:为什么它没有按预期工作?
    ES6 数组解构:不可预见的行为在 ES6 中,数组的解构赋值可能会导致意外的结果,让程序员感到困惑。下面的代码说明了一个这样的实例:let a, b, c [a, b] = ['A', 'B'] [b, c] = ['BB', 'C'] console.log(`a=${a} b=${b} c=$...
    编程 发布于2024-11-06
  • 如何调整图像大小以适合浏览器窗口而不变形?
    如何调整图像大小以适合浏览器窗口而不变形?
    调整图像大小以适应浏览器窗口而不失真调整图像大小以适应浏览器窗口是一项看似简单的解决方案的常见任务。然而,遵守特定要求(例如保留比例和避免裁剪)可能会带来挑战。没有滚动条和 Javascript 的解决方案(仅限 CSS)<html> <head> <style&g...
    编程 发布于2024-11-06

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3