BT

您是否属于早期采用者或者创新人士?InfoQ正在努力为您设计更多新功能。了解更多

使用Freya构建F# Web服务器

| 作者 Pierre-Luc Maheu ,译者 Rays 发布于 2017年5月19日. 估计阅读时间: 不到一分钟 | 智能化运维、Serverless、DevOps......2017年有哪些最新运维技术趋势?CNUTCon即将为你揭秘!

Freya是一个专注于HTTP原语和并发的F# Web框架,其中并不提供模板等接口结构(construct)。在F# eXchange 2017大会上,Marcus Griep介绍了Freya的核心模型。并展示了多种用于性能和并发的机制,例如与Hopac和Kestrel的集成。

Freya支持多种托管配置。它可以直接使用dotnet run以自托管应用运行,也可以在Kestrel上运行。Freya同时支持.NET Framework和.NET Core。

出于性能上的考虑,Griep推荐在Kestrel上运行Freya,这样能有效地利用Kestrel的多种优化机制。根据他所给出的基准测试结果,在ASP.NET上运行经典的“Hello World”应用,耗时6毫秒。对于在Hopac上运行的Freya,耗时13毫秒。而对于F# Async上运行的Freya,则需要26毫秒。

上面的基准测试表明,相比于F# Async,Hopac可以显著地提高性能。Hopac使用了一种多线程的协同模式,而非抢占式(preemptive)。协同调度产生更少的上下文切换,进而可更加高效地使用CPU。但是种方式并不适于执行长时间运行的任务,因为这些贯穿始终的任务可能会饿死其它等待执行的任务。

Freya编程模型意在提供一种对HTTP的安全抽象。Freya计算表达式是对OWIN状态的抽象。下面给出一个基本例子,实现获取查询字符串的参数,并返回一个结果:

let name_ = Route.atom_ "name"
let name =
    freya {
        // 获取查询字符串参数“name”。
        let! name = Freya.Optic.get name_
        match name with
        | Some name -> return name
        | None -> return "World" }
let sayHello =
    freya {
        let! name = name
        return Represent.text (sprintf "Hello, %s!" name) }

Freya machine是一种对决策树的抽象。其中的一个决策表示的是部分HTTP规则,例如“是否存在CORS头部?”。一个完整的决策树中可能包含上百个决策,并且还可进一步扩展。machine同样具有自动优化特性,可裁剪所有与给定配置无关的决策。

Freya machine还可以使用计算表达式定义。继续上面给出的例子,下面代码中的machine设置了与HelloWorld响应的条件。

let helloMachine =
    freyaMachine {
        methods [GET; HEAD; OPTIONS]
        handleOk sayHello }

例子代码的最后部分,绑定machine到route:

let router =
    freyaRouter {
        resource "/hello{/name}" machine }

本文使用StackEdit编写。

查看英文原文: Building an F# Web Server with Freya

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT