Swiftバックエンド開発

7300 ワード

原文は静雅斎から、転載は出典を明記してください.
新しい近代的な言語として、Swiftはアップルが言語を開発する上での集大成と言える.多くの言語の長所を吸収している.また、アップルはSwiftがサービス開発に役立つことを期待している.さらに魅力的なのは、コンパイル言語としてC++の一般的な性能を持ち、Golang、Javaに比べてARC管理メモリを使用することでGCによるプロセス停止を回避することです.Swiftはプログラマーが夢見ていた言葉と言える.
Swiftが現在バックエンドで開発している欠点
Swift自体には多くの利点がありますが、バックエンドの開発には依然として責任があります.例えば、次のような問題があります.
  • 現在Ubuntu下のバイナリパケットのみが適合する、RHEL等他のLinux下のバイナリパケット
  • はない.
  • 非MacシステムのIDE開発が不足しており、これはJetbrainsが
  • を期待するしかないように見えます.
  • 他の言語ほど完備していない生態系
  • では、パッケージ管理システムの構文ドキュメントなど、不足しているドキュメントは、ソースコード
  • を自分で表示する必要があります.
  • クロスコンパイルチェーンがないため、Mac上でLinuxで利用可能なバイナリファイル
  • をコンパイルすることはできません.
  • 使いやすいユニットテストが欠けている
  • しかし、これらの問題は現在克服する方法があります.例えば、DockerをSwiftプログラムを搭載する容器として使用し、Macを使用してSwiftプログラムを開発するのも大きな問題ではありません.多くのバックエンド開発はMacで開発されているからです.
    Dockerの役割
    筆者個人はDockerが解決した最大の問題は開発環境と生産環境の矛盾であり、開発者にとって、新しいものを追うことは永遠に必須の素質であり、テストとメンテナンスは環境変更による問題を望んでいないと考えている.例えば、オンラインサーバがCentOSを走っているのに対し、SwiftはUbuntu上で実行しなければならないが、Dockerの出現はこの問題を解決することができる.筆者はDockerで実行するのに最も適しているのはWebのようなサービスであり,NginxやデータベースなどはDockerに置くのに適していないと考えている.状態があるため,Dockerのような急速な消滅と迅速な作成のモードもデータベースのようなデータに厳しい要求を持つ応用には適していない.もちろん、Kubernetesが現在発売しているpetsetは、データベースのようなステータスのあるアプリケーションに適しています.
    Perfectフレームワーク
    PerfectフレームワークはSwiftが開発したWebアプリケーションサーバであり、Redis、SQLite、PostgreSQL、MySQL、MongoDB、FileMakerのようなデータベースをサポートし、fastcgiまたはWebサーバとしてサービスを提供することができる.さらに素晴らしいのは、高品質の中国語ドキュメントです.
    HelloWorld
    Perfectは、次のコマンドを使用してダウンロードできる基礎テンプレートエンジニアリングを提供しています.
    > git clone [email protected]:PerfectlySoft/PerfectTemplate.git

    インストール依存
    > swift package fetch

    コンパイルして実行できます
    #   Debug     
    > swift build
    #   Release     
    > swift build -c release

    分析ハローワールド
    HelloWorldエンジニアリングはPerfect-HTTPServerモジュールに依存し、そのうち2つのソースファイル、arguments.swiftmain.swift main.swiftがあります.
    import PerfectLib
    import PerfectHTTP
    import PerfectHTTPServer
    
    // Create HTTP server.
    let server = HTTPServer()
    
    // Register your own routes and handlers
    var routes = Routes()
    routes.add(method: .get, uri: "/", handler: {
            request, response in
            response.setHeader(.contentType, value: "text/html")
            response.appendBody(string: "Hello, world!Hello, world!")
            response.completed()
        }
    )
    
    // Add the routes to the server.
    server.addRoutes(routes)
    
    // Set a listen port of 8181
    server.serverPort = 8181
    
    // Set a document root.
    // This is optional. If you do not want to serve static content then do not set this.
    // Setting the document root will automatically add a static file handler for the route /**
    server.documentRoot = "./webroot"
    
    // Gather command line options and further configure the server.
    // Run the server with --help to see the list of supported arguments.
    // Command line arguments will supplant any of the values set above.
    configureServer(server)
    
    do {
        // Launch the HTTP server.
        try server.start()
    } catch PerfectError.networkError(let err, let msg) {
        print("Network error thrown: \(err) \(msg)")
    }

    Nodeのexpressフレームワークを使ったことのある友人はよく知っているのではないでしょうか.イベントループを使ってHTTPリクエストを処理していますが、実際には初期のPerfectフレームワークはlibevフレームワークでイベントループのHTTPリクエストを処理しています.arguments.swift
    import PerfectHTTPServer
    import PerfectLib
    
    #if os(Linux)
        import SwiftGlibc
    #else
        import Darwin
    #endif
    
    // Check all command line arguments used to configure the server.
    // These are all optional and you can remove or add arguments as required.
    func configureServer(_ server: HTTPServer) {
        
        var sslCert: String?
        var sslKey: String?
        
        var args = CommandLine.arguments
        
        func argFirst() -> String {
            guard let frst = args.first else {
                print("Argument requires value.")
                exit(-1)
            }
            return frst
        }
        
        let validArgs = [
            "--sslcert": {
                args.removeFirst()
                sslCert = argFirst()
            },
            "--sslkey": {
                args.removeFirst()
                sslKey = argFirst()
            },
            "--port": {
                args.removeFirst()
                server.serverPort = UInt16(argFirst()) ?? 8181
            },
            "--address": {
                args.removeFirst()
                server.serverAddress = argFirst()
            },
            "--root": {
                args.removeFirst()
                server.documentRoot = argFirst()
            },
            "--name": {
                args.removeFirst()
                server.serverName = argFirst()
            },
            "--runas": {
                args.removeFirst()
                server.runAsUser = argFirst()
            },
            "--help": {
                print("Usage: \(CommandLine.arguments.first!) [--port listen_port] [--address listen_address] [--name server_name] [--root root_path] [--sslcert cert_path --sslkey key_path] [--runas user_name]")
                exit(0)
            }]
        
        while args.count > 0 {
            if let closure = validArgs[args.first!.lowercased()] {
                closure()
            }
            args.removeFirst()
        }
        
        if sslCert != nil || sslKey != nil {
            if sslCert == nil || sslKey == nil {
                print("Error: if either --sslcert or --sslkey is provided then both --sslcert and --sslkey must be provided.")
                exit(-1)
            }
            if !File(sslCert!).exists || !File(sslKey!).exists {
                print("Error: --sslcert or --sslkey file did not exist.")
                exit(-1)
            }
            server.ssl = (sslCert: sslCert!, sslKey: sslKey!)
        }
    }

    ここで簡単なのは、HTTPサーバの作成にパラメータを提供することですが、この利点は、パラメータによってより多くの機能を得ることができることです.
    独自のプロジェクトを作成
    まず、swift package initコマンドを使用してプロジェクトを作成します.一般的には、次のようになります.
    > swift package init --type executable

    その後、Package.swiftで依存性が増加したが、Swiftは現在、すべてのIDEがPackageDescriptionモジュールに対するコードプロンプトを提供していない.これはSwift内蔵モジュールであるためと推定される.具体的な内容は、Swiftソースコードで見つけることができます.一般的には以下のような内容を追加すれば
    import PackageDescription
    
    let package = Package(
        name: "XXXX",
        dependencies: [
            .Package(url: "https://github.com/PerfectlySoft/Perfect-HTTPServer.git", majorVersion: 2, minor: 0)
        ]
    )

    その後main.swiftファイルを作成し、HTTPServerリスニングポートを作成すると、独自のプロジェクトを作成できます.
    Docker
    一般的に、Dockerは現在、Swiftを実行するにはUbuntuのミラーを使用する必要があります.SwiftのプリコンパイルパッケージはUbuntuの圧縮パッケージのみを提供しているため、サポートライブラリが不足しているなど、多くのDockerミラーには多くの問題があります.以下の変更が必要です.次に、サンプルを提供します.
    FROM swiftdocker/swift:3.0.1
    MAINTAINER ChasonTang 
    
    RUN apt-get update \
        && apt-get install -y uuid-dev libcurl4-openssl-dev libssl-dev \ 
        && git clone https://github.com/PerfectlySoft/PerfectTemplate /usr/src/PerfectTemplate \
        && apt-get clean \
        && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
    WORKDIR /usr/src/PerfectTemplate
    RUN swift build -c release
    CMD .build/release/PerfectTemplate --port 80

    Perfectがlibcurlを必要とするのは、swift buildが依存を取得する際にcurlを使用してコードを取得するためであり、uuidはPerfectフレームワークに関数ライブラリを内蔵するために必要であり、opensslはPerfect依存のライブラリに必要である.ここではgit clone方式でエンジニアリングコードを取得しますが、COPY命令で現在のディレクトリの下のファイルをコピーすることもできます.