0%

Eureka 元数据:服务实例的扩展信息载体

在 Eureka 中,元数据(Metadata)是服务实例携带的额外信息,用于描述服务的属性或配置。元数据分为标准元数据自定义元数据两类,在服务发现、负载均衡和服务调用中发挥重要作用。

元数据的核心作用

元数据是服务实例的 “身份标签”,主要用途包括:

  • 辅助服务发现:消费者通过元数据筛选合适的服务实例(如按版本号选择服务);
  • 传递配置信息:在服务间传递非业务参数(如权重、环境标识);
  • 健康检查扩展:结合元数据实现自定义健康检查逻辑。

标准元数据

标准元数据是 Eureka 内置的、用于服务通信的基础信息,由 Eureka Client 自动采集并注册,无需手动配置。

包含的核心信息

元数据项 说明 对应配置参数(可选)
hostName 服务实例的主机名 eureka.instance.hostname
ipAddress 服务实例的 IP 地址 eureka.instance.ip-address
port 服务端口(非 SSL) server.port
securePort SSL 端口(默认 443) eureka.instance.secure-port
statusPageUrl 服务状态页地址(如/actuator/info eureka.instance.status-page-url
healthCheckUrl 健康检查页地址(如/actuator/health eureka.instance.health-check-url
serviceId 服务名称(即spring.application.name spring.application.name
instanceId 服务实例唯一标识 eureka.instance.instance-id

特点

阅读全文 »

XPath 语言:XML 文档的高效查询工具

XPath(XML Path Language)是一门专门用于在 XML 文档中定位和选择节点的查询语言,它通过简洁的路径表达式,能够快速定位 XML 文档中的特定元素、属性或文本,常与 XML 解析器(如 DOM、SAX)结合使用,广泛应用于数据提取、配置文件解析等场景。

XPath 的核心概念:节点

XPath 将 XML 文档视为一个节点树,所有内容都被抽象为不同类型的节点,主要包括:

节点类型 说明 示例
文档根节点 整个文档的根(非整个文档的最外层元素) 无具体名称,代表整个 XML 文档树
元素节点 XML 中的标签元素 <book><name>
属性节点 元素的属性 id="1001"中的id属性
文本节点 元素内的文本内容 <name>XML指南</name>中的 “XML 指南”
注释节点 XML 中的注释 <!-- 这是注释 -->
处理指令节点 用于指导解析器的指令 <?xml version="1.0"?>
命名空间节点 元素声明的命名空间 xmlns:xs="http://www.w3.org/2001/XMLSchema"

XPath 路径表达式:定位节点的核心语法

XPath 通过路径表达式选取节点或节点集,表达式由多个 “步” 组成,步之间用斜线(/)分隔。例如:/bookstore/book/name表示选取根节点下bookstore元素的子元素book中的name元素。

路径表达式的基本格式

每个 “步” 的完整语法为:

阅读全文 »

Druid 连接池核心配置详解:优化数据库连接管理

Druid 是阿里巴巴开源的高性能数据库连接池,兼具连接管理、监控、SQL 防注入等功能,广泛应用于 Java 后端开发。合理配置 Druid 连接池参数对系统性能、稳定性至关重要。本文将基于官方配置表,深入解析核心参数的作用、默认值及最佳实践,帮助你针对性优化连接池配置。

基础配置:连接建立与身份验证

核心身份认证参数

配置项 缺省值 作用与最佳实践
name 自动生成(DataSource-哈希值 用于多数据源场景的区分标识,监控时便于识别。1.0.5 版本前存在配置 bug,建议 1.0.5+ 版本使用。
url 无(必填) 数据库连接 URL(如 jdbc:mysql://localhost:3306/db),需包含数据库名、编码等参数(如 useUnicode=true&characterEncoding=utf8)。
username 无(必填) 数据库登录用户名,建议使用最小权限账号(仅授予必要操作权限)。
password 无(必填) 数据库登录密码,生产环境需加密存储(可通过 Druid 的 ConfigFilter 解密)。
driverClassName 自动识别 数据库驱动类名(如 com.mysql.cj.jdbc.Driver)。Druid 可通过 url 自动识别,建议显式配置以避免歧义。

配置示例

1
2
3
4
5
6
# 基础连接配置  
spring.datasource.druid.name=primary-db
spring.datasource.druid.url=jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
spring.datasource.druid.username=app_user
spring.datasource.druid.password=EncryptedPassword # 建议加密
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver

连接池大小与资源控制

连接池大小直接影响系统并发能力和资源占用,需根据业务压力合理配置。

核心池大小参数

配置项 缺省值 作用与最佳实践
initialSize 0 初始化连接数。建议设置为 5-10(避免首次请求耗时过长),但不宜过大(启动时建立连接耗时)。
maxActive 8 最大连接数。需根据数据库最大连接数(如 MySQL 默认 max_connections=151)和业务并发量调整,建议 20-50(避免超过数据库承载上限)。
minIdle 无默认值 最小空闲连接数。建议设置为 5-10,避免频繁创建 / 销毁连接(空闲连接可复用)。
maxWait 无默认值 获取连接的最大等待时间(毫秒)。建议设置 3000-5000,超时抛出异常,避免线程无限阻塞。

配置原则

  • 避免过度配置maxActive 不应超过数据库允许的最大连接数(否则会报 too many connections 错误);
  • 空闲连接复用minIdle 确保一定数量的热连接,减少连接建立开销;
  • 突发流量缓冲maxActive 需覆盖业务峰值并发(如通过压测确定合理值)。

配置示例

阅读全文 »

集中式 vs 分布式:版本控制系统的核心差异

版本控制系统(VCS)是开发过程中管理代码变更的关键工具,其中集中式(如 SVN)和分布式(如 Git)是两种主流架构。它们在设计理念、工作方式和适用场景上存在本质区别,理解这些差异有助于选择适合项目的工具。

核心架构对比

1. 集中式版本控制系统(以 SVN 为例)

  • 架构特点
    存在一个中央服务器,所有版本库数据集中存储于此,客户端仅保留当前工作的文件快照(无完整历史)。

  • 工作流程

    1. 开发者从中央服务器 checkout(检出)最新代码到本地。
    2. 本地修改后,需先 update(更新)获取他人最新提交,解决冲突。
    3. 最后将修改 commit(提交)到中央服务器,完成版本记录。
  • 示意图

    1
    [客户端 A] ←→ [中央服务器(唯一版本库)] ←→ [客户端 B]

2. 分布式版本控制系统(以 Git 为例)

  • 架构特点
    无 “中央服务器” 概念,每个客户端都是完整的版本库(包含所有历史提交、分支、标签),中央服务器仅作为协作节点存在(可选)。

  • 工作流程

    1. 开发者从远程仓库 clone(克隆)完整版本库到本地(包含所有历史)。
    2. 本地修改后,先 commit(提交)到本地库,形成完整历史。
    3. 通过 push(推送)将本地修改同步到远程仓库,或 pull(拉取)获取他人修改。
  • 示意图

    1
    2
    [本地库 A] ←→ [远程仓库(协作节点)] ←→ [本地库 B]
    (完整版本库) (完整版本库) (完整版本库)

关键差异对比

对比维度 集中式(如 SVN) 分布式(如 Git)
版本库存储 仅中央服务器有完整版本库,客户端无历史。 每个客户端都有完整版本库(含所有历史)。
联网依赖 几乎所有操作(检出、提交、更新)需联网。 本地提交、分支操作无需联网,仅同步时需联网。
提交机制 提交直接写入中央服务器,即时影响他人。 先提交到本地库,再自主选择何时同步到远程。
分支实现 分支是中央服务器的目录副本,创建 / 切换低效。 分支是本地指针,创建 / 切换瞬间完成,轻量高效。
数据安全性 依赖中央服务器备份,单点故障可能丢失数据。 多客户端备份完整版本库,抗风险能力强。
冲突处理 提交前必须更新,冲突在中央服务器解决。 本地可解决冲突,同步时仅需处理增量差异。
离线工作 几乎无法离线工作(无法提交、查看历史)。 完全支持离线工作(本地提交、查看历史、分支操作)。
阅读全文 »

设计模式分类:创建型、结构型与行为型

设计模式是面向对象设计中反复出现的问题的解决方案,根据其解决问题的侧重点,可分为三大类:创建型模式结构型模式行为型模式。每类模式聚焦于软件设计的不同层面,共同助力构建灵活、可复用的系统。

创建型模式(Creational Patterns)

核心目标

抽象对象的实例化过程,封装对象创建的细节,使系统在不依赖具体类的情况下创建对象,从而提高灵活性和可扩展性。

主要解决问题

  • 如何隐藏对象创建的复杂性(如初始化步骤、依赖管理)?
  • 如何确保对象创建符合特定约束(如单例、池化)?
  • 如何使系统独立于对象的具体类型,便于替换或扩展?

包含模式(5 种)

  1. 工厂方法模式(Factory Method)
    • 定义一个创建对象的接口,由子类决定实例化哪个类。
    • 类模式(通过继承实现),典型应用:Java Collectioniterator()方法。
  2. 抽象工厂模式(Abstract Factory)
    • 提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定具体类。
    • 示例:不同操作系统的 UI 组件工厂(Windows 按钮与 Mac 按钮)。
  3. 单例模式(Singleton)
    • 确保一个类仅有一个实例,并提供全局访问点。
    • 应用:配置管理器、线程池等需唯一实例的场景。
  4. 建造者模式(Builder)
    • 将复杂对象的构建过程与表示分离,使同一构建过程可创建不同表示。
    • 示例:StringBuilder(分步构建字符串)、复杂对象的配置器。
  5. 原型模式(Prototype)
    • 通过复制现有对象(原型)来创建新对象,避免重复初始化。
    • 应用:大对象的高效复制(如克隆数据库连接对象)。

结构型模式(Structural Patterns)

核心目标

描述类与对象的组合方式,通过灵活的组合实现更复杂的功能结构,同时保持结构的稳定性和可扩展性。

阅读全文 »