上节课我们自己动手制作了一个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框架相关推荐

  1. 大厨小鲜——基于Netty自己动手实现RPC框架

    今天我们要来做一道小菜,这道菜就是RPC通讯框架.它使用netty作为原料,fastjson序列化工具作为调料,来实现一个极简的多线程RPC服务框架. 我们暂且命名该RPC框架为rpckids. 食用 ...

  2. 大厨小鲜——基于Netty自己动手编写RPC框架

    今天我们要来做一道小菜,这道菜就是RPC通讯框架.它使用netty作为原料,fastjson序列化工具作为调料,来实现一个极简的多线程RPC服务框架. 我们暂且命名该RPC框架为rpckids. 食用 ...

  3. php7 开发框架,Lin是一套基于php7.2的全新web框架

    Lin/1.0 介绍 Lin是一套基于php7.2的全新web框架,它具有一套全组件化的开发理念,避免了以往web框架可定制性差.扩展开发繁杂.布局耦合度较高等缺点,完美实现了三重分离:应用层.框架层 ...

  4. 转-基于NodeJS的14款Web框架

    基于NodeJS的14款Web框架 2014-10-16 23:28 作者: NodeJSNet 来源: 本站 浏览: 1,399 次阅读 我要评论暂无评论 字号: 大 中 小 摘要: 在几年的时间里 ...

  5. 2、基于wsgiref模块DIY一个web框架

    一 web框架 Web框架(Web framework)是一种开发框架,用来支持动态网站.网络应用和网络服务的开发.这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方 ...

  6. Fen - 基于deno的简单Typescript Web框架

    deno 从诞生,到现在有自己的标准库,以及一些第三方库,让我对deno在web的应用有了一定的兴趣, 我知道deno尚未成熟,但是刚好最近心闲下来了,就找点事做做,作为一个前端,我也期待通过这个机会 ...

  7. [源码和文档分享]基于Netty和WebSocket的Web聊天室

    一.背景 伴随着Internet的发展与宽带技术的普及,人们可以通过Internet交换动态数据,展示新产品,与人进行沟通并进行电子商务贸易.作为构成网站的重要组成部分,留言管理系统为人们的交流提供了 ...

  8. web框架总结(django、flask)

    1.MVC解读 M:Model,模型,和数据库进行交互 V:View,视图,负责产生Html页面 C:Controller,控制器,接收请求,进行处理,与M和V进行交互,返回应答. 1.用户点击注 2 ...

  9. python微型web框架flask介绍

    Flask是一个基于python的,微型web框架.之所以被称为微型是因为其核心非常简单,同时具有很强的扩展能力.它几乎不给使用者做任何技术决定. 安装flask时应该注意其必须的几个支持包比如Jin ...

  10. [Python web开发] Web框架开发基础 (一)

    Python WEB框架 WSGI,WEB Server Gateway Interface,可以看做是一种底层协议,它规定了服务器程序和应用程序各自实现上面接口.Python的实现称为wsgiref ...

最新文章

  1. python3 异步错误 asyncio.Semaphore RuntimeError: Task got Future attached to a different loop
  2. 中国光纤管理解决方案市场发展分析及十四五规划咨询建议报告2022年版
  3. 130506datafile和tablespace offline区别
  4. SpringBatch tasklet实现和用法(十)
  5. excel进销存管理系统_通用Excel助力企业定制开发信息化系统常用功能模块
  6. 如何设置wiki权限
  7. mysql时间聚合_11.MySQL数值、日期和时间、信息、聚合函数
  8. vue-resource安装
  9. Python解决 Cannot uninstall 'pyparsing' 问题
  10. Mybatis判断表是否存在
  11. GOOGLE 分布式系统关键技术论文分析
  12. Linux指令--touch
  13. conda环境内安装gcc4.8.5(无root权限)
  14. [渝粤教育] 广东-国家-开放大学 21秋期末考试管理学原理★10013k1
  15. java计算机毕业设计共享充电宝管理系统演示录像2021MyBatis+系统+LW文档+源码+调试部署
  16. python 捕捉热键
  17. 多任务让你走得更慢(很好,转自infoq)
  18. 女篮亚军,为啥男篮那么水?
  19. 2022年秋招提前批总结(海尔智家)
  20. 2016天善智能交流会第22场: R语言为量化而生

热门文章

  1. 思维导图中主题连接线格式修改教程
  2. Rabbitmq+Nginx+keepalived高可用热备
  3. VB.NET 策略模式(下机用户类型选择)
  4. flash遮住层解决办法
  5. 移动web适配利器-rem
  6. 集成CCFlow工作流与GPM的办公系统驰骋CCOA介绍(一)
  7. Redis数据类型之字符串String
  8. 初学swift笔记-数组、字典、元组(三)
  9. 牛人也得看的CSS常识
  10. 中考在即,杂乱的书房