写点什么

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

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

关注

评论

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

网络入侵检测系统之Suricata(七)--DDOS流量检测模型

于顾而言

网络安全 suricata

[Maven进阶]多环境配置与应用

十八岁讨厌编程

maven 后端开发 9月月更

网络入侵检测系统之Suricata(十三)--网络安全威胁及攻击手段总览

于顾而言

网络安全 suricata

网络入侵检测系统之Suricata(二)--运行模式及数据流图

于顾而言

网络安全 suricata

网络入侵检测系统之Suricata(五)--Worker Model线程调度详解详解

于顾而言

网络安全 suricata

网络入侵检测系统之Suricata(十一)--TCP重组实现详解

于顾而言

网络安全 suricata

【云原生 | 从零开始学Docker】七丶实战提交自己的镜像以及docker网络

泡泡

Docker 云计算 容器 云原生 9月月更

[Maven进阶]聚合和继承

十八岁讨厌编程

maven 后端开发 9月月更

[极致用户体验] 微信设置大字号后,iOS加载网页时闪动怎么办?

HullQin

CSS JavaScript html 前端 9月月更

「趣学前端」Taro实践+踩坑记录第一期

叶一一

taro 前端 框架 9月月更

网络入侵检测系统之Suricata(三)--日志代码详解

于顾而言

网络安全 suricata

网络入侵检测系统之Suricata(六)--规则加载模块代码详解

于顾而言

网络安全 suricata

王者荣耀商城异地多活架构设计

张立奎

网络入侵检测系统之Suricata(十二)--TCP重组优化

于顾而言

网络安全 suricata

大数据调度平台Airflow(一):什么是Airflow

Lansonli

9月月更

[Maven进阶]属性与版本管理

十八岁讨厌编程

maven 后端开发 9月月更

【算法实践】分块查找知多少?手把手带你实现分块查找

迷彩

数据结构 算法 9月月更 分块查找 查找算法

一文带你快速入门【哈希表】

Fire_Shield

数据结构 哈希表 9月月更

SAP UI5 Form 表单 Column Layout 下的 Column 个数分配问题

汪子熙

JavaScript Fiori SAP UI5 ui5 9月月更

redis对应的数据类型及其底层原理

知识浅谈

redis 底层原理 9月月更

2022-09-17:一个字符串s,表示仓库的墙 与 货物,其中‘|‘表示墙,‘*‘表示货物。 给定一个起始下标start和一个终止下标end, 找出子串中 被墙包裹的货物 数量。 比如: s = “

福大大架构师每日一题

算法 福大大

网络入侵检测系统之Suricata(十)--ICMP实现详解

于顾而言

网络安全 suricata

网络入侵检测系统之Suricata(十六)--类suricata/snort规则自动维护工具

于顾而言

网络安全 suricata

MyBatisPlus(四、代码生成器)

Mybatis-Plus 代码生成 9月月更

「趣学前端」自己动手丰衣足食的TS项目开发

叶一一

typescript 前端 ts 9月月更

网络入侵检测系统之Suricata(四)--初始化模块代码详解

于顾而言

网络安全 suricata

网络入侵检测系统之Suricata(八)--Option实现详解

于顾而言

网络安全 suricata

网络入侵检测系统之Suricata(十五)--IPOnly/Radix Tree详解

于顾而言

网络安全 suricata

Java进阶(二十七)使用Dom4j解析XML文件

No Silver Bullet

Java xml 9月月更 DOM4J

网络入侵检测系统之Suricata(九)--Storage实现详解

于顾而言

网络安全 suricata

网络入侵检测系统之Suricata(十四)--匹配流程

于顾而言

网络安全 suricata

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