0%

Feign 的编解码器:请求与响应的处理机制

Feign 作为声明式 HTTP 客户端,其核心能力之一是自动处理请求参数的编码和响应结果的解码。编解码器(Encoder/Decoder)是 Feign 实现这一功能的关键组件,负责在服务调用过程中完成数据格式的转换。

编码器(Encoder):请求参数的序列化

编码器的作用是将 Java 对象转换为 HTTP 请求体(如 JSON、表单数据等),以便服务端能够正确解析。Feign 默认提供了多种编码器,也支持自定义实现。

1. 内置编码器

  • SpringEncoder:Spring Cloud 整合后默认使用的编码器,基于 Spring 的HttpMessageConverter实现,支持 JSON、XML 等多种格式(依赖jackson-databind等库)。
  • FormEncoder:用于处理表单提交(application/x-www-form-urlencoded),需单独引入feign-form依赖。

2. 自定义编码器实现

当默认编码器无法满足需求(如特殊数据格式、加密处理)时,可通过实现Encoder接口自定义:

阅读全文 »

适配器模式(Adapter Pattern):接口转换的桥梁

适配器模式是结构型设计模式的一种,核心思想是将一个类的接口转换为客户端期望的另一个接口,使原本因接口不兼容而无法协同工作的类能够一起工作。它就像生活中的 “转换插头”,让不同规格的设备可以互通,核心功能是 “转换匹配,复用已有功能”。

适配器模式的核心结构

适配器模式

适配器模式包含三个核心角色,通过转换实现接口兼容:

目标角色(Target)

  • 客户端期望的目标接口,定义了客户端需要的方法。
  • 示例:USB接口(客户端设备需要的接口)。

被适配角色(Adaptee)

  • 已存在的旧接口,其功能需要被复用,但与目标接口不兼容。
  • 示例:Type-C接口(已有设备的接口,与 USB 不兼容)。

适配器角色(Adapter)

  • 实现目标接口,并包装被适配对象,将目标接口的方法转换为被适配接口的方法调用。
  • 示例:USB-TypeC转换器(实现 USB 接口,内部调用 Type-C 设备的功能)。

适配器模式的两种实现方式

根据适配器与被适配对象的关系(继承 / 组合),适配器模式分为类适配器对象适配器

阅读全文 »

装饰器模式(Decorator Pattern):动态扩展对象功能的灵活方式

装饰器模式是结构型设计模式的一种,核心思想是动态地给对象添加额外职责或功能,而无需修改原对象的结构。它通过 “包装”(组合)而非 “继承” 实现扩展,比生成子类更灵活,本质是 “动态组合”。

装饰器模式的核心结构

装饰模式

装饰器模式通过四个角色实现功能的动态扩展,层次清晰且职责明确:

组件接口(Component)

  • 定义对象的核心功能接口,是装饰器和具体组件的共同父类。
  • 示例:InputStream(Java IO 中的输入流接口,定义读取数据的核心方法)。

具体组件(ConcreteComponent)

  • 实现组件接口,是被装饰的原始对象,提供基础功能。
  • 示例:FileInputStream(具体的文件输入流,实现基础的文件读取)。

装饰器抽象类(Decorator)

  • 实现组件接口,并持有一个组件对象的引用(通过构造方法注入),定义所有装饰器的统一接口。
  • 示例:FilterInputStream(Java IO 中的装饰器抽象类,持有InputStream引用)。

具体装饰器(ConcreteDecorator)

  • 继承装饰器抽象类,添加额外功能,在调用被装饰对象的方法前后插入新逻辑。
  • 示例:BufferedInputStream(为输入流添加缓冲功能)、DataInputStream(添加数据类型转换功能)。

代码实现示例

以 “咖啡订单系统” 为例:基础咖啡(如美式咖啡)可通过装饰器动态添加牛奶、糖等配料,实现功能扩展。

阅读全文 »

Elasticsearch 降级操作指南:从 7.x 降至 6.8.23

由于 Elasticsearch 7.x 与 6.x 版本差异较大(如移除 Type、API 变更等),若需兼容旧系统或修复特定漏洞(如 log4j2 漏洞),可能需要降级至 6.8.23(6.x 系列的最后一个安全更新版本)。以下是详细的降级步骤及问题解决方法。

降级前准备

  1. 备份数据与配置
    • 备份索引数据(建议通过 snapshot API 创建快照,存储至外部仓库)。
    • 备份原 7.x 版本的配置文件(/etc/elasticsearch/elasticsearch.yml/etc/sysconfig/elasticsearch 等),避免降级后配置丢失。
  2. 确认版本兼容性
    • 6.8.23 支持 JDK 8(不支持 JDK 11),需确保环境中已安装 JDK 8 并配置正确。

降级步骤

下载 6.8.23 版本的 RPM 包

1
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.23.rpm

覆盖安装旧版本

使用 rpm -Uvh --oldpackage 命令强制安装低版本,覆盖现有 7.x 版本:

1
rpm -Uvh --oldpackage elasticsearch-6.8.23.rpm
  • --oldpackage 选项允许 RPM 安装比当前版本更低的包。

配置 JAVA_HOME(6.x 版本依赖外部 JDK)

Elasticsearch 7.x 自带 JDK,而 6.x 需依赖系统安装的 JDK 8,需手动配置:

阅读全文 »

Elasticsearch 安装指南:单机与分布式部署详解

Elasticsearch(ES)的安装部署是使用其功能的基础,本文将基于 RPM 包方式,详细讲解单机环境和分布式集群的安装步骤、配置调整及常见问题解决,适用于 CentOS/RHEL 系统。

安装前准备

环境要求

  • 操作系统:CentOS 7/8 或 RHEL 7/8(64 位)。

  • Java 环境:ES 依赖 Java,需安装 JDK 8 或 11(推荐 11,ES 7.x+ 对 JDK 11 支持更优)。

    验证 Java 环境:

    1
    java -version  # 需输出 java version "1.8.0_xxx" 或 "11.0.xxx"
  • 用户权限:ES 不允许 root 用户直接运行,建议创建专用用户(如 elasticsearch)。

导入 Elastic 官方密钥

1
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

单机安装步骤

下载并安装 RPM 包

以 ES 7.1.1 为例(可替换为其他版本,如 7.17.x 长期支持版):

1
2
3
4
5
# 下载 RPM 包
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.1.1-x86_64.rpm

# 安装
rpm -ivh elasticsearch-7.1.1-x86_64.rpm

安装后,ES 相关文件路径:

阅读全文 »