教程

Spring Cloud Gateway 教程

1、概览 本文将带你了解 Spring Cloud Gateway 的主要功能,它是一个基于 Spring Boot 和 Project Reactor 的网关。 Spring Cloud Gateway 提供开箱即用的路由机制,通常用于微服务应用中,把多个服务隐藏在 “Facade”(门面设计模式)后面。 2、路由处理器 Spring Cloud Gateway 专注于路由请求,它将请求转发给网关 Handler Mapping,由其决定如何处理与特定路由相匹配的请求。 从一个快速示例开始,看看 Gateway Handler 如何使用 RouteLocator 解析路由配置: @Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { return builder.routes() .route("r1", r -> r.host("**.baeldung.com") .and() .path("/baeldung") .uri("http://baeldung.com")) .route(r -> r.host("**.baeldung.com") .and() .path("/myOtherRouting") .filters(f -> f.prefixPath("/myPrefix")) .uri("http://othersite.com") .id("myOtherID")) .build(); } 注意,有几个核心的 API: Route - 网关的主要 API。它由给定的标识(ID)、目的地(URI)和一组 Predicate 和 Filter 定义 Predicate - Java 8 Predicate ,用于使用 Header、方法或参数匹配 HTTP 请求 Filter - 标准的 Spring WebFilter 3、动态路由 与 Zuul 一样,Spring Cloud Gateway 也提供了将请求路由到不同服务的方法。

Spring Integration 简介

1、简介 本文将通过一些实际的案例,带你了解 Spring Integration 的核心概念。 Spring Integration 提供了许多功能强大的组件,可大大增强企业架构内系统和流程的互联性。 2、设置 <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-core</artifactId> <version>5.1.13.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-file</artifactId> <version>5.1.13.RELEASE</version> </dependency> 你可以从 Maven Central 下载最新版本的 Spring Integration Core 和 Spring Integration File Support。 3、消息传递模式 这个库中的一个基本模式是消息传递(Messaging)。该模式围绕消息展开,消息是离散的数据负载(Discrete Payloads),通过预定义的通道从源系统或进程传递到一个或多个系统或进程。 从历史上看,这种模式是整合多个不同系统的最灵活方式,它可以: 几乎完全解耦集成所涉及的系统 允许集成中的参与系统完全不考虑彼此的底层协议、格式或其他实现细节 鼓励开发和重复使用参与集成的组件 4、消息集成的实际应用 举一个基本例子,将 MPEG 视频文件从指定文件夹复制到另一个配置文件夹: @Configuration @EnableIntegration public class BasicIntegrationConfig{ public String INPUT_DIR = "the_source_dir"; public String OUTPUT_DIR = "the_dest_dir"; public String FILE_PATTERN = "*.mpeg"; @Bean public MessageChannel fileChannel() { return new DirectChannel(); } @Bean @InboundChannelAdapter(value = "fileChannel", poller = @Poller(fixedDelay = "1000")) public MessageSource<File> fileReadingMessageSource() { FileReadingMessageSource sourceReader= new FileReadingMessageSource(); sourceReader.

Spring WebClient 教程

1、概览 本文将带你了解如何使用 WebClient 和 WebTestClient,前者是一个 Spring 5 中引入的响应式 HTTP 客户端,而后者是一种用于测试的 WebClient。 2、WebClient 是啥? 简而言之,WebClient 是一个接口,表示执行 Web 请求的主要入口点。 它是 Spring Web Reactive 模块的一部分,用于取代经典的 RestTemplate。此外,这个新的客户端是一个基于 HTTP/1.1 协议的响应式、非阻塞解决方案。 尽管它实际上是一个非阻塞客户端,而且属于 spring-webflux 库,但该解决方案同时支持 同步 和 异步 操作,因此也适用于在 Servlet 技术栈上运行的应用,通过阻塞操作来获得结果。当然,如果使用的是响应式技术栈,则不建议采用这种做法。 该接口只有一个实现,即我们将要使用的 DefaultWebClient 类。 3、依赖 在 Spring Boot 应用中,只需要添加 spring-boot-starter-webflux 依赖即可获得响应式 Web 的支持。 3.1、使用 Maven 构建 在 pom.xml 中添加以下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> 3.2、使用 Gradle 构建 build.gradle 文件中添加以下条目: dependencies { compile 'org.springframework.boot:spring-boot-starter-webflux' } 4、使用 WebClient 要使用 WebClient,我们需要了解如何:

Spring Boot 最全面的入门教程

1、概览 Spring Boot 是一个基于 Spring 的框架,旨在简化 Spring 应用的配置和开发过程,通过自动配置和约定大于配置的原则,使开发者能够快速搭建独立、生产级别的应用程序。 本文将带你了解 Spring Boot 的核心内容,从基本的项目创建开始,内容包括了:应用配置、Thymeleaf 视图配置、Spring Security 配置、持久层配置、Web 层 Controller 配置以及异常处理和测试。 2、设置 首先,使用 Spring Initializr 生成基础项目。 生成的项目依赖于 Spring Boot Parent 项目: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <relativePath /> </parent> 初始依赖非常简单: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> </dependency> 3、应用配置 创建 Main Application 类: @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 这里使用的是 @SpringBootApplication 注解,这相当于同时使用了 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 注解。

Spring Retry 教程

1、概览 Spring Retry 提供了自动重新调用失败操作的能力。这在错误可能是短暂的(例如瞬时的网络故障)情况下非常有帮助。 本文将带你了解使用 Spring Retry 的各种方法:注解、RetryTemplate 和回调。 2、Maven 依赖 首先,在 pom.xml 文件中添加 spring-retry 以及 Spring AOP 依赖: <dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> <version>2.0.3</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>6.0.11</version> </dependency> 你可以在 Maven Central 获取 spring-retry 和 spring-aspects 依赖的最新版本。 3、启用 Spring Retry 要在应用中启用 Spring Retry,需要在 @Configuration 类中添加 @EnableRetry 注解: @Configuration @EnableRetry public class AppConfig { ... } 4、使用 Spring Retry 4.1、@Retryable 注解 使用 @Retryable 注解为方法添加重试功能: @Service public interface MyService { @Retryable void retryService(String sql); } 由于没有指定任何异常,因此将尝试重试所有异常。此外,一旦达到最大尝试次数,但仍有异常,就会抛出 ExhaustedRetryException。

Spring 中的控制反转(IoC)和依赖注入(DI)

1、概览 本文将带你了解 IoC(控制反转)和 DI(依赖注入)的概念,以及如何在 Spring 中实现这些概念。 2、控制反转(IoC)是什么? 控制反转(Inversion of Control)是软件工程中的一项原则,它将对象或程序部分的控制权转移到容器或框架中。在面向对象的编程中经常使用。 也有人叫 “反转控制”。 在传统编程中,我们使用自定义代码来调用库,而 IoC 则使框架能够控制程序的流程,并调用我们的自定义代码。框架使用了带有内置附加行为的抽象类来实现这一点。如果我们想添加自己的行为,就需要继承框架的类或插入自己的类。 这种架构的优势在于: 将任务的执行与任务的实现分离开来 更容易在不同的实现之间切换 程序的模块化程度更高 通过隔离组件或模拟其依赖,并允许组件通过 “约定” 进行通信,从而更轻松地测试程序 我们可以通过各种机制实现控制反转,例如:策略模式、服务定位模式、工厂模式和依赖注入(DI)。 3、依赖注入(DI)是什么? 依赖注入是可以用来实现 IoC 的一种模式,其中被反转的控制是 设置对象的依赖。 将对象与其他对象 “装配” 起来,或将对象 “注入” 到其他对象中是由组装器(Assembler)而不是对象本身来完成的。 下面是我们在传统编程中创建依赖对象的方法: public class Store { private Item item; public Store() { item = new ItemImpl1(); // 实例化所需的依赖 } } 重写示例,通过使用 DI,而无需指定 Item 的实现: public class Store { private Item item; public Store(Item item) { this.item = item; } } 在接下来的章节中,将带你了解如何通过元数据(Metadata)来实现 Item。

Java 加载 PEM 格式的 RSA 证书和私钥

在 上一篇文章 中,我们介绍了如何使用 Java 生成 RSA 密钥对,以及如何使用 RSA 进行加密、解密和签名验签。 在实际情况中,RSA 加密、解密所使用的密钥对往往是已经生成好的,通常以 PEM(Privacy Enhanced Mail)格式存储。 PEM 是一种常见的文件格式,用于存储和传输加密的 证书、私钥 和其他安全相关的数据。 证书(Certificate):用于存储公钥证书,通常以 .pem 或 .crt 为扩展名。 私钥(Private Key):用于存储私钥,通常以 .pem 或 .key 为扩展名。 PEM 格式的文件通常以.pem为扩展名,它使用标头和尾部标记来界定不同类型的数据,并使用 Base64 编码将二进制数据转换为 ASCII 文本。 本文将带你了解如何在 Java 中使用 Spring 的 PemContent 工具类加载 PEM 格式的 RSA 证书和私钥为 PublicKey 和 PrivateKey 对象。 使用 OpenSSL 生成 RSA 私钥和证书 我们使用 OpenSSL 来生成示例所用的 RSA 私钥和证书。首先需要确保你在本机安装了 OpenSSL,并且正确地配置到了 PATH 环境变量。 OpenSSL 是一个开源的密码学工具库,被广泛应用于网络安全领域,用于创建和管理 SSL/TLS 连接、生成自签名证书、签发数字证书、进行加密通信等。 生成 2048 位的 RSA 私钥:

Spring Cloud Netflix 教程 - Eureka

1、概览 本文将带你了解如何通过 Spring Cloud Netflix Eureka 来实现客户端服务发现。 客户端服务发现允许服务相互查找和通信,而无需硬编码主机名和端口。在这种架构中,唯一的 “固定点” 是服务注册中心(service registry,),每个服务都必须在注册中心中注册。 一个缺点是所有客户端必须实现特定的逻辑与这个注册中心进行交互。这就需要在实际请求之前进行一次额外的网络请求。 有了 Netflix Eureka,每个客户端都可以同时充当服务器,将自己的状态复制给已连接的对等服务。换句话说,客户端在服务注册中心中检索所有已连接对等服务的列表,并通过负载均衡算法向其他服务发出所有进一步请求。 要获知客户端的存在,它们必须向注册中心发送心跳信号。 为了实现本文的目标,需要实现三个微服务: 注册中心(Eureka Server) REST 服务,在注册中心中注册(Eureka Client) Web 应用,作为客户端(Spring Cloud Netflix Feign Client)来消费 REST 服务(从注册中心获取到服务) 2、Eureka 服务器 使用 Eureka Server 实现一个注册中心,很简单: 在依赖中添加 spring-cloud-starter-netflix-eureka-server 用 @EnableEurekaServer 对 @SpringBootApplication 进行注解,从而启用 Eureka 服务器 配置一些配置属性 一步步来: 首先,创建一个新的 Spring Boot 项目,并添加相应的依赖。 通过 spring-cloud-starter-parent Bom 管理组件的依赖版本。 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-parent</artifactId> <version>2021.0.3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> 你可以在 Spring 的官方文档中查看 最新的 Spring Cloud 版本。

使用 Spring Security 防止 CSRF 攻击

1、概览 本文将带你了解什么是跨站请求伪造(CSRF)攻击?以及如何使用 Spring Security 来防范这些攻击。 2、两种简单的 CSRF 攻击行为 CSRF 攻击有多种形式。 2.1、GET 示例 假如下面这个 GET 请求,用于一个已登录的用户向指定的银行账户 1234 转账: GET http://bank.com/transfer?accountNo=1234&amount=100 如果攻击者想把钱从受害者的账户转到自己的账户(5678),他需要让受害者触发请求: GET http://bank.com/transfer?accountNo=5678&amount=1000 有多种方法可以实现这一点: 链接 - 攻击者可以说服/诱导受害者点击该链接,例如执行转账: <a href="http://bank.com/transfer?accountNo=5678&amount=1000"> 点击展示美女图片 </a> 图片 - 攻击者可能会使用 <img/> 标签,将目标 URL 作为图片来源。换句话说,甚至不需要点击。请求将在页面加载时自动执行: <img src="http://bank.com/transfer?accountNo=5678&amount=1000"/> 所以,涉及到敏感的业务,千万不能用 GET 请求。 2.2、POST 示例 假设转账 API 是一个 POST 请求。 POST http://bank.com/transfer accountNo=1234&amount=100 在这种情况下,<a> 和 <img/> 标签都不起作用。 攻击者需要使用 <form>: <form action="http://bank.com/transfer" method="POST"> <input type="hidden" name="accountNo" value="5678"/> <input type="hidden" name="amount" value="1000"/> <input type="submit" value="Show Kittens Pictures"/> </form> 然后,使用 JavaScript 自动提交表单:

Spring 整合 Thymeleaf 模板引擎

1、概览 Thymeleaf 是一个 Java 模板引擎,用于处理和创建 HTML、XML、JavaScript、CSS 和文本。 本文将带你了解如何在 Spring 和 Spring Boot 应用中整合、使用 Thymeleaf。 该库具有极高的可扩展性,其天然的模板功能可以确保在没有后端的情况下制作模板原型。与其他流行的模板引擎(如 JSP)相比,这使得开发速度非常快。 2、Spring 整合 Thymeleaf 首先,来看看与 Spring 整合所需的配置。这需要使用 thymeleaf-spring 库。 在 Maven POM 文件中添加以下依赖: <dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf</artifactId> <version>3.1.2.RELEASE</version> </dependency> <dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf-spring5</artifactId> <version>3.1.2.RELEASE</version> </dependency> 注意,对于 Spring 4,必须使用 thymeleaf-spring4,而不是 thymeleaf-spring5。 通过 SpringTemplateEngine 类执行所有配置步骤。 可以在 Java 配置中将该类配置为 bean: @Bean @Description("Thymeleaf Template Resolver") public ServletContextTemplateResolver templateResolver() { ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(); templateResolver.setPrefix("/WEB-INF/views/"); templateResolver.setSuffix(".html"); templateResolver.setTemplateMode("HTML5"); return templateResolver; } @Bean @Description("Thymeleaf Template Engine") public SpringTemplateEngine templateEngine() { SpringTemplateEngine templateEngine = new SpringTemplateEngine(); templateEngine.