栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

四种方法实现http服务

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

四种方法实现http服务

前言:对于微服务来说,如果我们要实现一个web服务,
大部分人可能直接用springboot的spring-boot-starter-web了。
我们知道spring-boot-starter-web默认实现是tomcat,当然你也可以选择其他服务器类型,比如Jetty、Undertow等。
但是如果是一个非springboot项目,该如何实现呢?

这里介绍了下四种实现方式,基于Tomcat、Jetty、JdkHttp、Netty实现内嵌web容器。

Tomcat

依赖的maven坐标:

 javax.annotationjavax.annotation-apiorg.apache.tomcat.embedtomcat-embed-coretomcat-annotations-apiorg.apache.tomcat

首先看下初始化启动的代码:

Tomcat tomcatServer = new Tomcat();
//静默方式启动
tomcatServer.setSilent(true);

tomcatServer.setPort(8080);
//是否设置自动部署
tomcatServer.getHost().setAutoDeploy(false);
//创建上下文,拿到上下文后就可以设置整个访问地址了
StandardContext standardContext = new StandardContext();
standardContext.setPath(CONTEX_PATH);
//监听上下文
standardContext.addLifecycleListener(new Tomcat.FixContextListener());
// tomcat容器添加standardContext 添加整个context
tomcatServer.getHost().addChild(standardContext);
// 创建servlet   servlet的名字叫IndexServlet
tomcatServer.addServlet(CONTEX_PATH, SERVLET_NAME, new JdkSimpleDispatchServlet());
// 添加servleturl映射
standardContext.addServletMappingDecoded("
     if (is100ContinueExpected(req)) {
  ctx.write(new DefaultFullHttpResponse(
   HttpVersion.HTTP_1_1,
   HttpResponseStatus.CONTINUE));
     }
     // 获取请求的uri
     String path = req.uri();
    
     // 响应请求
     fireResponse(ctx, HttpResponseStatus.OK,
      "hello", "text/html; charset=utf-8");

 }

 private void fireResponse(ChannelHandlerContext ctx, HttpResponseStatus httpResponseStatus, String resp, String contentType) {
     FullHttpResponse responseDown = new DefaultFullHttpResponse(
      HttpVersion.HTTP_1_1,
      httpResponseStatus,
      Unpooled.copiedBuffer(resp, Charset.defaultCharset()));
     responseDown.headers().set(HttpHeaderNames.CONTENT_TYPE, contentType);
     ctx.writeAndFlush(responseDown).addListener(ChannelFutureListener.CLOSE);
 }
    }

}

从上面代码可以得知,Netty默认就提供了http编解码和协议的实现,非常方便。

JdkHttp

最好介绍下不依赖第三方实现,使用JDK8内置的Http Server实现。

HttpServer类

核心类HttpServer,HttpServer是属于rt包的类,需要下载rt包的源码,配置到IDEA。或者直接使用openjdk,也可以查看到源码。

rt包可以下载OpenJDK的源码,download.java.net/openjdk/jdk8/promoted/b132/openjdk-8-src-b132-03_mar_2014.zip

HttpServer源码:

package com.sun.net.httpserver;
@Exported
public abstract class HttpServer {
    protected HttpServer() {
    }
    public static HttpServer create() throws IOException {
 return create((InetSocketAddress)null, 0);
    }
    public static HttpServer create(InetSocketAddress var0, int var1) throws IOException {
 HttpServerProvider var2 = HttpServerProvider.provider();
 return var2.createHttpServer(var0, var1);
    }
    public abstract void bind(InetSocketAddress var1, int var2) throws IOException;
    public abstract void start();
    public abstract void setExecutor(Executor var1);
    public abstract Executor getExecutor();
    public abstract void stop(int var1);
    public abstract HttpContext createContext(String var1, HttpHandler var2);
    public abstract HttpContext createContext(String var1);
    public abstract void removeContext(String var1) throws IllegalArgumentException;
    public abstract void removeContext(HttpContext var1);
    public abstract InetSocketAddress getAddress();
}

初始化Http服务:

public class JDKHttpServerHealthCheckServer implements IHealthCheckServer {
    HttpServer server;

    @Override
    public void start() {
 try {
     // 初始化监听
     server = HttpServer.create(new InetSocketAddress(8080), 100);
     // 注册http请求处理类
     server.createContext("/", new JdkHttpHandler());
     // 启动服务
     server.start();
 } catch (Exception e) {
     return;
 }
    }

    @Override
    public void stop() {
 if (server != null) {
     server.stop(0);
 }
    }

    static class JdkHttpHandler implements HttpHandler {
 @Override
 public void handle(HttpExchange httpExchange) throws IOException {
     String path = httpExchange.getRequestURI() == null ? "/" : httpExchange.getRequestURI().getPath();

     try {
  CharArrayWriter charArrayWriter = new CharArrayWriter();
  charArrayWriter.write("hello");
  httpExchange.getResponseHeaders().add("Content-Type", "text/plain; charset=utf-8");
  // 这里必须指定字节大小,因为默认是固定大小的编码解码实现
  httpExchange.sendResponseHeaders(200, charArrayWriter.size());
  outputStream.write(charArrayWriter.toString().getBytes());
   
     } catch (Exception e) {
  httpExchange.sendResponseHeaders(500, 0);
     }
 }
    }
}

从上面四个实现来看,对http servlet规范支持比较完善的有Jetty、Tomcat。性能高的是Netty,实现最简单的是JDK默认HttpServer。

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号