0%

Maven 普通项目转为 Web 项目:完整步骤与配置解析

将普通 Maven 项目(Jar 打包)转为 Web 项目(War 打包)只需简单几步即可完成,核心是调整目录结构和打包方式。本文将详细介绍转换步骤、目录规范及常见问题解决。

核心转换步骤

修改打包方式为 War

pom.xml 中设置 <packaging>war(默认是 jar),这是 Web 项目的标志性配置:

1
2
3
4
5
6
7
<project>
<groupId>com.example</groupId>
<artifactId>my-webapp</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging> <!-- 关键:声明为 Web 项目 -->
<name>My Web Application</name>
</project>

设置后,Maven 会按照 Web 项目的规则进行构建(如打包为 .war 文件)。

创建 Web 标准目录结构

Maven 对 Web 项目的目录结构有约定,需手动创建以下目录和文件:

1
2
3
4
5
6
7
8
9
10
11
src/
└── main/
├── java/ # 主程序源码(已有,无需修改)
├── resources/ # 配置文件(已有,无需修改)
└── webapp/ # Web 资源根目录(新增)
├── WEB-INF/ # 受保护的 Web 目录(新增)
│ └── web.xml # Web 应用配置文件(新增,核心)
├── index.jsp # 示例页面(可选)
├── css/ # 样式文件目录(可选)
├── js/ # 脚本文件目录(可选)
└── img/ # 图片资源目录(可选)
  • webapp:Web 资源的根目录,打包后会作为 WAR 包的根目录。
  • WEB-INF:存放 Web 应用的配置文件(如 web.xml),该目录下的资源无法通过浏览器直接访问,安全性高。
  • web.xml:Web 应用的核心配置文件,定义 Servlet、过滤器、欢迎页等(Servlet 3.0+ 可注解配置,但建议保留基础配置)。

配置 web.xml(基础示例)

web.xml 是 Web 项目的标配,即使使用注解开发,也建议保留基础结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">

<!-- 欢迎页(访问项目根路径时默认打开的页面) -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

<!-- 示例:配置 Servlet(可选,根据框架需求添加) -->
<!--
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.example.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/my-servlet</url-pattern>
</servlet-mapping>
-->
</web-app>

验证转换结果

构建 WAR 包

执行打包命令,验证是否生成 .war 文件:

阅读全文 »

ELKF 日志系统:Filebeat+ELK 的轻量日志采集方案详解

ELKF(Elasticsearch + Logstash + Kibana + Filebeat)是在传统 ELK 基础上引入 Filebeat 的增强方案。由于 Logstash(基于 JVM)资源消耗较高,不适合在海量应用节点上直接部署,而 Filebeat(轻量级 Go 语言工具)能以极低的 CPU / 内存占用实现日志采集,形成 “应用日志→Filebeat 采集→Logstash 处理→Elasticsearch 存储→Kibana 可视化” 的完整链路,成为分布式系统日志管理的主流架构。

ELKF 核心架构与组件分工

ELKF 的核心价值在于解耦日志采集与处理,通过 Filebeat 实现 “轻量采集”,Logstash 实现 “复杂处理”,两者协同解决传统 ELK 在大规模部署时的资源占用问题。

架构链路图

1
2
[应用服务器]                [中间件服务器]                [存储与可视化服务器]
应用日志 → Filebeat采集 → Logstash过滤清洗 → Elasticsearch存储 → Kibana可视化

组件分工对比

组件 角色定位 核心优势 部署位置
Filebeat 日志采集器 轻量(<10MB 内存)、高可靠(断点续传) 应用服务器节点
Logstash 日志处理管道 支持 200 + 插件、复杂过滤(解析 / 脱敏 / 转换) 独立中间件集群
Elasticsearch 日志存储与检索引擎 分布式、实时索引、全文搜索 存储集群(3 + 节点)
Kibana 日志可视化平台 检索界面、仪表盘、告警配置 前端服务节点

Filebeat 核心配置与实战

Filebeat 是 ELKF 的 “入口”,负责从应用服务器采集日志并发送到 Logstash(或直接到 Elasticsearch)。其核心配置文件为filebeat.yml,需重点关注日志输入源(Inputs)输出目的地(Outputs)

1. 基础配置:采集文件日志并发送到 Logstash

阅读全文 »

分布式 Session:集群环境下的会话共享方案

在分布式集群架构中,用户会话(Session)的共享是一个绕不开的问题。当用户请求被负载均衡分发到不同服务器时,如何保证每次请求都能正确获取到对应的会话数据?本文将深入分析四种主流解决方案的原理、优缺点及适用场景,帮助开发者在实际架构中做出合理选择。

问题本质:Session 的 “单机依赖” 与集群矛盾

传统单体应用中,Session 数据存储在服务器内存中,通过浏览器 Cookie 中的JSESSIONID关联用户与会话。但在分布式集群中:

  • 同一用户的两次请求可能被分发到不同服务器;
  • 服务器本地存储的 Session 数据无法跨节点共享,导致用户频繁登录、状态丢失等问题。

因此,分布式 Session 的核心目标是:打破 Session 对单机的依赖,实现集群内会话数据的全局一致性

解决方案对比与分析

方案一:会话黏连(Session Sticky)

原理:通过负载均衡策略,将同一用户的所有请求 “黏连” 到同一台服务器(如基于JSESSIONID的哈希路由)。

实现方式

  • 负载均衡器(如 Nginx、F5)配置第 7 层(应用层)路由规则,解析 HTTP 请求中的CookieURL中的 Session 标识,将相同标识的请求转发到固定服务器。

  • 示例(Nginx 配置):

阅读全文 »

Hystrix 执行流程:从命令创建到熔断降级的全链路解析

Hystrix 作为分布式系统的容错框架,其执行流程围绕 “保护调用方资源” 和 “快速失败” 设计,通过一系列校验和判断,确保依赖服务的故障不会扩散。以下是 HystrixCommand 的完整执行流程,涵盖从命令创建到结果返回的每一步关键逻辑。

Hystrix 执行流程总览

HystrixCommand 的执行可分为8 个核心步骤,流程图如下:

1
创建HystrixCommand → 执行调用(同步/异步) → 检查熔断器状态 → 检查资源是否耗尽 → 执行run()方法 → 检查执行结果 → 更新熔断器状态 → 返回结果/触发降级

每个步骤都包含特定的校验逻辑,任何一步失败都会触发降级(fallback),确保调用方快速获得响应。

详细执行步骤解析

1. 创建 HystrixCommand 对象

将对依赖服务的调用逻辑封装到HystrixCommand(或HystrixObservableCommand)的run()方法中:

阅读全文 »

Elasticsearch 全面性能优化指南:从系统到架构

Elasticsearch 的性能表现直接取决于系统配置、数据模型和资源分配策略。本文基于实战经验,从操作系统优化、字段设计、存储策略到架构分层,详解提升 Elasticsearch 性能的核心手段,尤其适合大规模数据场景。

操作系统层优化:减少资源瓶颈

禁止 Swap 交换分区

原理:Elasticsearch 重度依赖内存(堆内存 + 文件系统缓存),若操作系统将内存数据交换到磁盘(Swap),会导致延迟飙升(从微秒级变为毫秒级)。

操作步骤

  • 临时禁用(立即生效,重启失效):

    1
    swapoff -a  # 关闭所有swap分区
  • 永久禁用(重启后生效):
    编辑 /etc/fstab,注释掉所有 swap 相关行(如 UUID=xxx swap swap defaults 0 0)。

验证

1
free -m  # 查看Swap行,total应为0

字段映射优化:减少存储与计算开销

禁用不必要的 doc_values

原理doc_values 是 Elasticsearch 为字段创建的磁盘数据结构,用于聚合、排序和脚本操作,默认开启。若字段仅用于查询(无需聚合 / 排序),禁用 doc_values 可节省 30%-50% 的磁盘空间和 IO 开销。

阅读全文 »