0%

tomcat嵌入式

Tomcat7开始支持嵌入式功能,增加了一个启动类org.apache.catalina.startup.Tomcat

先来看个例子

示例

示例一:映射servlet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void main(String[] args) throws LifecycleException {
Tomcat tomcat = new Tomcat();
Context context = tomcat.addContext("/test",null);
Tomcat.addServlet(context, "helloServlet", new HttpServlet() {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
res.getWriter().write("Hello World!!!");
}
});
context.addServletMappingDecoded("/hello","helloServlet");
tomcat.init();
tomcat.start();
// 阻塞主程序结束
tomcat.getServer().await();
}

访问127.0.0.1:8080/test/hello即可

阅读全文 »

副本管理器

kafka中的副本机制使得整个集群只要保证至少有一个副本存活就不会影响整个集群的工作,大大提高了kafka集群的可用性。

在所有副本节点中,有一个节点作为Leader负责接收客户端的读写操作,其他副本节点作为Follower从Leader节点复制数据进行数据同步

ReplicaManager副本管理器负责对副本管理,主要包括对控制器发送的StopReplicaRequest、UpdateMetadataRequest、以及LeaderAndIsrRequest进行处理,维护副本ISR变化以及Follower与Leader数据同步的管理

阅读全文 »

性能调优

性能测试

负载测试

阅读全文 »

同步方式

除了使用wait()/notify()来实现同步之外,在java.util.concurrent包中还有几种进行同步的方式,如信号量、屏障、闭锁和交换器。

阅读全文 »

性能优化

有几个与性能关系密切的属性

执行器调优

1
2
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4" maxIdleTime="60000"/>

Executor代表的是tomcat中的线程池,可以由其他组件共享使用,是Service元素的内嵌元素

  • maxThreads:指定Connector创建的请求处理线程的最大数目。该属性决定了可以并行处理的请求最大数目,即并发上限。当并发请求数超过maxThreads时,多余的请求只能排队等待,默认200
  • minSpareThreads:Tomcat允许的空闲线程的最小数目,也是启动时Connector创建的线程数目。如果空闲线程数小于该值,Tomcat将创建新的线程。默认25
  • maxIdleTime:一个线程空闲多久算是空闲线程,默认60000
  • maxQueueSize 最大等待队列,超过则拒绝
  • prestartminSpareThreads 是否启动时即生成minSpareThreads个线程,默认为true
  • namePrefix 线程名称前缀

注意配置后要在Connector节点中使用对应的executor才会生效

1
2
3
4
><Connector executor="tomcatThreadPool" port="8082" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" relaxedPathChars="|{}[],%"
relaxedQueryChars="|{}[],%"/>
阅读全文 »