Dynamo 4.0

Dynamo 4.0

测试已测试
语言语言 SwiftSwift
许可证 MIT
发行上次发布2015年9月
SPM支持SPM

John Holdsworth维护。



Dynamo 4.0

Dynamo - 动态Swift Web服务器

开始这个项目时,目标是用Swift编写尽可能简单的Web服务器。不幸的是,我在添加功能时有点过头了,而且这个位置已经由swifter服务器及其Swift语法糖占据了。

所以...虽然Dynamo可以像在这个项目中展示的那样用于iOS应用程序,但焦点已经转向服务器端,在那里可以设置一个简单的框架,在其中可以尝试SSL,代理以及您可能称为“Swift Server Pages”的东西,这些是放置在文档层次结构中的可加载代码包。

Dynamo服务器核心基于“Swiftlets”,即实现DynamoSwiftlet协议的实例。浏览器将从这些实例接收传入的HTTP请求,并可以选择以任何它选择的方式处理它们。开发人员通过在启动服务器时传入一个swiftlet实例数组合并所需特性和应用程序。

    @objc public protocol DynamoSwiftlet {

        @objc func process( httpClient: DynamoHTTPConnection ) -> DynamoProcessed    
    }

    @objc public enum DynamoProcessed : Int {
        case
            NotProcessed, // does not recognise the request
            Processed, // has processed the request
            ProcessedAndReusable // "" and connection may be reused in HTTP/1.1
    }

有关构成Dynamo的类和工具的更多信息,请参阅此处的jazzy文档。框架中包含的Swiftlets如下:

DocumentSwiftlet

默认swiftlet,用于从~/Sites/host:port或iOS应用程序的资源目录中提供文档。

ProxySwiftlet, SSLProxySwiftlet

Dynamo可以作为代理服务器记录从浏览器来的流量,这可能令人惊讶。要使用代理,请运行OSX目标并将代理设置为localhost:8080。

ApplicationSwiftlet, SessionSwiftlet

ApplicationSwiftlet是所有“应用程序”swiftlets的抽象基类,解析浏览器GET和POST参数和任何Cookies。《SessionSwiftlet》通过Cookies为每个独特的网络用户创建一个分别的Application Swiftlet添加了功能。

BundleSwiftlet, ServerPagesSwiftlet

BundleSwiftlet,在OSX应用程序的资源中从扩展名为“.ssp”的包中加载swiftlet。一个简单的Python脚本能从混搭HTML和Swift语言的“.shtml”文件生成包的Swift源代码。《code>ServerPagesSwiftlet将这一过程进一步扩展,当在命令行中使用时,包将从服务器的文档根目录加载。如果包更新了新的功能,并且它包含“AutoLoader.m”占位符,新代码将被“swizzled”到操作中。

ExampleAppSwiftlet, TickTackToe, NumberGuesser

《code>ExampleAppSwiftlet用于测试中检查GET和POST表单提交的字符编码。TickTackToe是一个在包目标中的.ssp应用程序的示例。NumberGuesser作为一个.shtml模板实现,由Utilities/sspcompiler.py脚本编译成Swift代码。

DynamoWebServer, DynamoSSLWebServer服务器。

请参考OSX和iOS目标下的AppDelegate.swift或AppDelegate.m文件了解如何创建这些类实例。

    // create shared swiftlet for server applications
    let exampleTableGenerator = ExampleAppSwiftlet( pathPrefix: "/example" )
    let tickTackToeGame = BundleSwiftlet( pathPrefix: "/ticktacktoe", bundleName: "TickTackToe" )!

    let logger = {
        (msg: String) in
        println( msg )
    }

    // create non-SSL server/proxy on 8080
    DynamoWebServer( portNumber: serverPort, swiftlets: [
        LoggingSwiftlet( logger: dynamoTrace ),
        exampleTableGenerator,
        tickTackToeGame,
        SSLProxySwiftlet( logger: logger ),
        ProxySwiftlet( logger: logger ),
        ServerPagesSwiftlet( documentRoot: documentRoot ),
        DocumentSwiftlet( documentRoot: documentRoot )
    ] )

创建实例就足以让服务器在自己的线程中启动和运行。还有一个额外的“Daemon”目标,创建服务器的命令行版本,应该在DynamoApp.app的资源中运行,这样它就可以找到Dynamo框架。

Dynamo框架有一个.podspec文件,因此可以使用以下命令将其引入到项目中

    use_frameworks!

    target "<project>" do

        pod 'Dynamo', :git => 'https://github.com/johnno1962/Dynamo.git'

    end

运行SSL服务器需要一组证书,可以使用从robbiehanson的CocoaHTTPServer(在Utilities/DDKeyChain.[hm]源中的BSD许可证下略微修改的代码)生成的代码来生成。

性能

使用JMeter测试表明,Dynamo能够为以下情况提供服务

在文档目录中的静态文件上每分钟40,000个请求(25个线程)

每分钟40,000个针对NumberGuesser的请求,它会重用连接(见下文)

每分钟18,000个针对TickTckToe的请求,它不会重用连接(见下文)

对于来自同一客户端的大量请求,重用连接很重要。这通过使用单个DynamoHTTPConnection.response( html )方法调用而不是对DynamoHTTPConnection.print( html )方法的单独调用来实现。

一如既往,对仓库的重大提交将通过Twitter@Injection4Xcode宣布。

MIT许可证

版权所有 © 2015 John Holdsworth

特此授予任何获得此软件及其相关文档文件(“软件”)副本的人(“许可方”)在软件中无限制地处理的权利,包括但不限于使用、复制、修改、合并、出版、分发、再许可和/或销售软件副本,并允许接收软件的人这样做,前提是从以下条件

在软件的副本或大部分副本中应包含上述版权声明和本许可声明。

软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、适用于特定目的和不侵犯专利权。在任何情况下,作者或版权所有者均不对任何主张、损害或其他责任(无论是基于合同、侵权或其他方式)承担责任,这些责任源自、产生于或与此软件或软件的使用或其他操作有关。