Clojure 学习入门(10)—— httpkit

Http-kit 是主要由Java 和 Clojure开发,为Clojure定制的零依赖的HTTP lib,仅用3000多行代码,实现了高性能 Server,Client,Timer。代码量少,实现简单,对Hacker友好。

在普通的PC上进行性能测试时,http-kit server每秒能处理数万个请求,并能轻松保持数十万并发,每个连接消耗几k内存,并发数仅与内存大小有关,高并发不影响 latency。

http-kit 下载http-kit

http-kit 官网http-kit.org 


1)HTTP Server:

  1. 高性能, 在普通机器上,每秒处理数万个请求
  2. 高并发支持。采用异步IO + 线程池的方式,在普通机器上,数十万并发
  3. 支持HTTP长连和WebSocket

2)HTTP Client:

  1. keep-alive:极端情况下,keep-alive可提高一倍性能
  2. 异步IO + 线程池
  3. API 友好

2.0.0 版本修改纪录:

  1. 增加了高性能Timer
  2. 重新设计了client的API,支持同步/异步调用,两者API几乎一样,方便切换
  3. Client实现了TCP链路复用(keep-alive),对服务端应用来说,可提高不少性能
  4. 重新设计,统一了WebSocket和HTTP长连/Streaming 的API,可使对不支持WebSocket的客户端,轻松降级到HTTP长连。
  5. WebSocket支持收发二进制帧

http-kit 力争做到API友好,性能强悍,实现简单,文档完善。


示例1:

(ns myClojure.syntax.httpkit2
  (:use org.httpkit.server))

(defn app [req]
  {:status  200
   :headers {"Content-Type" "text/html"}
   :body    "hello ithomer.net"})

(run-server app {:ip "172.27.22.21" :port 8888 :thread 10})
(println "look at: http://172.27.22.21:8888")

控制台输出:

look at: http://172.27.22.21:8888        # 指定了IP地址后,访问 http://localhost:8888 将访问不到

访问地址:http://172.27.22.21:8888


示例 2:

代码:

; clojure connect to mysql
; ithomer.net
; 2013.12.10

(ns myClojure.syntax.httpkit3
  (:use [compojure.route :only [files not-found]]
        [compojure.handler :only [site]]
        [compojure.core :only [defroutes GET POST DELETE ANY context]]
        [org.httpkit.server])
  (:require [compojure.route :as route]))

(defn show-landing-page [req] ;; ordinary clojure function, accepts a request map, returns a response map
  ;; return landing page's html string. possible template library:
  ;; mustache (https://github.com/shenfeng/mustache.clj, https://github.com/fhd/clostache...)
  ;; enlive (https://github.com/cgrand/enlive)
  ;; hiccup(https://github.com/weavejester/hiccup)
    (println "<h1>Hello World</h1>")
  )
 
(defn update-userinfo [req]          ;; ordinary clojure function
  (let [user-id (-> req :params :id)    ; param from uri
        password (-> req :params :password)] ; form param
       (println user-id password)
    ))

(defn get-user-by-id [req]          ;; ordinary clojure function
  (let [user-id (-> req :params :id)    ; param from uri
        password (-> req :params :password)] ; form param
       (println user-id password)
    )
  )

(defroutes all-routes
 (GET "/" [] show-landing-page)
  (context "/user/:id" []
           (GET / [] get-user-by-id)
           (POST / [] update-userinfo))
  (route/not-found "<p>Page not found.</p>"))    ;; all other, return 404

(run-server (site #'all-routes) {:port 8888})
运行后,访问网址:  http://172.27.22.21:8888

控制台打印输出:

<h1>Hello World</h1>



参考推荐:

http-kit server(官方)

compojure(github)

http-kit做高性能 HTTP 反向代理


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
httpkit是精巧的java嵌入式http服务器,超快的启动速度(实测仅需80毫秒),是tomcat、jetty的完美替代方案。 使用方法//起一个server实例 int port = 7777; HttpServer server = HttpServer.bind(port); //设置上下文路径 server.setContextPath("root"); //设置controller类的扫描包 server.packageSearchAndInit("com.lnwazg.main.ctrl"); //设置自动磁盘扫描 server.autoSearchThenAddWatchResourceDirRoute(); //监听在这个端口处 server.listen(); 然后访问文件列表: http://127.0.0.1:7777/root/list 访问具体的控制器 http://127.0.0.1:7777/root/base/index Controller类的写法package com.lnwazg.main.ctrl; import java.io.File; import java.util.ArrayList; import java.util.List; import com.lnwazg.httpkit.anno.BasePath; import com.lnwazg.httpkit.controller.Controller; /**  * 示例controller<br>  * 注解指定这个类的path  * @author nan.li  * @version 2016年11月30日  */ @BasePath("/base") public class FirstController extends Controller {     void index()     {         Person person = new Person();         person.age = "18";         person.name = "hudson";         List<Person> list = new ArrayList<>();         for (int i = 0; i < 5; i )         {             list.add(person);         }         person = new Person();         person.name = getParam("fff");         list.add(person);                  //输出abc         ok("abc");                  //输出一个json对象         //okJson(list);                  //        okJson(GsonHelper.gson.toJson(list));         //        okJson(list);         //        okJson(new FrontObj().success().setData(list));         //        okJson(success(list));         //        okJson(fail(list));         //        okJson(fail(list,10002,"转换错误"));         //        okJson(fail(10002, "转换错误"));         //        okJson(fail(10003));     }          void index2()     {         //输出一个文件         okFile(new File("c:\\1.jpg"));     }          public static class Person     {         String name;                  String age;     } } 标签:httpkit

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值