写点什么

使用 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:001715
用户头像

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

关注

评论

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

英特尔携手龙蜥,共筑未来操作系统

OpenAnolis小助手

操作系统 龙蜥社区 龙蜥操作系统大会

第二届全国高校软件测试开发教育峰会在韩山师范学院隆重举办!

霍格沃兹测试开发学社

鸿蒙 next 写入考试时间日程到系统日历

flfljh

鸿蒙

华为账号一键登录

flfljh

鸿蒙

APP 服务卡片获取 APP 内数据

flfljh

鸿蒙

鸿蒙 next 实现应用内的暗黑模式切换

flfljh

鸿蒙

AI 容器建设项目正式启动!龙蜥社区加速 AI 原生 OS 技术创新

OpenAnolis小助手

开源 AI 操作系统 龙蜥社区

对象数组,数据更新刷新ui

flfljh

鸿蒙

鸿蒙 Flutter plugin开发详细解释

flfljh

鸿蒙

Flutter开发鸿蒙,终端一体化

flfljh

鸿蒙

告别头文件,编译效率提升 42%!C++ Modules 实战解析 | 干货推荐

OpenAnolis小助手

c++ 操作系统 模块 技术干货

Flutter与鸿蒙原生交互二

flfljh

鸿蒙

【JIT/极态云】技术文档--反馈提醒

武汉万云网络科技有限公司

前端 低代码 `后端

鸿蒙Next简易版本通用头部导航栏开发

flfljh

鸿蒙

鸿蒙 next 实现对象数组的界面更新

flfljh

鸿蒙

Flutter和OpenHarmony通信pigeon库的具体接入和用法

flfljh

鸿蒙

国内首位聋人 Android 软件工程师体验通义灵码,“这真是太棒了”

阿里巴巴云原生

阿里云 云原生 通义灵码

破解知识管理难题,天润融通大模型如何提高知识库管理效率?

天润融通

09.外观模式设计思想

杨充

共筑安全防线,龙蜥社区「操作系统及软件供应链安全MeetUp」邀您报名

OpenAnolis小助手

安全 操作系统 龙蜥社区 龙蜥社区安全联盟 龙蜥社区走进系列

云桌面解决方案哪家好?青椒云云桌面有什么优势

青椒云云电脑

云桌面 云桌面解决方案

Java学习—反射机制:解锁代码的无限可能

不在线第一只蜗牛

Java

AI 场景下如何确保模型数据安全?Confidential AI 技术最佳实践解读

OpenAnolis小助手

AI 操作系统 机密计算 Confidential AI

Flutter与鸿蒙原生交互

flfljh

鸿蒙

Flutter+鸿蒙NEXT开发获取系统文件路径

flfljh

鸿蒙

探讨AI 应用推广和“车用场景建设”提案,龙蜥社区召开两大委员会月度会议

OpenAnolis小助手

开源 操作系统 龙蜥社区 龙蜥社区技术委员会 龙蜥社区运营委员会

深度监听对象数组变化

flfljh

鸿蒙

鸿蒙 next 实现隐藏顶部 StatusBar

flfljh

鸿蒙

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