0%

Spring Boot 注册 Servlet 详解:三种核心方式与实战对比

在 Spring Boot 中,虽然推荐使用 Spring MVC 的 @Controller 处理请求,但在集成传统 Servlet、Filter、Listener(如第三方组件)时,仍需手动注册这些 Servlet 规范组件。从 “@WebServlet 注解→ServletRegistrationBean→动态注册(ServletContextInitializer)” 三个维度,系统讲解 Spring Boot 注册 Servlet 的完整流程,并对比三种方式的适用场景,帮你灵活应对传统组件集成需求。

Servlet 注册的核心背景

Servlet 是 Java EE 规范的核心组件,用于处理 HTTP 请求,传统 Java Web 项目通过 web.xml 配置 Servlet(如 <servlet><servlet-mapping> 标签)。Spring Boot 摒弃了 web.xml,提供了三种更简洁的注册方式,本质都是通过 “编程式配置” 替代 XML 配置,适配嵌入式容器(如 Tomcat)和外置容器。

方式一:@WebServlet 注解(Servlet 3.0+ 原生支持)

Servlet 3.0 规范引入了注解式注册(@WebServlet@WebFilter@WebListener),Spring Boot 支持该规范,只需通过 @ServletComponentScan 开启扫描,即可自动注册标注 @WebServlet 的类。

1. 核心步骤

(1)编写 Servlet 类并标注 @WebServlet
阅读全文 »

ShardingSphere-JDBC读写分离

sharding-jdbc会通过sql语句进行语义分析,如果是insert、update、delete语句会路由到master库进行操作,如果是select语句会路由到slave库进行操作

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
spring:
application:
name: sharding-jdbc-test
shardingsphere:
datasource:
names: m0,s0 # 配置数据源,给数据源起名
m0: # 主库,配置数据源具体内容,连接池、驱动、地址、用户名、密码
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis?useSSL=false
username: root
password: 123456
s0: # 从库,配置数据源具体内容,连接池、驱动、地址、用户名、密码
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis1?useSSL=false
username: root
password: 123456
# sharding: # 方式一
# master-slave-rules:
# m0:
# master-data-source-name: m0 #配置m0数据库的主库
# slave-data-source-names: s0 #配置m0数据库的从库
masterslave: # 方式二
name: ms
master-data-source-name: m0
slave-data-source-names: s0
load-balance-algorithm-type: round_robin
props:
sql:
show: true # 输出日志

ShardingSphere-Proxy简介

透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持。 目前提供 MySQL 和 PostgreSQL 版本,它可以使用任何兼容 MySQL/PostgreSQL 协议的访问客户端(如:MySQL Command Client,MySQL Workbench,Navicat 等)操作数据,对 DBA 更加友好。

  • 对应用程序完全透明,可直接当做 MySQL/PostgreSQL 使用
  • 适用于任何兼容 MySQL/PostgreSQL 协议的的客户端

与Sharding-JDBC不同的是,Sharding-Proxy是一个独立的应用,相当于是将Sharding-JDBC中的配置抽离到Sharding-Proxy进行配置

在conf/server.yaml配置文件中配置数据库的认证信息(用户名,密码)以及数据库的共用属性

在conf/config-sharding.yaml配置文件中配置分库分表的配置,与sharding-jdbc配置相似

在conf/config-master_slave.yaml配置文件中配置读写分离配置

Mycat配置水平垂直拆分

垂直拆分分库

配置schema.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
30
31
32
33
34
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

<!-- 逻辑库 -->
<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
<!-- order表在dn2上 -->
<table name="order" dataNode="dn2"/>
</schema>

<!-- 数据节点,真实的数据库 -->
<dataNode name="dn1" dataHost="host1" database="mybatis" />
<dataNode name="dn2" dataHost="host2" database="mybatis" />

<dataHost name="host1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<!-- 心跳检测 -->
<heartbeat>select user()</heartbeat>
<!-- 写主机 -->
<writeHost host="hostM1" url="localhost:3306" user="root"
password="123456">
</writeHost>
</dataHost>

<dataHost name="host2" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<!-- 心跳检测 -->
<heartbeat>select user()</heartbeat>
<!-- 写主机 -->
<writeHost host="hostM2" url="localhost:3307" user="root"
password="123456">
</writeHost>
</dataHost>
</mycat:schema>
阅读全文 »

Zuul 过滤器:请求生命周期的全方位管控

Zuul 的核心能力源于其灵活的过滤器机制,通过在请求处理的不同阶段插入自定义逻辑,实现对请求的路由、校验、监控等全方位管控。Zuul 将过滤器分为四类,分别对应请求生命周期的不同阶段,共同构成了网关的核心扩展点。

Zuul 过滤器的四种类型

Zuul 过滤器按执行时机可分为pre、route、post、error四类,覆盖了请求从进入网关到返回响应的全流程:

过滤器类型 执行阶段 典型应用场景
pre 请求被路由到微服务之前执行 身份认证(如 Token 校验)、参数校验、限流、请求转发、设置上下文变量等。
route 请求被路由到微服务过程中执行 处理请求转发逻辑(如选择具体服务实例、修改请求参数 / 头信息、适配不同协议)。
post 请求被微服务处理之后执行 统一添加响应头、收集监控指标(如响应时间)、日志记录、结果二次处理等。
error 上述任一阶段发生异常时执行 统一错误处理(如转换异常为标准响应格式)、记录错误日志、触发降级等。

过滤器的执行流程

Zuul 过滤器的执行顺序由filterOrder()(数值越小越先执行)和类型共同决定,核心流程如下:

阅读全文 »