首页 > 其他分享 >虚拟线程实现Web服务器(处理HTTP请求)

虚拟线程实现Web服务器(处理HTTP请求)

时间:2024-10-27 13:32:09浏览次数:5  
标签:Web HTTP 请求 server 虚拟 线程 服务器

使用Java虚拟线程开发一个Web服务器可以显著提升并发能力,同时保持代码简洁。在这个示例中,我们将使用 Java 21 的虚拟线程实现一个简单的 HTTP Web 服务器,逐步解释每个部分的代码。

实现目标

  1. 通过虚拟线程处理 HTTP 请求。
  2. 创建一个简单的 Web 服务器来响应客户端请求。
  3. 适配 IO 阻塞的情况,让每个请求独占一个虚拟线程。

代码示例:Web服务器的实现

import com.sun.net.httpserver.HttpServer;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpExchange;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.util.concurrent.Executors;

public class VirtualThreadHttpServer {

    public static void main(String[] args) throws IOException {
        // 1. 创建 HTTP 服务器,绑定到本地端口 8080
        HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);

        // 2. 注册 HTTP 处理程序(Handler),处理 "/hello" 路径
        server.createContext("/hello", new HelloHandler());

        // 3. 设置线程池,使用虚拟线程处理每个请求
        server.setExecutor(Executors.newVirtualThreadPerTaskExecutor());

        // 4. 启动服务器
        server.start();
        System.out.println("Server is listening on http://localhost:8080...");
    }

    // 处理 HTTP 请求的 Handler
    static class HelloHandler implements HttpHandler {
        @Override
        public void handle(HttpExchange exchange) throws IOException {
            // 5. 设置响应头和响应体内容
            String response = "Hello, Virtual Threads!";
            exchange.sendResponseHeaders(200, response.getBytes().length);

            // 6. 将响应内容写入输出流并关闭流
            try (OutputStream os = exchange.getResponseBody()) {
                os.write(response.getBytes());
            }
        }
    }
}

代码讲解

  1. 创建 HTTP 服务器

    HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
    

    这里我们使用 com.sun.net.httpserver.HttpServer 创建一个 HTTP 服务器,并绑定到 localhost:8080 端口。第二个参数 0 表示允许的连接队列大小为默认值。

  2. 注册请求处理程序(Handler)

    server.createContext("/hello", new HelloHandler());
    

    我们通过 createContext 注册一个路径为 /hello 的处理器。当客户端访问该路径时,会触发对应的处理逻辑。

  3. 使用虚拟线程池

    server.setExecutor(Executors.newVirtualThreadPerTaskExecutor());
    

    在这里,我们使用了 虚拟线程池 来处理每个 HTTP 请求。newVirtualThreadPerTaskExecutor 是 Java 提供的一个工厂方法,能够为每个任务创建一个新的虚拟线程。

  4. 启动服务器

    server.start();
    

    服务器启动后,将开始监听客户端的 HTTP 请求。

  5. 处理 HTTP 请求

    String response = "Hello, Virtual Threads!";
    exchange.sendResponseHeaders(200, response.getBytes().length);
    

    这里我们定义了一个简单的响应消息 "Hello, Virtual Threads!",并通过 sendResponseHeaders 发送状态码 200 和响应内容长度。

  6. 输出响应内容并关闭流

    try (OutputStream os = exchange.getResponseBody()) {
        os.write(response.getBytes());
    }
    

    将响应内容写入 HttpExchange 的输出流,并在完成后自动关闭流。


如何运行

  1. 确保你使用的是 Java 21 及以上版本。
  2. 将上述代码保存为 VirtualThreadHttpServer.java
  3. 编译并运行:
    javac VirtualThreadHttpServer.java
    java VirtualThreadHttpServer
    
  4. 打开浏览器访问:http://localhost:8080/hello,你会看到如下输出:
    Hello, Virtual Threads!
    

虚拟线程的优势

  1. 处理大量并发请求:每个请求都有自己的虚拟线程,避免了传统线程池的限制,支持上万甚至更多的并发连接。
  2. 简化代码:通过虚拟线程,异步逻辑可以用同步的方式编写,无需复杂的回调或 CompletableFuture
  3. 低资源消耗:虚拟线程非常轻量级,不会像系统线程一样占用大量内存。

扩展功能建议

  • 日志记录:添加请求日志,记录每次访问的路径和时间。
  • 异步数据库访问:处理请求时查询数据库并返回结果。
  • REST API:实现更多的 HTTP 处理程序来支持不同的 REST API 请求。

这个示例展示了虚拟线程如何简化 Web 服务器的开发,并在高并发场景下提供优异的性能。

标签:Web,HTTP,请求,server,虚拟,线程,服务器
From: https://www.cnblogs.com/zhangboling/p/18508197

相关文章

  • Spring Boot 应用使用虚拟线程来并行处理REST请求
    在Java中,虚拟线程(VirtualThreads)是JDK19引入的预览功能,并在JDK21中正式发布。SpringBoot从3.2版本开始支持虚拟线程,可以有效提升并发性能。下面我详细讲解如何在SpringBoot应用中使用虚拟线程并行处理REST请求。一、虚拟线程简介传统Java应用使用操作系统......
  • 虚拟线程一般应用在哪些场景
    虚拟线程(VirtualThreads)是Java21引入正式发布的特性之一,它极大简化了并发编程,特别适合高并发应用场景。与传统的操作系统线程相比,虚拟线程轻量级且数量可以大幅增加,因此在某些业务需求中具有优势。以下是常见的虚拟线程应用场景:1.高并发的IO密集型应用虚拟线程非常适合处理......
  • C#线程详解及应用示例
     简介在编写应用程序实现业务功能过程中,为解决吞吐量和响应效率的问题,我们会用到多线程、异步编程两项重要的技术。通过它们来提高应用程序响应和高效。应用程序每次运行都会启动一个进程(进程是一种正在执行的程序),而进程中可以包含一个或多个线程,由应用程序入口直接或间接执......
  • Webpack和打包过程
    node中的内置模块pathpath常见的API在webpack中的使用认识webpack脚手架依赖webpackWebpack到底是什么呢?Webpack的安装Webpack的默认打包创建局部的webpackWebpack配置文件指定配置文件......
  • 557.清新的化妆品响应式网页 大学生期末大作业 Web前端网页制作 html+css+js
    目录一、网页概述二、网页文件 三、网页效果四、代码展示1.html2.CSS3.JS五、总结1.简洁实用2.使用方便3.整体性好4.形象突出5.交互式强六、更多推荐欢迎光临仙女的网页世界!这里有各行各业的Web前端网页制作的案例,样式齐全新颖,并持续更新!感谢CSDN,提供了这......
  • 使用HTTP头进行403绕过 速率绕过 Rate Limit Bypass
    原理某些服务可能根据HTTP头部的信息(如User-Agent、X-Forwarded-For等)来识别用户。如果服务器未正确验证这些头部,攻击者可通过伪造这些头部来绕过限制。使用HTTP头进行403绕过速率绕过RateLimitBypassHTTPHeaders列表CACHE_INFO:127.0.0.1CF_CONNECTING_IP:127.0.0.1......
  • kube-prometheus-stack 自定义 alertmanager 配置推送webhook
    创建AlertmanagerConfig资源在没有使用prometheus-operator的情况下,需要手动配置alertmanager.yaml来路由&发送从prometheus接收的警报。使用prometheus-operator之后,事情变得简单一些。只需要创建AlertmanagerConfig资源,prometheus-operator会自动merge所有的Ale......
  • JAVA毕设2533基于web的电影购票系统的设计与实现
    项目包含:源码,文档,讲解视频运行环境:推荐jdk1.8开发工具:Eclipse、MyEclipe以及idea(推荐)操作系统:windows108G内存以上(其他windows)浏览器:GoogleChrome(推荐)、Edge、360浏览器;数据库:MySQL5.7;数据库可视化工具:NavicatPremium推荐)以及其他Navicat版本tomcat:6.0或以上......
  • jsp ssm 校园新闻管理系统 新闻发布系统 news 项目源码 web java
    一、项目简介本项目是一套基于SSM的校园新闻管理系统,主要针对计算机相关专业的和需要项目实战练习的Java学习者。包含:项目源码、数据库脚本、软件工具等。项目都经过严格调试,确保可以运行!二、技术实现​后端技术:Spring、SpringMVC、MyBatis前端技术:JSP、HTML、CSS、Ja......
  • jsp ssm 智能图书馆图书推荐系统 图书管理 项目源码 web java
    一、项目简介本项目是一套基于SSM的智能图书馆图书推荐系统,主要针对计算机相关专业的和需要项目实战练习的Java学习者。包含:项目源码、数据库脚本、软件工具等。项目都经过严格调试,确保可以运行!二、技术实现​后端技术:Spring、SpringMVC、MyBatis前端技术:JSP、HTML、C......