Eureka Server 集群部署教程

在本教程中,你将学习到如何在本地计算机上设置 Eureka Cluster(集群)。虽然本文是在本地计算机上设置的 Eureka Cluster,但你仍然可以学到如何让 Eureka 在远程服务器上运行。 什么是 Eureka 服务器集群? Eureka 服务器集群又称 Eureka 节点感知(Peer Awareness)系统,是一组相互通信的 Eureka 服务器。不过,这不是普通的服务器群。它们可以相互通信,共享注册服务的相关信息。这意味着即使其中一台服务器宕机,其他服务器仍能提供必要的服务信息,确保高可用性和容错性。这是一项关键功能,使 Eureka 服务器集群成为大型系统的绝佳选择,在这种系统中,宕机的代价可能很高。 现在,你可能会问,为什么我们需要这样的设置。好吧,把它想象成一个图书管理员团队,他们总是相互通报庞大图书馆中书籍的最新情况。如果其中一个人不在,其他人仍然可以为你找到你要的书提供指导。同样,Eureka 服务器集群可确保你的微服务始终能找到彼此,即使在服务器出现故障的情况下也是如此。正是它们的团队合作使你的微服务架构变得稳健而富有弹性。 在接下来的章节中,我将指导你建立自己的 Eureka 服务器集群。 创建 Eureka Server 项目 我们首先要做的是创建一个新的 Spring Boot 项目。为此,我们将使用 Spring Initializr 来快速创建我们的项目。创建项目时,我们需要确保添加一个名为 Eureka Server 的重要依赖项。该依赖将把我们的普通 Spring Boot 项目转变为 Eureka Server。如果你现在还不清楚如何操作,也不用担心。我们将在下一步了解详情。 必须的 Maven 依赖 如果使用 Spring Initializr 工具创建了项目,并添加了 Eureka Server 依赖,则应在项目的 pom.xml 文件中看到以下依赖。 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> 在我的案例中,完整的 pom.xml 文件是这样的: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.

Spring Data JPA 中的分页和排序

1、概览 当我们数据库中的记录数量较多的时候,一般不会一次性检索出所有记录,通常会通过分页的方式展现。 此外,我们还经常需要在分页时根据某些条件对数据进行排序。 在本教程中,我们将学习如何使用 Spring Data JPA 轻松实现分页和排序。 2、创建实体 首先,假设我们有一个 Product 实体作为 domain 类: @Entity public class Product { @Id private long id; private String name; private double price; // 构造函数, getter 和 setter } 我们的每个 Product 实例都有一个唯一的标识符: id、name 和 price。 3、创建 Repository 要访问我们的 Product,我们需要一个 ProductRepository: public interface ProductRepository extends PagingAndSortingRepository<Product, Integer> { List<Product> findAllByPrice(double price, Pageable pageable); } 通过让它继承 PagingAndSortingRepository,我们可以使用,用于分页和排序的 findAll(Pageable pageable) 和 findAll(Sort sort) 方法。 相反,我们也可以选择继承 JpaRepository,因为它也继承了 PagingAndSortingRepository。

Spring Boot 3 中对 Docker Compose 的支持

1、概览 Spring Boot 3 具有一些新功能,比如将我们的应用程序构建为 GraalVM Native Image(原生镜像)。另一个相关支持是 Docker Compose。 在本教程中,我们将了解如何将 Docker Compose 工作流与 Spring Boot 3 整合。 2、Spring Boot 3 的 Docker Compose Support 提供了什么? 通常,我们会根据 docker-compose.yml 运行 docker-compose up 来启动和 docker-compose down 来停止我们的容器。现在,我们可以将这些 Docker Compose 命令委托给 Spring Boot 3。当 Spring Boot 应用程序启动或停止时,它也会管理我们的容器。 此外,它还内置了对多种服务的管理,如 SQL 数据库、MongoDB、Cassandra 等。因此,我们可能不需要在 application 资源文件中重复配置 class 或 properties。 最后,我们会看到如何在该支持中使用自定义 Docker 镜像和 Docker Compose profiles 。 3,设定 我们需要 Docker Compose 和 Spring Boot 3 来探索这种新的支持。 3.1、Docker Compose Docker Compose 需要已安装的 Docker 引擎。它们很容易安装,不过根据操作系统的不同可能会有差异。

在 Spring Boot 3 中使用 Java Record

Record 在 Java 14 中作为预览功能引入,并在 JDK 16 中成为标准功能。Record 是不可变数据类(data class)的简洁表示。 在使用 Record 之前,我们通常是这样创建不可变 class 的。 import java.util.Objects; class Person { private final Long id; private final String name; public Person(Long id, String name) { this.id = id; this.name = name; } public Long getId() { return this.id; } public String getName() { return this.name; } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() !

Java IllegalStateException: “getInputStream() has already been called for this request”

1、介绍 有时,当我们在 Java Web 应用程序中调用 ServletRequest 接口的 getReader() / getInputStream()方法时,可能会出现IllegalStateException 异常,异常信息为:“getInputStream() has already been called for this request”。 在本教程中,我们将了解出现这种异常的原因和解决方法。 2、问题与原因 Java Servlet 规范,用于用 Java 构建 Web 应用程序。它定义了 ServletRequest / HttpServletRequest 接口,以及 getReader() 和 getInputStream() 方法,用于从 HTTP 请求中读取数据。 getReader() 方法以字符数据形式返回请求体,而 getInputStream() 方法则以二进制数据形式返回请求体。 getReader() 和 getInputStream() 的 Servlet API 文档强调,它们不能同时使用: public java.io.BufferedReader getReader() Either this method or getInputStream may be called to read the body, not both. ... Throws: java.lang.IllegalStateException - if getInputStream() method has been called on this request public ServletInputStream getInputStream() Either this method or getReader may be called to read the body, not both.

Spring Bean Scope 指南

在本教程中,将带你学习 Spring Framework 的重要组成部分 Spring Bean Scope(作用域)。你将了解它们是什么、如何工作以及何时使用。最后,你将对 Spring Bean Scope 有一个清晰的了解,从而帮助你构建更好的 Spring 应用程序。 Spring Bean 介绍 在 Spring Framework 的世界里,“Spring Bean” 是一个非常重要的术语。从本质上讲,Spring Bean 是由 Spring IoC(反转控制)容器实例化、组装和管理的对象。这些 Bean 是根据你提供给容器的配置元数据创建的,例如,以 XML 定义或源代码注解的形式。 Bean 可以看作是任何 Spring 应用程序的基本构件。它们是构成应用程序主干的对象,由 Spring IoC 容器管理。这些 Bean 是根据项目中提供的定义创建的,用于履行应用程序中的各种角色,如 service 类、数据访问对象 (DAO)、Spring MVC Controller 等对象,甚至是简单对象。 Spring Bean Scope 是什么 Spring Bean Scope(或换句话说,Bean 的作用域)决定了这些 Bean 在应用程序各种上下文中的生命周期和可见性。 Spring Bean 的 scope 定义了 Bean 存在的边界、与之绑定的上下文以及存活时间。简而言之,它定义了何时创建 Bean 的新实例,以及何时删除该特定实例。 Spring 提供多种 scope,例如: Singleton Prototype Request Session Application Websocket 每个 scope 都意味着不同的生命周期和它们定义的 Bean 的可见性。正确理解和使用这些 scope 对于构建稳健高效的 Spring 应用程序至关重要。

Spring 6.1的新特性:RestClient

Spring Framework 6.1 M2 引入了 RestClient,一个新的同步HTTP客户端。顾名思义,RestClient 提供了 WebClient 的 fluent API和 RestTemplate 的基础架构。 14年前,当 RestTemplate 在 Spring Framework 3.0 中被引入时,我们很快发现在一个类似模板的类中暴露 HTTP 的所有功能会导致过多的重载方法。因此,在 Spring Framework 5 中,我们为响应式的 WebClient 使用了 fluent API。通过 RestClient,我们引入了一个 HTTP 客户端,它提供了类似于 WebClient 的API,并使用了 message converter、request factory、拦截器以及 RestTemplate 的其他底层组件。 创建 RestClient 你可以使用静态的create方法创建一个RestClient。你也可以使用RestClient::builder来获得一个具有更多选项的 builder,比如指定要使用的HTTP客户端,设置默认的URL、path 变量和 header,或者注册拦截器和初始化器(initializer)。 使用 RestClient::create(RestTemplate),你可以使用现有 RestTemplate 的配置初始化 RestClient。 Retrieve 让我们创建一个 RestClient,用它来设置一个基本的 GET 请求,并使用 retrieve 以字符串形式获取网站的内容: RestClient restClient = RestClient.create(); String result = restClient.get() .uri("https://example.com") .retrieve() .body(String.class); System.out.println(result); 如果你对响应状态码和 header 感兴趣,而不仅仅是对响应内容感兴趣,你可以使用 toEntity 获取 ResponseEntity:

Spring Cloud Gateway 的主动健康检查策略

如今,应用程序被构建为小型独立上游服务的集合。这加快了开发速度,并使模块专注于特定职责,提高了质量。这是使用微服务方法的主要优势之一。然而,从一个服务跳转到另一个服务会增加额外的延迟,当服务没有响应时,这种延迟会显著增加。 如果你运行的是微服务,你需要防止上游服务在工作不正常时被调用。即使使用断路器(circuit breaker)模式,也会对响应时间造成影响。因此,有时最好主动检查上游服务,以验证它们是否在需要之前就已准备就绪。 健康检查是确定服务是否能够根据其状态作出正确响应、防止超时和错误的一种方法。 被动健康检查 在请求处理过程中进行。如果服务最终处于不健康状态,应用程序将返回失败,并标记端点不健康。这会增加额外的延迟。 主动健康检查 将在接收请求之前在后台检查并放弃不健康的服务。它不会增加额外的延迟。 最后但并非最不重要的一点是,这些功能可与断路器库结合使用,以便立即 fall back 到另一个 endpoint ,而不会受到首次失误的惩罚。 目标是通过使用负载均策略,将路由请求转发到健康的上游服务: 本文章分为两部分: “你需要的 Spring 功能” - 描述你需要哪些 Spring 功能来获得主动的健康检查。 “为你的服务注册端点”- 参考一些将一个或多个端点添加到路由中的方法。 1、你需要的 Spring 功能 Spring 的一些功能可以帮助你进行主动的健康检查: Spring Cloud Load Balancer(SLB)是客户端负载均衡器,可在不同上游服务端点之间均衡流量。它是 Spring Cloud 项目 的一部分,包含在 spring-cloud-commons 库中(参见 SLB文档)。 客户端服务发现功能可让客户端查找服务并与之通信,而无需硬编码主机名和端口。spring-cloud-commons 库中也包含该功能(参见 服务发现文档)。 Spring Cloud Gateway 为在 Spring 和 Java 之上构建API网关提供了一个库。它通过 LoadBalancerClientFilter / ReactiveLoadBalancerClientFilter 全局过滤器支持上述功能。在本文章中,你将看到使用这些全局过滤器的不同方法。 首先,让我们来了解其中的一些功能。 Spring Cloud Load Balancer filter Spring Cloud 中包含用于负载均衡的全局过滤器,可通过使用特殊的 URI 符号激活:lb://your-service-name。 spring: cloud: gateway: routes: - id: myRoute uri: lb://your-service-name predicates: - Path=/service/** 负载均衡器过滤器 ReactiveLoadBalancerClientFilter (用于响应式应用程序)将检测 URI 并将其替换为与 your-service-name 相关的可用端点。

在 JPA 和 Sping Data JPA 中使用 Java Record

1、概览 在本教程中,我们将探讨如何在 JPA 中使用 Java Record,包括以下内容。 为什么 Record 不能作为 Entity 使用。 在 JPA 中使用 Record。 在 Spring Boot 应用中使用 Spring Data JPA 和 Record。 2、Record 和 Enttiy Record 是不可变的,用于存储数据。它们包含字段、全参数构造函数、getter、toString 和 equals/hashCode 方法。由于它们是不可变的,因此没有 setter。由于其语法简洁,在 Java 中经常被用作数据传输对象(DTO)。 Entity(实体)是映射到数据库表的类。它们用于表示数据库中的条目。它们的字段被映射到数据库表中的列。 2.1、Record 不能作为 Entity 实体由 JPA provider 处理。JPA provider 负责创建数据库表,将实体映射到表,并将实体持久化到数据库。在流行的 JPA provider(如 Hibernate)中,实体是使用代理来创建和管理的。 代理是在运行时生成并继承实体类的类。这些代理依赖于实体类的无参数构造函数和 setter。由于 Record 不具有这些,所以它们不能用作实体。 2.2、在 JPA 中使用 Record 的其他方法 由于在 Java 中使用 Record 的简便性和安全性,在 JPA 中以其他方式使用 Record 可能是有益的。 在 JPA中,我们可以通过以下方式使用 Record: 将查询结果转换为 Record。 使用 Record 作为DTO在各个层之间传输数据。 将实体转换为 Record。 3、项目设置 我们将使用 Spring Boot 创建一个使用 JPA 和 Spring Data JPA 的简单应用程序。然后,我们将了解在与数据库交互时使用 Record 的几种方法。

Spring 快速入门指南

本入门指南将会引导你如何从零开始建立一个 Spring 应用,并提供经典的“Hello World!”端点,可供任何浏览器都访问。 环境预备 你需要在本地安装好 Java™ 开发工具包(JDK),以及一个 IDE,如 IntelliJ IDEA、Spring Tools、Visual Studio Code 或 Eclipse。 第 1 步:创建新的 Spring Boot 项目 通过 start.springboot.io 来创建一个“web”项目。在“Dependencies”对话框中搜索并添加 “web”依赖项,如截图所示。点击“Generate”按钮,下载压缩包,并将其解压到电脑上的一个文件夹。 start.springboot.io 创建的项目包含 Spring Boot,这个框架使你不需要太多的代码或配置就可以让 Spring 在你的应用中工作。Spring Boot 是启动 Spring 项目的最快速和最流行的方式。 第 2 步:添加代码 在你的 IDE 中打开项目,找到 src/main/java/com/example/demo 文件夹中的 DemoApplication.java 文件。现在改变该文件的内容,添加下面代码中所示的额外方法和注解。你可以复制并粘贴该代码,或者手动输入该代码。 package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController public class DemoApplication { public static void main(String[] args) { SpringApplication.