クラウドネイティブ
12594 ワード
低レベルクラウド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アプリケーションにも含まれます.ソースコード
さあGOコードを見てみましょう.
囲碁のコードは、これらの4行を除いてほとんど明白です
// #include <stdio.h>
// #include <stdlib.h>
// #include "response.h"
import "C"
上記の指示は以下のようになります.C.char
( charのデータ型)あるいはC.free()
(割り当てられたメモリの解放方法など)C.SUCCESS
or C.FILE_UPLOAD_ERROR
. *C.char
行くstring
使用できます:C.GoString()
関数はC文字列を作成する(*C.char
) 使えますC.CString()
, チェックcgo より多くのドキュメント.PutObject()
, GetObject()
, and Free()
関数はC型を取り、それを返します.この関数のおかげで、Cからこれらの関数を呼び出します.C.*
関数は、C.free()
関数.だから私も露出Free()
関数は、CのアプリケーションにGOから返されたすべてのオブジェクトが戻って解放されるように送信することができますように.//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でクラウドネイティブアプリをコーディングを開始する準備が整いました!Reference
この問題について(クラウドネイティブ), 我々は、より多くの情報をここで見つけました https://dev.to/lukaszbudnik/cloud-native-c-48mテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol