クラウドネイティブ


低レベルクラウドSDK


あなたがクラウドネイティブアプリケーションを書くことについて考えるとき、おそらくJava、JavaScriptのようなより高いレベルのプログラミング言語について考えます.NET、Python、Rubyなど.
しかし、もしあなたが古いCアプリを持っているか?そして、あなたはそれを再ホストしたり、さらに良いプラットフォームに準備している?
さて、主要なクラウドプロバイダーのどれも、C SDKを提供しません.AWSはC +と同じくらい低くなります.どれがいいですか.
でも!すべての主要なクラウドプロバイダは、実際にGO SDKを提供します.そして、GOとそのCGOツールで、我々はすでに家にいます.

囲碁+ GO


私は、AWS S 3バケットにオブジェクトをアップロードしてダウンロードするためにGO機能を呼ぶ本当に単純なCアプリケーションを準備しました.
コードは私のgithub repoにアップロードされます.

ルカスブドゥニク / クラウド


Cloud - Nativ - Cは、CGOを使用してCからAWS GO SDKを使用する方法を示します


The Makefile 本当に簡単ですが、すぐに確認します.
OS:= $(shell uname -s)

ifeq ($(OS), Linux)
    build_cmd = gcc -pthread -o app app.c storage.a
endif
ifeq ($(OS), Darwin)
    build_cmd = gcc storage.a app.c -framework CoreFoundation -framework Security -o app
endif

all: app

app: storage app.c
    $(build_cmd)

storage: storage.go
    go build -buildmode=c-archive storage.go
The storage ルールはコンパイルし、storage.go Cライブラリとして.2つのアーティファクトを生成します.
  • storage.h - この関数は、go関数を呼び出すためにCプログラムが必要とする定義を含んでいます
  • storage.a - コンパイルCライブラリ
  • それ以外storage.go は普通の囲碁プログラムですmain 関数).また、go.mod 依存関係を管理するために.
    The app ルールはコンパイルし、app.c アプリケーション.小さな違いがあるのでgcc MacとLinuxで私は別のparamtersを渡しています.MacOSでは、corefoundationとセキュリティフレームワークをリンクし、Linuxではpthreadライブラリをリンクします.MacOSとLinuxは両方ともGithub上で動作しているmacos-10.15 and ubuntu-20.04 .
    編集:MinLwとWindows 2019のサポートも追加されました.Windowsバイナリも自動的にgithubを使用して構築されてwindows-2019 ランナー.詳細はrepoを見てください.

    ソースコード


    どのようにアプリケーションのように見えるのですか?
    まずCコードを見てみましょう.
    #include <stdio.h>
    #include <string.h>
    #include "response.h"
    #include "storage.h"
    
    int main(int argc, char **argv)
    {
      if (argc != 3)
      {
        fprintf(stderr, "This app requires exactly 2 parameters first is the path to local file and second is the S3 bucket.\n");
        fprintf(stderr, "Example:\n%s app.c my-bucket-name\n", argv[0]);
        return WRONG_PARAMETERS_ERROR;
      }
    
      int res = PutObject(argv[1], argv[2]);
    
      if (res > 0)
      {
        fprintf(stderr, "There was an error uploading the file.\n");
        return res;
      }
    
      char *content = GetObject(argv[1], argv[2]);
      if (content == NULL)
      {
        return FILE_DOWNLOAD_ERROR;
      }
    
      printf("Content of the uploaded file is:\n%s\n", content);
      Free(content);
    
      return SUCCESS;
    }
    
    何も特別.私は2つのヘッダーファイルを含んだ.
  • storage.h - Cgoによって生成され、PutObject() , GetObject() and Free() 関数.これらの関数はCデータ型を取り、返す.
  • response.h - 成功とエラーコードの定義を含みます.このヘッダーファイルはGoアプリケーションにも含まれます.
  • ご覧のように、上記のソースコードは超シンプルで、古い古いCです.

    ソースコード


    さあGOコードを見てみましょう.
    囲碁のコードは、これらの4行を除いてほとんど明白です
    // #include <stdio.h>
    // #include <stdlib.h>
    // #include "response.h"
    import "C"
    
    上記の指示は以下のようになります.
  • stdioとstdlibで定義されている型/メソッド/ディレクティブをCとして公開すると、以下のようになります:C.char ( charのデータ型)あるいはC.free() (割り当てられたメモリの解放方法など)
  • カスタムレスポンスで定義された型/メソッド/ディレクティブを公開します.CとしてのhヘッダーC.SUCCESS or C.FILE_UPLOAD_ERROR .
  • Cとして特別なCGOメソッドを公開する*C.char 行くstring 使用できます:C.GoString() 関数はC文字列を作成する(*C.char ) 使えますC.CString() , チェックcgo より多くのドキュメント.
  • つのポイントに注意してください.
  • それは、CでCでそれからタイプを変えるのがより簡単ですPutObject() , GetObject() , and Free() 関数はC型を取り、それを返します.この関数のおかげで、Cからこれらの関数を呼び出します.
  • 重要なことは、C.* 関数は、C.free() 関数.だから私も露出Free() 関数は、CのアプリケーションにGOから返されたすべてのオブジェクトが戻って解放されるように送信することができますように.
  • ゴーラングアプリはこのように見えます.The //export Function それ以外の場合、cgoはstorage.h ヘッダーファイル.
    //export PutObject
    func PutObject(filenameC, bucketC *C.char) int {
        filename := C.GoString(filenameC)
        bucket := C.GoString(bucketC)
    
        cfg, err := config.LoadDefaultConfig(context.TODO())
        if err != nil {
            fmt.Fprintf(os.Stderr, "configuration error: %v\n", err.Error())
            return C.CONFIGURATION_ERROR
        }
        (...)
    }
    //export GetObject
    func GetObject(keyC, bucketC *C.char) *C.char {
        key := C.GoString(keyC)
        bucket := C.GoString(bucketC)
        (...)
        return C.CString(content)
    }
    //export Free
    func Free(ptr *C.char) {
        C.free(unsafe.Pointer(ptr))
    }
    

    ビルアンドランニング


    アプリケーションをビルドして実行するには、以下のようにします.
    $ make all
    go build -buildmode=c-archive storage.go
    gcc storage.a app.c -framework CoreFoundation -framework Security -o app
    $ ./app app.c my-bucket-name
    File uploaded correctly, version id: Uzp7G2ehns7AtQdwpPrQoTQriXKbeldA
    File version id: Uzp7G2ehns7AtQdwpPrQoTQriXKbeldA
    Content of the uploaded file is:
    #include <stdio.h>
    #include <string.h>
    #include "response.h"
    #include "storage.h"
    (...)
    
    今ではよくCでクラウドネイティブアプリをコーディングを開始する準備が整いました!