0%

springboot注册servlet

有时候在springboot中依然需要注册servlet,filter,listener,就以servlet为例来进行说明,另外两个也都类似

使用@WebServlet注解

在servlet3.0之后,servlet注册支持注解注册,而不需要在web.xml中进行配置,类似的,对于Filter使用@WebFilter注解,对于Listener使用@WebListener注解

1
2
3
4
5
6
7
8
9
10
11
12
13
@WebServlet(name = "helloWorldServlet",urlPatterns = "/helloWorldServlet",
initParams = {
@WebInitParam(name = "name",value = "张三")
})
public class HelloWorldServlet extends HttpServlet {

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = getServletConfig().getInitParameter("name");
System.out.println("helloWorldServlet ---- doPost");
resp.getOutputStream().println(name);
}
}
阅读全文 »

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有四种类型的过滤器

  • pre 请求被路由之前执行,可以进行限流、身份验证、鉴权、参数检验、请求转发,用于设置RequestContext中的数据,以供下游的过滤器使用
  • route 路由后,微服务调用前执行,用来发送请求给其他微服务,大部分工作为转换请求和响应数据
  • post 在route和error之后执行,可以用来给响应添加头信息、收集统计信息和指标、将响应从微服务发送给客户端
  • error 处理发生错误时调用
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
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
try {
init((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse);
try {
preRouting();
} catch (ZuulException e) {
error(e);
postRouting();
return;
}

// Only forward onto to the chain if a zuul response is not being sent
if (!RequestContext.getCurrentContext().sendZuulResponse()) {
filterChain.doFilter(servletRequest, servletResponse);
return;
}

try {
routing();
} catch (ZuulException e) {
error(e);
postRouting();
return;
}
try {
postRouting();
} catch (ZuulException e) {
error(e);
return;
}
} catch (Throwable e) {
error(new ZuulException(e, 500, "UNCAUGHT_EXCEPTION_FROM_FILTER_" + e.getClass().getName()));
} finally {
RequestContext.getCurrentContext().unset();
}
}
阅读全文 »