基于Netty自己动手实现Web框架
上节课我们自己动手制作了一个RPC框架,本节课我们挑战一个稍有难度的一点的任务,手动制作一个Web框架。 我不太愿意叫什么MVC框架,因为我在制作这个小项目的时候可没想过它要怎么怎么的MVC,一切皆以易于使用为目标。
首先我们看看这个Web框架使用起来如何简单
Hello World
import httpkids.server.KidsRequestDispatcher;
import httpkids.server.Router;
import httpkids.server.internal.HttpServer;public class HelloWorld {public static void main(String[] args) {var rd = new KidsRequestDispatcher("/kids", new Router((ctx, req) -> {ctx.html("Hello, World");}));new HttpServer("localhost", 8080, 2, 16, rd).start();}}http://localhost:8080/kids
复制代码
KidsRequestDispatcher
是请求派发器,用于将收到的HTTP请求对象扔给响应的RequestHandler
进行处理。 Router
用于构建路由,它负责的是将URL规则和RequestHandler
挂接起来,形成一个复杂的映射表。
Router
为了简化实现细节,所以没有支持复杂的URL规则,例如像RESTFUL
这种将参数写在URL里面的这种形式是不支持的。
HttpServer
是Web服务器的核心对象,构建HttpServer除了IP端口之外,还需要提供3个关键参数,分别是IO线程数、业务线程数和请求派发器对象。IO线程用于处理套件字读写,由Netty内部管理。业务线程专门用于处理HTTP请求,由httpkids框架来管理。
一个全面的例子
import java.util.HashMap;import httpkids.server.KidsRequestDispatcher;
import httpkids.server.Router;
import httpkids.server.internal.HttpServer;public class HelloWorld {public static void main(String[] args) {var router = new Router((ctx, req) -> {ctx.html("Hello, World"); // 纯文本html}).handler("/hello.json", (ctx, req) -> {ctx.json(new String[] { "Hello", "World" }); // JSON API}).handler("/hello", (ctx, req) -> {var res = new HashMap<String, Object>();res.put("req", req);ctx.render("playground.ftl", res); // 模版渲染}).handler("/world", (ctx, req) -> {ctx.redirect("/hello"); // 302跳转}).handler("/error", (ctx, req) -> {ctx.abort(500, "wtf"); // 异常}).resource("/pub", "/static") // 静态资源.child("/user", () -> { // 路由嵌套return new Router((ctx, req) -> {ctx.html("Hello, World");}).handler("/hello.json", (ctx, req) -> {ctx.json(new String[] { "Hello", "World" });}).filter((ctx, req, before) -> { // 过滤器、拦截器if (before) {System.out.printf("before %s\n", req.path());} else {System.out.printf("after %s\n", req.path());}return true;});});var rd = new KidsRequestDispatcher("/kids", router); // 请求派发器rd.templateRoot("/tpl"); // 模版classpath根目录rd.exception(500, (ctx, e) -> { // 异常处理ctx.html("what the fuck it is", 500);}).exception((ctx, e) -> { // 通用异常处理ctx.html("mother fucker!", e.getStatus().code());});var server = new HttpServer("localhost", 8080, 2, 16, rd);server.start();Runtime.getRuntime().addShutdownHook(new Thread() {public void run() {server.stop(); // 优雅停机}}); }}http://localhost:8080/kids
http://localhost:8080/kids/hello
http://localhost:8080/kids/hello.json
http://localhost:8080/kids/world
http://localhost:8080/kids/error
http://localhost:8080/kids/pub/bootstrap.min.css
http://localhost:8080/kids/user
http://localhost:8080/kids/user/hello
复制代码
堆栈深度
非Java程序员总是抱怨Java的框架过于复杂,特别爱拿Java恐怖的调用栈说事。比如下面这张图广为流传。
所以这里我要亮出httpkids的调用栈,我们来看看它到底有多深
项目代码
HttpKids Web Framework based on Netty for Kids of You
RpcKids RPC Framework based on Netty for Kids of You
大爆炸
关注公众号「码洞」,让我们来一起学习一下这个框架的设计与实现。
基于Netty自己动手实现Web框架相关推荐
- 大厨小鲜——基于Netty自己动手实现RPC框架
今天我们要来做一道小菜,这道菜就是RPC通讯框架.它使用netty作为原料,fastjson序列化工具作为调料,来实现一个极简的多线程RPC服务框架. 我们暂且命名该RPC框架为rpckids. 食用 ...
- 大厨小鲜——基于Netty自己动手编写RPC框架
今天我们要来做一道小菜,这道菜就是RPC通讯框架.它使用netty作为原料,fastjson序列化工具作为调料,来实现一个极简的多线程RPC服务框架. 我们暂且命名该RPC框架为rpckids. 食用 ...
- php7 开发框架,Lin是一套基于php7.2的全新web框架
Lin/1.0 介绍 Lin是一套基于php7.2的全新web框架,它具有一套全组件化的开发理念,避免了以往web框架可定制性差.扩展开发繁杂.布局耦合度较高等缺点,完美实现了三重分离:应用层.框架层 ...
- 转-基于NodeJS的14款Web框架
基于NodeJS的14款Web框架 2014-10-16 23:28 作者: NodeJSNet 来源: 本站 浏览: 1,399 次阅读 我要评论暂无评论 字号: 大 中 小 摘要: 在几年的时间里 ...
- 2、基于wsgiref模块DIY一个web框架
一 web框架 Web框架(Web framework)是一种开发框架,用来支持动态网站.网络应用和网络服务的开发.这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方 ...
- Fen - 基于deno的简单Typescript Web框架
deno 从诞生,到现在有自己的标准库,以及一些第三方库,让我对deno在web的应用有了一定的兴趣, 我知道deno尚未成熟,但是刚好最近心闲下来了,就找点事做做,作为一个前端,我也期待通过这个机会 ...
- [源码和文档分享]基于Netty和WebSocket的Web聊天室
一.背景 伴随着Internet的发展与宽带技术的普及,人们可以通过Internet交换动态数据,展示新产品,与人进行沟通并进行电子商务贸易.作为构成网站的重要组成部分,留言管理系统为人们的交流提供了 ...
- web框架总结(django、flask)
1.MVC解读 M:Model,模型,和数据库进行交互 V:View,视图,负责产生Html页面 C:Controller,控制器,接收请求,进行处理,与M和V进行交互,返回应答. 1.用户点击注 2 ...
- python微型web框架flask介绍
Flask是一个基于python的,微型web框架.之所以被称为微型是因为其核心非常简单,同时具有很强的扩展能力.它几乎不给使用者做任何技术决定. 安装flask时应该注意其必须的几个支持包比如Jin ...
- [Python web开发] Web框架开发基础 (一)
Python WEB框架 WSGI,WEB Server Gateway Interface,可以看做是一种底层协议,它规定了服务器程序和应用程序各自实现上面接口.Python的实现称为wsgiref ...
最新文章
- python3 异步错误 asyncio.Semaphore RuntimeError: Task got Future attached to a different loop
- 中国光纤管理解决方案市场发展分析及十四五规划咨询建议报告2022年版
- 130506datafile和tablespace offline区别
- SpringBatch tasklet实现和用法(十)
- excel进销存管理系统_通用Excel助力企业定制开发信息化系统常用功能模块
- 如何设置wiki权限
- mysql时间聚合_11.MySQL数值、日期和时间、信息、聚合函数
- vue-resource安装
- Python解决 Cannot uninstall 'pyparsing' 问题
- Mybatis判断表是否存在
- GOOGLE 分布式系统关键技术论文分析
- Linux指令--touch
- conda环境内安装gcc4.8.5(无root权限)
- [渝粤教育] 广东-国家-开放大学 21秋期末考试管理学原理★10013k1
- java计算机毕业设计共享充电宝管理系统演示录像2021MyBatis+系统+LW文档+源码+调试部署
- python 捕捉热键
- 多任务让你走得更慢(很好,转自infoq)
- 女篮亚军,为啥男篮那么水?
- 2022年秋招提前批总结(海尔智家)
- 2016天善智能交流会第22场: R语言为量化而生