0%

Zookeeper 作为服务注册中心:实现与特性解析

Zookeeper 是一个分布式协调服务,常被用作微服务架构的注册中心。与 Eureka 不同,Zookeeper 本身就是一个独立的服务端,无需额外开发注册中心服务,只需在微服务中集成客户端即可实现服务注册与发现。

Zookeeper 注册中心的核心优势

  • 强一致性:基于 ZAB 协议(类 Paxos 算法),保证服务注册信息在集群中的一致性;
  • 临时节点特性:服务实例以临时节点注册,服务下线或崩溃时自动删除,无需手动清理;
  • 分布式协调能力:支持节点监听(Watch)机制,服务消费者可实时感知服务实例变化;
  • 成熟稳定:广泛应用于分布式系统,如 Kafka、Hadoop 等,可靠性经过验证。

集成 Zookeeper 注册中心的步骤

1. 引入依赖

在 Spring Boot 项目中添加 Zookeeper 服务发现依赖:

阅读全文 »

JVM 参数全解析:从基础配置到高级调优

JVM 参数是控制 JVM 运行行为的核心手段,合理配置参数能显著提升应用性能、避免内存溢出等问题。JVM 参数分为标准参数、非标准参数(-X 开头)和非标准化参数(-XX 开头),本文将系统梳理常用参数的分类、作用及配置方式,帮助开发者根据场景选择合适的参数。

JVM 参数类型

标准参数(稳定,跨版本兼容)

- 开头,如 java -versionjava -classpath 等,本文不重点展开。

非标准参数(-X 开头,半稳定)

由 JVM 实现定义,可能随版本变化,常用参数如下:

参数 作用描述
-Xmixed 混合模式执行(解释器 + JIT 编译,默认启用)
-Xint 仅使用解释器执行(禁用 JIT,适合调试)
-Xbootclasspath 设置引导类加载路径(如指定自定义核心类库)
-Xms<size> 初始堆内存(等价于 -XX:InitialHeapSize,如 -Xms2g
-Xmx<size> 最大堆内存(等价于 -XX:MaxHeapSize,如 -Xmx4g
-Xss<size> 线程栈大小(等价于 -XX:ThreadStackSize,如 -Xss1m
-Xloggc:<file> 将 GC 日志写入文件(带时间戳,如 -Xloggc:gc.log

非标准化参数(-XX 开头,不稳定,最常用)

用于精细控制 JVM 内部行为,分为两类:

  • Boolean 类型-XX:+<option>(启用)、-XX:-<option>(禁用),如 -XX:+PrintGCDetails
  • KV 类型-XX:<option>=<value>,如 -XX:NewRatio=2

常用 JVM 参数详解

参数查看与调试

参数 作用描述
-XX:+PrintCommandLineFlags 程序启动前打印手动或自动设置的 -XX 参数
-XX:+PrintFlagsInitial 打印所有 -XX 参数的默认初始值
-XX:+PrintFlagsFinal 打印运行时生效的 -XX 参数值(最终值)
-XX:+PrintVMOptions 仅打印用户设置的 JVM 参数

堆内存配置(核心)

堆内存是 JVM 管理的核心区域,参数直接影响 GC 效率和内存利用率:

阅读全文 »

Maven 自定义插件开发全指南:从实现到应用

Maven 插件是扩展 Maven 功能的核心方式,通过自定义插件,你可以将团队特有的构建逻辑、检查规则或部署流程集成到 Maven 生命周期中。本文将详细介绍如何开发、打包和使用自定义 Maven 插件。

自定义插件的核心概念

  • Mojo:Maven 插件的最小执行单元(类似 “目标”),每个插件包含一个或多个 Mojo,每个 Mojo 对应一个具体功能(如代码检查、自定义打包)。
  • 插件打包类型:自定义插件必须使用 <packaging>maven-plugin</packaging> 声明。
  • 注解驱动:通过 @Mojo 注解定义 Mojo 元信息,@Parameter 注解声明可配置参数。

开发自定义插件的步骤

1. 创建插件项目

新建一个 Maven 项目,修改 pom.xml 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.zhanghe.study</groupId>
<artifactId>test-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>maven-plugin</packaging> <!-- 插件必须使用此打包类型 -->

<name>Test Maven Plugin</name>
<description>A custom Maven plugin example</description>

<dependencies>
<!-- 插件核心依赖 -->
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.8.6</version> <!-- 推荐使用较新版本 -->
</dependency>
<!-- 注解处理器(简化 Mojo 配置) -->
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.6.4</version>
<scope>provided</scope> <!-- 编译时依赖 -->
</dependency>
</dependencies>
</project>

2. 实现 Mojo 类

每个 Mojo 类需继承 AbstractMojo 并实现 execute() 方法,通过注解定义元信息和参数。

示例:创建一个打印版本信息的 Mojo:

阅读全文 »

Maven 插件全解析:从基础到高级应用

Maven 作为一款强大的项目管理工具,其核心功能完全依赖插件实现。无论是编译代码、打包项目,还是生成报告,都需要通过插件完成。本文将系统介绍 Maven 插件的分类、常用插件配置及调用方式,帮助你灵活掌控项目构建流程。

Maven 插件基础

插件的本质

Maven 插件是实现特定功能的 Java 类,通过 “目标(Goal)” 定义具体操作(如编译、打包)。每个插件可包含多个目标,例如 maven-compiler-plugin 包含 compile(编译主代码)和 testCompile(编译测试代码)两个目标。

插件语法

调用插件的基本格式:

1
mvn [插件前缀]:[目标]
  • 示例:mvn compiler:compile(调用编译插件的 compile 目标)。

插件分类

  • 构建插件(Build Plugins):参与项目构建过程,如编译、打包、测试等,默认绑定到 Maven 生命周期的特定阶段。
    示例:maven-compiler-pluginmaven-jar-plugin
  • 报告插件(Reporting Plugins):生成项目报告(如测试覆盖率、依赖分析),默认绑定到 site 生命周期。
    示例:maven-javadoc-pluginmaven-surefire-report-plugin

常用核心插件详解

编译插件:maven-compiler-plugin

功能:指定 Java 编译版本,确保代码兼容性。

阅读全文 »

Maven 打包包含第三方依赖:Assembly 与 Shade 插件详解

在 Java 项目部署时,常常需要将第三方依赖一并打包,生成可直接运行的 Jar 包(无需用户手动下载依赖)。Maven 提供了 maven-assembly-pluginmaven-shade-plugin 两个核心插件实现这一需求,本文将详细介绍两者的配置与差异。

为什么需要包含第三方依赖?

  • 独立运行:生成的 Jar 包可直接通过 java -jar 命令运行,无需依赖外部 Maven 仓库。
  • 环境一致性:避免因依赖版本差异导致的 “本地能跑,线上报错” 问题。
  • 简化部署:只需传输一个 Jar 包,无需额外配置依赖路径。

Assembly 插件:灵活的打包方案

maven-assembly-plugin 是 Maven 官方插件,支持多种打包格式(如 Jar、Zip、Tar),并可通过描述符(descriptor)自定义打包内容。

核心配置(包含所有依赖的 Jar 包)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version> <!-- 推荐使用最新版本 -->
<configuration>
<!--
描述符
1、bin - 将jar包打zip包
2、jar-with-denpendencies - 带有依赖的jar包
3、project - 将工程源代码打包
4、src - 将工程src目录下的源代码打包
-->
<!-- 描述符:指定打包类型,jar-with-dependencies 表示包含所有依赖 -->
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>

<!-- 配置可执行 Jar 的入口类(可选) -->
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.zhanghe.Main</mainClass> <!-- 替换为你的主类全路径 -->
</manifest>
</archive>
</configuration>

<!-- 绑定到 package 阶段,执行 mvn package 时自动打包 -->
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal> <!-- 单一次打包 -->
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

执行与效果

  • 执行命令:mvn clean package
  • 生成的 Jar 包位于 target/ 目录,命名格式为 [artifactId]-[version]-jar-with-dependencies.jar(如 demo-1.0-SNAPSHOT-jar-with-dependencies.jar)。
  • 包内结构:包含项目自身的类和所有第三方依赖的类(平铺在 BOOT-INF/classes 或根目录下)。
阅读全文 »