50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

使用 Freya 构建 F# Web 服务器

  • 2017-05-18
  • 本文字数:992 字

    阅读完需:约 3 分钟

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

2017-05-18 19:001676
用户头像

发布了 227 篇内容, 共 84.2 次阅读, 收获喜欢 28 次。

关注

评论

发布
暂无评论
发现更多内容

我的 Electron 客户端被第三方页面入侵了

我再BUG界嘎嘎乱杀

黑客 网络安全 安全 Electron 网安

苹果电脑菜单栏日历工具 万年历 for mac- 日历以及天气预报工具

Rose

NFTScan | 07.29~08.04 NFT 市场热点汇总

NFT Research

NFT NFT\ NFTScan

Maxon Cinema 4D Studio R21破解版安装教程 (C4D R21中文版下载)

Rose

一文弄懂Go语言的Context包,值得收藏!

左诗右码

Go

华为云全域Serverless技术创新:全球首创通用Serverless平台被ACM SIGCOMM录用

云计算 Serverless 华为云

尤利西斯Ulysses for Mac 中文直装版 优秀的markdown写作软件 原创 白衣衫 1分钟前 编辑

Rose

打印报表--标签打印报表

小智数据

自定义打印控件 小智开源报表控件 纯前端js报表控件 类excel样式报表 标签打印报表

打印报表--自由打印报表

小智数据

小智报表打印 小智开源报表 小智报表常见示例 纯前端js报表控件

一键登录,打造华为账号便捷新体验

HarmonyOS SDK

HarmonyOS

如何确保 API 接口的稳定性和可靠性

Noah

腾讯云联合中科软发布 “保险行业一体化大数据解决方案” 共筑保司数据基座

腾讯云大数据

腾讯云 wedata

[Mac/win永久激活版] Studio One 6中文版下载 Studio One 6许可证分享

Rose

SD-WAN组网技术的九大应用场景

Ogcloud

SD-WAN 企业组网 SD-WAN组网 SD-WAN服务商 SDWAN

Lightroom Classic 2023(lr2023)中文破解版 v12.4版本 支持Mac15系统 支持M1/M2

Rose

最佳实践:基于腾讯云 ES 的机器学习功能,实现一站式 NLP 语义聚合

腾讯云大数据

ES

轻松搞定工作汇报ppt!这3款AI软件值得拥有

彭宏豪95

效率工具 职场 办公软件 AIGC AI生成PPT

打印报表--客户订单打印报表

小智数据

小智开源报表 小智报表常见示例 纯前端js报表控件 类excel样式报表 客户订单打印报表

【YashanDB知识库】自关联外键插入数据时报错:YAS-02033 foreign key constraint violated parent key not found

YashanDB

yashandb 崖山数据库 崖山DB

DNA序列分析软件 SnapGene 5破解版含SnapGene5激活工具 mac/win

Rose

写在万粉千文的黎明前

FunTester

打印报表--分片重复报表

小智数据

小智报表打印 小智开源报表 小智报表常见示例 纯前端js报表控件 类excel样式报表

淘宝商品详情API深度解读:商品标签与分类的洞察

代码忍者

API API 文档 API 测试

JeecgBoot 如何集成 Spring AI

JEECG低代码

【YashanDB知识库】ycm托管数据库时报错OM host ip:127.0.0.1 is not support join to YCM

YashanDB

yashandb 崖山数据库 崖山DB

PostgreSQL的数据实时迁移到SelectDB

NineData

postgresql 复制 迁移 SelectDB ddl

加密市场“黑色星期一”:多重因素引发暴跌,后市如何演绎?

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

使用Freya构建F# Web服务器_.NET_Pierre-Luc Maheu_InfoQ精选文章