0%

Spring Cloud Gateway 断言(Predicate)详解:精准匹配请求的核心机制

Spring Cloud Gateway 的断言(Predicate)是路由匹配的核心,它通过匹配 HTTP 请求的各种属性(如路径、方法、头信息、时间等),决定是否将请求转发到目标服务。Gateway 内置了多种断言工厂,满足不同场景的路由匹配需求。

断言的本质

断言(Predicate)本质是请求匹配规则,基于 Java 8 的Predicate函数式接口实现。当请求到达网关时,Gateway 会依次执行路由中定义的断言:

  • 若所有断言均返回true,则请求匹配该路由,执行转发;
  • 若任一断言返回false,则跳过该路由,继续匹配其他路由。

断言的配置方式有两种:

  1. 简短配置- 断言名=参数1,参数2(适合简单场景);
  2. 全面配置:通过nameargs显式指定参数(适合复杂场景)。

示例(Cookie 断言的两种配置):

阅读全文 »

分布式配置动态刷新:从手动触发到自动感知

在分布式系统中,配置中心的核心价值不仅在于集中管理配置,更在于支持配置的动态刷新—— 即配置修改后无需重启服务即可生效。Spring Cloud 提供了多种实现方式,从手动触发到自动感知,满足不同场景的需求。

基于 @RefreshScope + Actuator 的手动刷新

这是 Spring Cloud Config 中最基础的动态刷新方式,通过注解标记需要刷新的组件,并结合 Actuator 端点手动触发刷新。

1. 实现步骤

(1)引入依赖

添加 spring-boot-starter-actuator 依赖,用于暴露刷新端点:

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
(2)配置刷新端点

在客户端的 application.yml 中暴露 refresh 端点(或使用 * 暴露所有端点):

1
2
3
4
5
6
management:
endpoints:
web:
exposure:
include: refresh # 仅暴露refresh端点(推荐)
# include: "*" # 暴露所有端点(开发环境可用)
(3)标记需要刷新的组件

在使用配置的类上添加 @RefreshScope 注解,Spring 会为该类创建代理对象,在配置刷新时重新初始化:

阅读全文 »

正则表达式常用语法与实例详解

正则表达式(Regular Expression)是一种用于匹配字符串模式的工具,广泛应用于文本检索、验证、替换等场景。本文基于常用正则语法,结合实例解析其核心规则,帮助快速掌握正则表达式的使用。

基础匹配符号

1. 普通字符与转义符(\

  • 普通字符:直接匹配自身(如 a 匹配 “a”,123 匹配 “123”)。

  • 转义符 \:将特殊字符转为普通字符,或表示特殊含义:

    • 匹配特殊字符(如 \. 匹配 “.”,\* 匹配 “*”)。
    • 表示不可见字符(如 \n 匹配换行,\t 匹配制表符)。

    示例

    • 正则 a\.b 匹配 “a.b”(而非 “acb” 等)。
    • 正则 \t 匹配字符串中的制表符。

2. 锚点:定位匹配位置

  • ^:匹配字符串的开始位置(如 ^abc 匹配以 “abc” 开头的字符串,如 “abc123”)。

  • $$`:匹配字符串的结束位置(如 `xyz$$ 匹配以 “xyz” 结尾的字符串,如 “123xyz”)。

  • \b:匹配单词边界(单词与非单词字符的分界,如 er\b 匹配 “never” 中的 “er”,但不匹配 “verb” 中的 “er”)。

  • \B:匹配非单词边界(如 er\B 匹配 “verb” 中的 “er”,但不匹配 “never” 中的 “er”)。

    示例

    • 正则 ^hello$ 仅匹配字符串 “hello”(精确匹配)。
    • 正则 \bcat\b 匹配 “cat” 或 “a cat”,但不匹配 “category”(”cat” 不是独立单词)。

量词:控制匹配次数

量词用于指定前面的子表达式匹配的次数,默认是贪婪模式(尽可能多匹配),加 ? 可变为非贪婪模式(尽可能少匹配)。

阅读全文 »

Java Web 文件上传:从表单到服务器的完整实现

文件上传是 Web 应用的常见功能(如头像上传、文档提交等)。由于 HTTP 表单默认编码格式不支持二进制数据传输,需使用 multipart/form-data 格式处理文件上传。本文将详细介绍文件上传的原理、基于 commons-fileupload 工具的实现方式及最佳实践。

文件上传的核心原理

表单编码格式

默认情况下,表单使用 application/x-www-form-urlencoded 编码,会将数据转换为键值对字符串(如 name=zhangsan&age=20),不适合传输二进制文件(如图片、视频)。

文件上传需指定表单编码为 multipart/form-data,该格式将表单拆分为多个 “部分(part)”,每个部分对应一个表单项(文本或文件),并通过分隔符区分,支持二进制数据传输。

1
2
3
4
5
6
7
8
<!-- 文件上传表单 -->
<form method="post" enctype="multipart/form-data" action="/upload">
<!-- 文本字段 -->
<input type="text" name="username" />
<!-- 文件字段 -->
<input type="file" name="avatar" />
<button type="submit">上传</button>
</form>
  • method="post":文件上传必须使用 POST 方法(GET 有长度限制);
  • enctype="multipart/form-data":指定二进制编码格式;
  • type="file":文件选择框,用于选择本地文件。

上传数据格式

multipart/form-data 格式的请求体示例:

阅读全文 »

Java Web 国际化(i18n):多语言应用的实现方案

国际化(Internationalization,简称 i18n,因 “internationalization” 首尾字母中间有 18 个字母而得名)是指应用程序能根据用户的语言或地区自动适配内容,提供本地化(Localization,简称 l10n)体验。在 Java Web 中,通过 Locale 类、资源束(ResourceBundle)及格式化工具,可轻松实现多语言支持。本文将详细介绍国际化的核心概念、实现步骤及最佳实践。

国际化的核心概念

区域设置(Locale)

Locale 类代表特定的语言和地区,由语言代码(如 zh 表示中文,en 表示英文)和国家 / 地区代码(如 CN 表示中国,US 表示美国)组成,格式为 语言代码_国家/地区代码(如 zh_CNen_US)。

常用 Locale 实例

1
2
3
Locale china = Locale.CHINA; // 等同于 new Locale("zh", "CN")
Locale us = Locale.US; // 等同于 new Locale("en", "US")
Locale japan = new Locale("ja", "JP"); // 日语(日本)

Locale 核心方法

方法 作用描述
getLanguage() 获取语言代码(如 zhen
getCountry() 获取国家 / 地区代码(如 CNUS
getDisplayLanguage() 获取本地化的语言名称(如 Locale.CHINA 下返回 “中文”)
getDisplayCountry() 获取本地化的国家 / 地区名称(如 Locale.US 下返回 “美国”)

资源束(ResourceBundle)

资源束是存储多语言文本的配置文件集合,通过 ResourceBundle 类加载,根据 Locale 自动匹配对应的语言资源。

命名规则
资源文件以基础名开头,后跟 _语言代码_国家代码.properties,默认文件(无区域后缀)作为 fallback:

阅读全文 »