• Stars
    star
    130
  • Rank 277,575 (Top 6 %)
  • Language
    Java
  • Created over 7 years ago
  • Updated over 6 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

手写简化版Web服务器

手写简化版Web服务器(包括HTTP服务器和Servlet容器)

具备的功能(均为简化版的实现):

  • HTTP Protocol
  • Servlet
  • ServletContext
  • Request
  • Response
  • Dispatcher
  • Static Resources & File Download
  • Error Notification
  • Get & Post & Put & Delete
  • web.xml parse
  • Forward
  • Redirect
  • Simple TemplateEngine
  • session
  • cookie
  • filter
  • listener

使用技术

基于Java BIO/NIO/AIO、多线程、Socket网络编程、XML解析、log4j/slf4j日志 基于Spring的PathMatcher实现SpringMVC风格的路径匹配

打包

  • 必须使用maven的assembly插件,它可以把依赖的jar包打进来并且解压
  • 需要指定resources/webapp等,把除了源码之外的资源文件包含进来
  • class.getResource方法不推荐使用,因为在jar包中的文件路径是有空格的,但是getResource方法得到的是URL,是没有空格的。如果一定要在jar包中使用getResource,那么必须将URL中的文件路径中的%20替换为空格getClass().getResource("/a.txt").getPath().replaceAll("%20", " ")
  • 或者直接使用getResourceAsStream方法,可以避免这个问题

BIO

一个Acceptor阻塞式获取socket连接,然后线程池阻塞式等待socket读事件,处理业务逻辑,最后写回 每个HTTP连接结束后由客户端关闭TCP连接

NIO Reactor

多个(1个或2个)Acceptor阻塞式获取socket连接,然后多个Poller(处理器个数个)非阻塞式轮询socket读事件,检测到读事件时将socket交给线程池处理业务逻辑 实现HTTP的keep-alive(复用socket连接)

image

未来希望添加的功能:

  • 手写WebSocket服务器,实现HTTP长连接
  • 实现AsyncServlet
  • 实现多应用隔离,自定义类加载器体系

另附CSDN相关博客

http://blog.csdn.net/songxinjianqwe/article/details/75670552

AIO

实现一个AIO版本

压力测试

BIO

使用JMeter进行压力测试:connection:close 以下测试总请求次数都为20000次

2个线程,每个线程循环访问10000次,吞吐量为556个请求/sec,平均响应时间为3ms 20个线程,每个线程循环访问1000次,吞吐量为650个请求/sec,平均响应时间为22ms 200个线程,每个线程循环访问100次,吞吐量为644个请求/sec,平均响应时间为209ms 1000个线程,每个线程循环访问20次,吞吐量为755个请求/sec,平均响应时间为774ms

NIO

使用JMeter进行压力测试:connection:keep-alive 以下测试总请求次数都为20000次

2个线程,每个线程循环访问10000次,吞吐量为559个请求/sec,平均响应时间为2ms 20个线程,每个线程循环访问1000次,吞吐量为651个请求/sec,平均响应时间为21ms 200个线程,每个线程循环访问100次,吞吐量为659个请求/sec,平均响应时间为201ms 1000个线程,每个线程循环访问20次,吞吐量为503个请求/sec,平均响应时间为1396ms

AIO

使用JMeter进行压力测试:connection:keep-alive 以下测试总请求次数都为20000次

2个线程,每个线程循环访问10000次,吞吐量为633个请求/sec,平均响应时间为2ms 20个线程,每个线程循环访问1000次,吞吐量为764个请求/sec,平均响应时间为16ms 200个线程,每个线程循环访问100次,吞吐量为738个请求/sec,平均响应时间为170ms 1000个线程,每个线程循环访问20次,吞吐量为704个请求/sec,平均响应时间为677ms,但有接近20%的错误率,错误信息是connection refused

More Repositories

1

Chat

Java NIO+多线程实现聊天室
Java
775
star
2

EShop-SOA

EShop基于Dubbo实现SOA服务化拆分,并基于RocketMQ解决了分布式事务(新版SpringBootSOASkeleton)
Java
66
star
3

deployment-controller

基于Fabric8模拟Kubernetes的Deployment实现一个Controller
Java
64
star
4

toy-rpc

Java基于Netty,Protostuff和Zookeeper实现分布式RPC框架
Java
55
star
5

JavaWebSkeleton

集成了SpringMVC、Spring、MyBaits、MyBatis Generator、MyBatis PageHelper、Druid、Lombok、JWT、Spring Security、JavaMail、Thymeleaf(emailTemplate)、RestTemplate、FileUpload、Spring Scheduler、Hibernate Validator、Redis、Spring Async、Spring Cache、Swagger、Spring Test、Lombok,REST风格的接口的Web项目
Java
35
star
6

SpringBootSOASkeleton

基于Dubbo实现的SOA分布式(没有实现分布式事务)---SpringBoot整合各种组件的JavaWeb脚手架
Java
24
star
7

SpringDataRedis

SpringData与Redis整合示例
Java
20
star
8

SpringBootDistributedSkeleton

分布式,支持各种组件集群----SpringBoot整合各种组件的JavaWeb脚手架
Java
11
star
9

Mini-Rest

简化版Spring IOC+AOP+MVC
Java
9
star
10

capsule-demo-app

使用Docker/Kubernetes部署一个MySQL+Redis+SpringBoot应用
Java
9
star
11

SpringBootCentralizedSkeleton

AllInOne---SpringBoot整合各种组件的JavaWeb脚手架
Java
9
star
12

EShop-Frontend

数字产品售卖系统Vue客户端部分
Vue
8
star
13

DataStructures

常见的数据结构与算法,Java语言实现
Java
5
star
14

EShop-Backend

数字产品售卖系统Java服务器部分(新版的SpringBootSkeleton)
Java
5
star
15

capsule

Capsule is a simplified OCI implementation, just for learning container techniques.
Go
3
star
16

HotelReservationSystem

酒店预定系统后端部分
Java
2
star
17

DesignPattern

23种设计模式的实例代码
Java
1
star
18

iCache

手写Java本地缓存组件
Java
1
star
19

JavaNIOTest

JavaNIO练习代码
Java
1
star
20

ALU

使用Java模拟ALU
Java
1
star
21

litebase

A Simple Relational DataBase Implementation, just for learning MySQL & DataBase Concepts
Java
1
star