SlideShare ist ein Scribd-Unternehmen logo
1 von 39
Clojure Web 编程实战
庄晓丹 2014 年 10 月
Agenda
•Clojure 简介
•Clojure 工具链
•Web 项目实战
•小结
•Clojure 得与失
•QA
2
Clojure 是什么?
Clojure is a dynamic programming language
that targets the Java Virtual Machine (and
the CLR, and JavaScript).
— clojure.org
3
Clojure
• Lisp on JVM
• 函数式语言
• 动态语言
• 作者: Rich Hickey
• 2007 年 10 月第一次发布
• 主页: http://clojure.org
4
Clojure 真实和谎言
• 前缀运算符
• 任意参数个数
• 括号复括号:Lost in stupid parentheses
• 优先级明确通过括号嵌套表达
• 括号组成的 form 即是数据结构 List
• Data is Code is Data.
• 动态
• 动态类型
• 交互式编程 5
Clojure 真实和谎言
•函数式编程:First Class
•存储为 var
•作为返回值
•作为参数
•Clojure 是并发语言
•原生支持 STM,提供多种并发原语
•core.async
•真实的情况:你用到的机会不多
6
Clojure 眼见为实
• 顺序
(do (println 1) (println 2) ……)
• 条件
(if (> a b)
“a大于b”
“b大于或者等于a”)
• 循环
(loop [n 1 ret 0]
(if (> n 100)
ret
(recur (inc n) (+ ret n))))
7
Clojure 眼见为实
•(+ a b c d) => a +b + c + d
•(* a (+ b c) d) => a * (b + c) * d
•(op arg1 arg2 ……)
List 数据结构
8
Clojure 眼见为实
• Code <=> Data
• List 结构:中间代码,宏可以操作并生成中
间代码
• 宏(Macro):扩展编译器,加入新的语法结
构。
9
if test
then
else
when test
something1
something2
……
(defmacro when
[test & body]
(list 'if test (cons 'do body)))
Clojure 眼见为实
•REPL(Read-Eval-Print-Loop):交互式编程
10
Clojure 眼见为实
• 调用 Java
• (.substring "hello world" 0 5) => hello
• “改良” Java
• (doto (java.util.HashMap.) (.put "a" 1) (.put
"b" 2)) => {"b" 2, "a" 1}
• (.. System (getProperties) (get “os.name"))
=> Mac OS X
• protocol, multi-method,reify and proxy
11
Clojure 工具链
• Clojure 自带 REPL
• 自动化构建工具:Leiningen [‘laɪnɪŋən]
• 项目结构描述
• 依赖管理
• 更好的 REPL
• 开发、打包、发布
• 插件体系
12
Clojure IDE
• Emacs Cider
• Vim Clojure
• Eclipse CounterClockWise
• Intellij Cursive
• LightTable
13
实战 Project
• 目的:提供 RESTFul API 查询 IP 地理位置
• https://github.com/killme2008/ip-service
• 过程:
• 新建项目
• 定义 API
• 解析二进制
• 请求和应答
• 错误处理
• 测试
14
Clojure Web Architecture
15
Browser/
Mobile
Devices/
Other apps
Http
Service
(Clojure)
DataBase
(Mongodb/
MySQL etc)
Http Service Structure
16
Web
Server/Conta
iner
Ring Middleware Handler
Clojure
Clojure Web 编程栈参考
• Database
• clojure.java.jdbc
• honeysql
• sqlkorma (ORM)
• monger
• Service/Middleware:
• ring
• compojure
• View:
• Template engine:
• enlive( Not recommended)
• mustache: clostache,mulstache.clj
• handlebars: hbs, handlebars-clj
• velocity: ring.velocity
• JavaScript App: Backbone.js /Angular.js
17
Clojure Web 编程栈
• 日志: clojure.tools.logging
• 单元测试: clojure.test
• 集成测试:Selenium webdriver & watir
• 持续集成: jenkins(hudson)
• 序列化: clojure.data.json/data.xml
• JMX: clojure.java.jmx
• 加密: pandect
• Email: postal
18
New Project: hello world
• lein new compojure ip-service
• lein ring server
(defroutes app-routes
(GET "/" [] "Hello World")
(route/resources "/")
(route/not-found "Not Found"))
(def app
(handler/site app-routes))
19
Compojure Basic
• Routes: mapping request => handler
• Handler: request in => response out
• Middleware: transform handler => new
handler
20
解析二进制文件
• 17mon 提供的 IP 库 (IPv4)
• 步骤:
• IPv4 地址转成 int32 值
• 根据第一个字节定位查找点
• 从查找点每 8 个字节查找第一个大于
等于 IPv4 值的位置
• 从后 4 个字节中提取结果偏移量和大
小
• 根据偏移量和大小取出结果字符串 21
解析二进制文件
• MappedByteBuffer 文件内存映射
• Binary 库定义查找 8 个字节查找结构:
• 以数据流的方式处理
(repeated
{:ip-num :int-be
:offset-bs (repeated :byte :length 3)
:size :byte})
22
与 Java 结合
• 实现抽象类 proxy [InputStream]
• 方法调用
• 箭头宏:减少嵌套括号
• 异常处理
23
定义 API
• Route:
• GET /ip
• Context: GET /1/ip
• Handler == Function:
(defn query-ip [req]
;;TODO
)
(context “/1" []
(GET "/ip" [] query-ip))
24
Handler
• Handler:返回 Http Response 的函数
• Http Response: 普通的 map
(defn query-api
[req]
(let [ip (-> req :params :ip)]
{ :status 200
:headers { “Content-Type” “application/json”}
:body
(json/write-str
{ :ip ip
:result (ip-service/find-geography ip)})}))
25
Middleware:Error Handler
• Decorator 模式
(defn wrap-handle-error [handler]
(fn [req]
(try
(handler req)
(catch Exception e
(log/error e "Process request failed.")
{:status 500 :error (.getMessage e)}))))
26
Test
• Unit test: clojure.test & ring-mock
• lein test
• clojure-test-mode
• We just test normal functions
• Integration test:
• clj-webdriver
• Ruby watirwebdriver etc.
27
Build/Deploy
• Build
• lein uberjar
• lein ring war
• lein jar + libdir plugin
• Web Container:
• jetty
• http-kit
• Immutant(JBoss)
28
Performance
• Performance Optimization:
• Type hints
• Transient Collections
• defrecord/deftype vs. Sequences
• Primitive Java APIs
• Cache
• JVM Garbage Collector
• CMS/G1
• –XX:MaxTenuringThreshold
• NewSize
29
Then……
• Handler 模块化
• Web 安全
• 注入
• XSS 攻击
• 认证和授权
• Cookie / Session
• 加密
• ClojureScript
30
Lessons
• 相比于 Java 编程
• 在代码和问题域之间的映射更容易
• DSL
• 以数据(结构)为核心:转换、流转
• 更少的代码
• 更多的动态性
• 小而美,造就轻松编程文化
31
AVOS Cloud 应用情况
• AVOS Cloud => LeanCloud
• Clojure 应用在:
• API
• Push
• Chat
• Statistics
• ……
32
AVOS Cloud 应用情况
• 2 万行代码,4 个人年
• 14 台机器跑 Clojure 服务
• 数百万连接
• 数亿次 API 调用
• 单台 Push Server:
• 32G 内存,24 核 CPU
• 100 万连接
• 20 秒推送 80 万(测试场景)
33
我们贡献的一些开源库
• link
• papaline
• slacker
• hbs
• defun
• clj.qiniu
• clj-xmemcached
• clj.qrgen
• …… 34
35
Lessons
• Good
• Less Code,More Productivity
• 跟 Java 平台良好适配,优秀类库唾手可得。
• 活跃友好的社区
• 轻松编程
• Bad
• Ugly stacktraces.
• 启动速度
• 跟 Java 平台结合过于紧密
• 动态类型的优缺点
• 招人?
36
At the end
• Book:
• 《Clojure Programming》
• 《Clojure in Action》
• 《The Joy of Clojure》
• Community:
• Clojure User Group
• China Clojure User Group
37
QA
38
Clojure 简介
•Lisp on JVM
•动态语言
•函数式语言
•2007 年 10 月第一次发布
•主页: http://clojure.org
•当前版本:
•稳定版 1.6.0
•开发版本 1.7.0-alapha2
@InfoQ infoqchina

Weitere ähnliche Inhalte

Was ist angesagt?

基于OpenResty的百万级长连接推送
基于OpenResty的百万级长连接推送基于OpenResty的百万级长连接推送
基于OpenResty的百万级长连接推送OpenRestyCon
 
lua & ngx_lua 的介绍与应用
lua & ngx_lua 的介绍与应用lua & ngx_lua 的介绍与应用
lua & ngx_lua 的介绍与应用hugo
 
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理Justin Lin
 
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應Justin Lin
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理Justin Lin
 
Ch01 簡介Web應用程式
Ch01 簡介Web應用程式Ch01 簡介Web應用程式
Ch01 簡介Web應用程式Justin Lin
 
静态项目管理工具 - opm
静态项目管理工具 - opm静态项目管理工具 - opm
静态项目管理工具 - opmgoto100
 
移动搜索在慢网速下的优化
移动搜索在慢网速下的优化移动搜索在慢网速下的优化
移动搜索在慢网速下的优化Charlee Green
 
Node js实践
Node js实践Node js实践
Node js实践jay li
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理Justin Lin
 
NodeJS基礎教學&簡介
NodeJS基礎教學&簡介NodeJS基礎教學&簡介
NodeJS基礎教學&簡介GO LL
 
编辑器设计U editor
编辑器设计U editor编辑器设计U editor
编辑器设计U editortaobao.com
 
Full stack-development with node js
Full stack-development with node jsFull stack-development with node js
Full stack-development with node jsXuefeng Zhang
 
鳳山高中/網頁應用程式開發入門 I
鳳山高中/網頁應用程式開發入門 I鳳山高中/網頁應用程式開發入門 I
鳳山高中/網頁應用程式開發入門 ILorex L. Yang
 
Node.js從無到有 基本課程
Node.js從無到有 基本課程Node.js從無到有 基本課程
Node.js從無到有 基本課程Simon Su
 
前端性能测试
前端性能测试前端性能测试
前端性能测试tbmallf2e
 
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應Justin Lin
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityJustin Lin
 
编辑器设计Kissy editor
编辑器设计Kissy editor编辑器设计Kissy editor
编辑器设计Kissy editortaobao.com
 

Was ist angesagt? (20)

基于OpenResty的百万级长连接推送
基于OpenResty的百万级长连接推送基于OpenResty的百万级长连接推送
基于OpenResty的百万级长连接推送
 
lua & ngx_lua 的介绍与应用
lua & ngx_lua 的介绍与应用lua & ngx_lua 的介绍与应用
lua & ngx_lua 的介绍与应用
 
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理
 
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理
 
Ch01 簡介Web應用程式
Ch01 簡介Web應用程式Ch01 簡介Web應用程式
Ch01 簡介Web應用程式
 
静态项目管理工具 - opm
静态项目管理工具 - opm静态项目管理工具 - opm
静态项目管理工具 - opm
 
移动搜索在慢网速下的优化
移动搜索在慢网速下的优化移动搜索在慢网速下的优化
移动搜索在慢网速下的优化
 
Node js实践
Node js实践Node js实践
Node js实践
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理
 
NodeJS基礎教學&簡介
NodeJS基礎教學&簡介NodeJS基礎教學&簡介
NodeJS基礎教學&簡介
 
编辑器设计U editor
编辑器设计U editor编辑器设计U editor
编辑器设计U editor
 
Full stack-development with node js
Full stack-development with node jsFull stack-development with node js
Full stack-development with node js
 
鳳山高中/網頁應用程式開發入門 I
鳳山高中/網頁應用程式開發入門 I鳳山高中/網頁應用程式開發入門 I
鳳山高中/網頁應用程式開發入門 I
 
Asp.net core v1.0
Asp.net core v1.0Asp.net core v1.0
Asp.net core v1.0
 
Node.js從無到有 基本課程
Node.js從無到有 基本課程Node.js從無到有 基本課程
Node.js從無到有 基本課程
 
前端性能测试
前端性能测试前端性能测试
前端性能测试
 
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/Security
 
编辑器设计Kissy editor
编辑器设计Kissy editor编辑器设计Kissy editor
编辑器设计Kissy editor
 

Andere mochten auch

PromptWorks Talk Tuesdays: Ray Zane 1/17/17 "Elixir Is Cool"
PromptWorks Talk Tuesdays: Ray Zane 1/17/17 "Elixir Is Cool"PromptWorks Talk Tuesdays: Ray Zane 1/17/17 "Elixir Is Cool"
PromptWorks Talk Tuesdays: Ray Zane 1/17/17 "Elixir Is Cool"PromptWorks
 
Java 与 CPU 高速缓存
Java 与 CPU 高速缓存Java 与 CPU 高速缓存
Java 与 CPU 高速缓存dennis zhuang
 
Phoenix demysitify, with fun
Phoenix demysitify, with funPhoenix demysitify, with fun
Phoenix demysitify, with funTai An Su
 
Elixir Elevated: The Ups and Downs of OTP at ElixirConf2014
Elixir Elevated: The Ups and Downs of OTP at ElixirConf2014Elixir Elevated: The Ups and Downs of OTP at ElixirConf2014
Elixir Elevated: The Ups and Downs of OTP at ElixirConf2014Greg Vaughn
 
Introducing Elixir the easy way
Introducing Elixir the easy wayIntroducing Elixir the easy way
Introducing Elixir the easy wayTobias Pfeiffer
 
Elixir & Phoenix – fast, concurrent and explicit
Elixir & Phoenix – fast, concurrent and explicitElixir & Phoenix – fast, concurrent and explicit
Elixir & Phoenix – fast, concurrent and explicitTobias Pfeiffer
 
Bottleneck in Elixir Application - Alexey Osipenko
 Bottleneck in Elixir Application - Alexey Osipenko  Bottleneck in Elixir Application - Alexey Osipenko
Bottleneck in Elixir Application - Alexey Osipenko Elixir Club
 
Learn Elixir at Manchester Lambda Lounge
Learn Elixir at Manchester Lambda LoungeLearn Elixir at Manchester Lambda Lounge
Learn Elixir at Manchester Lambda LoungeChi-chi Ekweozor
 

Andere mochten auch (14)

PromptWorks Talk Tuesdays: Ray Zane 1/17/17 "Elixir Is Cool"
PromptWorks Talk Tuesdays: Ray Zane 1/17/17 "Elixir Is Cool"PromptWorks Talk Tuesdays: Ray Zane 1/17/17 "Elixir Is Cool"
PromptWorks Talk Tuesdays: Ray Zane 1/17/17 "Elixir Is Cool"
 
Java 与 CPU 高速缓存
Java 与 CPU 高速缓存Java 与 CPU 高速缓存
Java 与 CPU 高速缓存
 
Elixir
ElixirElixir
Elixir
 
Phoenix demysitify, with fun
Phoenix demysitify, with funPhoenix demysitify, with fun
Phoenix demysitify, with fun
 
Elixir introd
Elixir introdElixir introd
Elixir introd
 
Elixir Elevated: The Ups and Downs of OTP at ElixirConf2014
Elixir Elevated: The Ups and Downs of OTP at ElixirConf2014Elixir Elevated: The Ups and Downs of OTP at ElixirConf2014
Elixir Elevated: The Ups and Downs of OTP at ElixirConf2014
 
Introducing Elixir the easy way
Introducing Elixir the easy wayIntroducing Elixir the easy way
Introducing Elixir the easy way
 
Elixir & Phoenix – fast, concurrent and explicit
Elixir & Phoenix – fast, concurrent and explicitElixir & Phoenix – fast, concurrent and explicit
Elixir & Phoenix – fast, concurrent and explicit
 
Erlang scheduler
Erlang schedulerErlang scheduler
Erlang scheduler
 
Bottleneck in Elixir Application - Alexey Osipenko
 Bottleneck in Elixir Application - Alexey Osipenko  Bottleneck in Elixir Application - Alexey Osipenko
Bottleneck in Elixir Application - Alexey Osipenko
 
Elixir basics
Elixir basicsElixir basics
Elixir basics
 
Learn Elixir at Manchester Lambda Lounge
Learn Elixir at Manchester Lambda LoungeLearn Elixir at Manchester Lambda Lounge
Learn Elixir at Manchester Lambda Lounge
 
Nintendo presentation 3.0
Nintendo presentation 3.0Nintendo presentation 3.0
Nintendo presentation 3.0
 
Elixir OTP
Elixir OTPElixir OTP
Elixir OTP
 

Ähnlich wie QCon - 一次 Clojure Web 编程实战

合久必分,分久必合
合久必分,分久必合合久必分,分久必合
合久必分,分久必合Qiangning Hong
 
课题二:Node.js那些事儿
课题二:Node.js那些事儿课题二:Node.js那些事儿
课题二:Node.js那些事儿Liu Allen
 
Template mb-kao
Template mb-kaoTemplate mb-kao
Template mb-kaoxwcoder
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践taobao.com
 
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7Justin Lin
 
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例Will Huang
 
Angular js twmvc#17
Angular js twmvc#17Angular js twmvc#17
Angular js twmvc#17twMVC
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版Jackson Tian
 
Kamigo reviews 20191127
Kamigo reviews 20191127Kamigo reviews 20191127
Kamigo reviews 20191127Jia Yu Lin
 
⼤語⾔模型 LLM 應⽤開發入⾨
⼤語⾔模型 LLM 應⽤開發入⾨⼤語⾔模型 LLM 應⽤開發入⾨
⼤語⾔模型 LLM 應⽤開發入⾨Wen-Tien Chang
 
How to ASP.NET MVC4
How to ASP.NET MVC4How to ASP.NET MVC4
How to ASP.NET MVC4Daniel Chou
 
基于Seajs的项目构建
基于Seajs的项目构建基于Seajs的项目构建
基于Seajs的项目构建Zhang Xiaoxue
 
Introduction to ASP.NET MVC and MVC 5 Features
Introduction to ASP.NET MVC and MVC 5 FeaturesIntroduction to ASP.NET MVC and MVC 5 Features
Introduction to ASP.NET MVC and MVC 5 FeaturesJeff Chu
 
Javascript primer plus
Javascript primer plusJavascript primer plus
Javascript primer plusDongxu Yao
 
前端自動化工具
前端自動化工具前端自動化工具
前端自動化工具國昭 張
 
網站上線了,然後呢?
網站上線了,然後呢?網站上線了,然後呢?
網站上線了,然後呢?Kirk Chen
 
從軟體開發角度
談 Docker 的應用
從軟體開發角度
談 Docker 的應用從軟體開發角度
談 Docker 的應用
從軟體開發角度
談 Docker 的應用謝 宗穎
 
向jquery学习
向jquery学习向jquery学习
向jquery学习jay li
 
Nodejs & NAE
Nodejs & NAENodejs & NAE
Nodejs & NAEq3boy
 
美团前端架构简介
美团前端架构简介美团前端架构简介
美团前端架构简介pan weizeng
 

Ähnlich wie QCon - 一次 Clojure Web 编程实战 (20)

合久必分,分久必合
合久必分,分久必合合久必分,分久必合
合久必分,分久必合
 
课题二:Node.js那些事儿
课题二:Node.js那些事儿课题二:Node.js那些事儿
课题二:Node.js那些事儿
 
Template mb-kao
Template mb-kaoTemplate mb-kao
Template mb-kao
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践
 
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7
 
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
 
Angular js twmvc#17
Angular js twmvc#17Angular js twmvc#17
Angular js twmvc#17
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版
 
Kamigo reviews 20191127
Kamigo reviews 20191127Kamigo reviews 20191127
Kamigo reviews 20191127
 
⼤語⾔模型 LLM 應⽤開發入⾨
⼤語⾔模型 LLM 應⽤開發入⾨⼤語⾔模型 LLM 應⽤開發入⾨
⼤語⾔模型 LLM 應⽤開發入⾨
 
How to ASP.NET MVC4
How to ASP.NET MVC4How to ASP.NET MVC4
How to ASP.NET MVC4
 
基于Seajs的项目构建
基于Seajs的项目构建基于Seajs的项目构建
基于Seajs的项目构建
 
Introduction to ASP.NET MVC and MVC 5 Features
Introduction to ASP.NET MVC and MVC 5 FeaturesIntroduction to ASP.NET MVC and MVC 5 Features
Introduction to ASP.NET MVC and MVC 5 Features
 
Javascript primer plus
Javascript primer plusJavascript primer plus
Javascript primer plus
 
前端自動化工具
前端自動化工具前端自動化工具
前端自動化工具
 
網站上線了,然後呢?
網站上線了,然後呢?網站上線了,然後呢?
網站上線了,然後呢?
 
從軟體開發角度
談 Docker 的應用
從軟體開發角度
談 Docker 的應用從軟體開發角度
談 Docker 的應用
從軟體開發角度
談 Docker 的應用
 
向jquery学习
向jquery学习向jquery学习
向jquery学习
 
Nodejs & NAE
Nodejs & NAENodejs & NAE
Nodejs & NAE
 
美团前端架构简介
美团前端架构简介美团前端架构简介
美团前端架构简介
 

Mehr von dennis zhuang

Clojure 1.8 Direct-Linking WWH
Clojure 1.8  Direct-Linking  WWHClojure 1.8  Direct-Linking  WWH
Clojure 1.8 Direct-Linking WWHdennis zhuang
 
我在 Mac 上的常用开发工具
我在 Mac 上的常用开发工具我在 Mac 上的常用开发工具
我在 Mac 上的常用开发工具dennis zhuang
 
AVOSCloud简介——万象移动云平台
AVOSCloud简介——万象移动云平台AVOSCloud简介——万象移动云平台
AVOSCloud简介——万象移动云平台dennis zhuang
 
Ihome inaction 篇外篇之fp介绍
Ihome inaction 篇外篇之fp介绍Ihome inaction 篇外篇之fp介绍
Ihome inaction 篇外篇之fp介绍dennis zhuang
 
Aviator——轻量级表达式执行引擎
Aviator——轻量级表达式执行引擎Aviator——轻量级表达式执行引擎
Aviator——轻量级表达式执行引擎dennis zhuang
 
Java多线程常见陷阱
Java多线程常见陷阱Java多线程常见陷阱
Java多线程常见陷阱dennis zhuang
 

Mehr von dennis zhuang (15)

Clojure 1.8 Direct-Linking WWH
Clojure 1.8  Direct-Linking  WWHClojure 1.8  Direct-Linking  WWH
Clojure 1.8 Direct-Linking WWH
 
Mesos intro
Mesos introMesos intro
Mesos intro
 
CQL 实现
CQL 实现CQL 实现
CQL 实现
 
我在 Mac 上的常用开发工具
我在 Mac 上的常用开发工具我在 Mac 上的常用开发工具
我在 Mac 上的常用开发工具
 
Hystrix 介绍
Hystrix 介绍Hystrix 介绍
Hystrix 介绍
 
AVOSCloud简介——万象移动云平台
AVOSCloud简介——万象移动云平台AVOSCloud简介——万象移动云平台
AVOSCloud简介——万象移动云平台
 
Avoscloud 2
Avoscloud 2Avoscloud 2
Avoscloud 2
 
点评新架构
点评新架构点评新架构
点评新架构
 
Clojure概览
Clojure概览Clojure概览
Clojure概览
 
Ihome inaction 篇外篇之fp介绍
Ihome inaction 篇外篇之fp介绍Ihome inaction 篇外篇之fp介绍
Ihome inaction 篇外篇之fp介绍
 
Nio trick and trap
Nio trick and trapNio trick and trap
Nio trick and trap
 
Aviator——轻量级表达式执行引擎
Aviator——轻量级表达式执行引擎Aviator——轻量级表达式执行引擎
Aviator——轻量级表达式执行引擎
 
Clojure的魅力
Clojure的魅力Clojure的魅力
Clojure的魅力
 
Erlang简介
Erlang简介Erlang简介
Erlang简介
 
Java多线程常见陷阱
Java多线程常见陷阱Java多线程常见陷阱
Java多线程常见陷阱
 

QCon - 一次 Clojure Web 编程实战

  • 2. Agenda •Clojure 简介 •Clojure 工具链 •Web 项目实战 •小结 •Clojure 得与失 •QA 2
  • 3. Clojure 是什么? Clojure is a dynamic programming language that targets the Java Virtual Machine (and the CLR, and JavaScript). — clojure.org 3
  • 4. Clojure • Lisp on JVM • 函数式语言 • 动态语言 • 作者: Rich Hickey • 2007 年 10 月第一次发布 • 主页: http://clojure.org 4
  • 5. Clojure 真实和谎言 • 前缀运算符 • 任意参数个数 • 括号复括号:Lost in stupid parentheses • 优先级明确通过括号嵌套表达 • 括号组成的 form 即是数据结构 List • Data is Code is Data. • 动态 • 动态类型 • 交互式编程 5
  • 6. Clojure 真实和谎言 •函数式编程:First Class •存储为 var •作为返回值 •作为参数 •Clojure 是并发语言 •原生支持 STM,提供多种并发原语 •core.async •真实的情况:你用到的机会不多 6
  • 7. Clojure 眼见为实 • 顺序 (do (println 1) (println 2) ……) • 条件 (if (> a b) “a大于b” “b大于或者等于a”) • 循环 (loop [n 1 ret 0] (if (> n 100) ret (recur (inc n) (+ ret n)))) 7
  • 8. Clojure 眼见为实 •(+ a b c d) => a +b + c + d •(* a (+ b c) d) => a * (b + c) * d •(op arg1 arg2 ……) List 数据结构 8
  • 9. Clojure 眼见为实 • Code <=> Data • List 结构:中间代码,宏可以操作并生成中 间代码 • 宏(Macro):扩展编译器,加入新的语法结 构。 9 if test then else when test something1 something2 …… (defmacro when [test & body] (list 'if test (cons 'do body)))
  • 11. Clojure 眼见为实 • 调用 Java • (.substring "hello world" 0 5) => hello • “改良” Java • (doto (java.util.HashMap.) (.put "a" 1) (.put "b" 2)) => {"b" 2, "a" 1} • (.. System (getProperties) (get “os.name")) => Mac OS X • protocol, multi-method,reify and proxy 11
  • 12. Clojure 工具链 • Clojure 自带 REPL • 自动化构建工具:Leiningen [‘laɪnɪŋən] • 项目结构描述 • 依赖管理 • 更好的 REPL • 开发、打包、发布 • 插件体系 12
  • 13. Clojure IDE • Emacs Cider • Vim Clojure • Eclipse CounterClockWise • Intellij Cursive • LightTable 13
  • 14. 实战 Project • 目的:提供 RESTFul API 查询 IP 地理位置 • https://github.com/killme2008/ip-service • 过程: • 新建项目 • 定义 API • 解析二进制 • 请求和应答 • 错误处理 • 测试 14
  • 15. Clojure Web Architecture 15 Browser/ Mobile Devices/ Other apps Http Service (Clojure) DataBase (Mongodb/ MySQL etc)
  • 17. Clojure Web 编程栈参考 • Database • clojure.java.jdbc • honeysql • sqlkorma (ORM) • monger • Service/Middleware: • ring • compojure • View: • Template engine: • enlive( Not recommended) • mustache: clostache,mulstache.clj • handlebars: hbs, handlebars-clj • velocity: ring.velocity • JavaScript App: Backbone.js /Angular.js 17
  • 18. Clojure Web 编程栈 • 日志: clojure.tools.logging • 单元测试: clojure.test • 集成测试:Selenium webdriver & watir • 持续集成: jenkins(hudson) • 序列化: clojure.data.json/data.xml • JMX: clojure.java.jmx • 加密: pandect • Email: postal 18
  • 19. New Project: hello world • lein new compojure ip-service • lein ring server (defroutes app-routes (GET "/" [] "Hello World") (route/resources "/") (route/not-found "Not Found")) (def app (handler/site app-routes)) 19
  • 20. Compojure Basic • Routes: mapping request => handler • Handler: request in => response out • Middleware: transform handler => new handler 20
  • 21. 解析二进制文件 • 17mon 提供的 IP 库 (IPv4) • 步骤: • IPv4 地址转成 int32 值 • 根据第一个字节定位查找点 • 从查找点每 8 个字节查找第一个大于 等于 IPv4 值的位置 • 从后 4 个字节中提取结果偏移量和大 小 • 根据偏移量和大小取出结果字符串 21
  • 22. 解析二进制文件 • MappedByteBuffer 文件内存映射 • Binary 库定义查找 8 个字节查找结构: • 以数据流的方式处理 (repeated {:ip-num :int-be :offset-bs (repeated :byte :length 3) :size :byte}) 22
  • 23. 与 Java 结合 • 实现抽象类 proxy [InputStream] • 方法调用 • 箭头宏:减少嵌套括号 • 异常处理 23
  • 24. 定义 API • Route: • GET /ip • Context: GET /1/ip • Handler == Function: (defn query-ip [req] ;;TODO ) (context “/1" [] (GET "/ip" [] query-ip)) 24
  • 25. Handler • Handler:返回 Http Response 的函数 • Http Response: 普通的 map (defn query-api [req] (let [ip (-> req :params :ip)] { :status 200 :headers { “Content-Type” “application/json”} :body (json/write-str { :ip ip :result (ip-service/find-geography ip)})})) 25
  • 26. Middleware:Error Handler • Decorator 模式 (defn wrap-handle-error [handler] (fn [req] (try (handler req) (catch Exception e (log/error e "Process request failed.") {:status 500 :error (.getMessage e)})))) 26
  • 27. Test • Unit test: clojure.test & ring-mock • lein test • clojure-test-mode • We just test normal functions • Integration test: • clj-webdriver • Ruby watirwebdriver etc. 27
  • 28. Build/Deploy • Build • lein uberjar • lein ring war • lein jar + libdir plugin • Web Container: • jetty • http-kit • Immutant(JBoss) 28
  • 29. Performance • Performance Optimization: • Type hints • Transient Collections • defrecord/deftype vs. Sequences • Primitive Java APIs • Cache • JVM Garbage Collector • CMS/G1 • –XX:MaxTenuringThreshold • NewSize 29
  • 30. Then…… • Handler 模块化 • Web 安全 • 注入 • XSS 攻击 • 认证和授权 • Cookie / Session • 加密 • ClojureScript 30
  • 31. Lessons • 相比于 Java 编程 • 在代码和问题域之间的映射更容易 • DSL • 以数据(结构)为核心:转换、流转 • 更少的代码 • 更多的动态性 • 小而美,造就轻松编程文化 31
  • 32. AVOS Cloud 应用情况 • AVOS Cloud => LeanCloud • Clojure 应用在: • API • Push • Chat • Statistics • …… 32
  • 33. AVOS Cloud 应用情况 • 2 万行代码,4 个人年 • 14 台机器跑 Clojure 服务 • 数百万连接 • 数亿次 API 调用 • 单台 Push Server: • 32G 内存,24 核 CPU • 100 万连接 • 20 秒推送 80 万(测试场景) 33
  • 34. 我们贡献的一些开源库 • link • papaline • slacker • hbs • defun • clj.qiniu • clj-xmemcached • clj.qrgen • …… 34
  • 35. 35
  • 36. Lessons • Good • Less Code,More Productivity • 跟 Java 平台良好适配,优秀类库唾手可得。 • 活跃友好的社区 • 轻松编程 • Bad • Ugly stacktraces. • 启动速度 • 跟 Java 平台结合过于紧密 • 动态类型的优缺点 • 招人? 36
  • 37. At the end • Book: • 《Clojure Programming》 • 《Clojure in Action》 • 《The Joy of Clojure》 • Community: • Clojure User Group • China Clojure User Group 37
  • 38. QA 38
  • 39. Clojure 简介 •Lisp on JVM •动态语言 •函数式语言 •2007 年 10 月第一次发布 •主页: http://clojure.org •当前版本: •稳定版 1.6.0 •开发版本 1.7.0-alapha2 @InfoQ infoqchina