モノリシックベストプラクティスの起源
- 多くの新興企業にとって、ビジネスの初期段階では、ビジネス価値の提供に重点を置く必要があります。また
QPS
、現時点ではユーザー数も非常に少なく、非常に少ないです。よりシンプルな技術アーキテクチャを使用して、ビジネスの提供を加速する必要があります。ビジネス価値。これは、単一ユニットの利点が反映されています。 - 生放送を共有する際によく言ったように、モノマーを使ってビジネス価値を迅速に提供する一方で、ビジネスの発展の可能性も確保する必要があります。ビジネスモジュールをモノマーに明確に分割できます。
go-zero
コミュニティには、モノリシック開発のベストプラクティスを尋ねる小さなパートナーもたくさんいます。
go-zero
広く使われているプログレッシブマイクロサービスフレームワークとして、私は複数の大規模プロジェクトの完全な開発プロセスでそれを生み出しました。当然、単一サービス開発のシナリオも十分に検討しました。
go-zero
図に示すように使用されるモノリシックアーキテクチャは、Service
複数のモノリシックサービスを含む大規模なビジネスもサポートできますPod
。
この記事では、複数のモジュールを使用して単一のサービスをgo-zero
迅速にます。
モノリスの例
単一サービスのアップロードとダウンロードを使用して、go-zero
単一が、なぜそのような例を使用するのでしょうか。
-
go-zero
コミュニティには、アップロードするファイルを定義し、それを使用して自動的に生成するAPI
方法を尋ねる学生がよくいます。goctl
このような問題を最初に目にするのは不思議ですが、このようなサービスをOSS
利用か?多くのシナリオでは、ユーザーがExcelをアップロードする必要があり、サーバーは解析後にファイルを破棄することがわかっています。1つはファイルが小さいこと、もう1つはユーザー数が少ないことですので、このような複雑なプロセスOSS
をかなり合理的だと思います。 -
go-zero
コミュニティの一部の学生は、API
ファイルgoctl
て自動的に生成することにより、ファイルをダウンロードする方法も尋ねました。このような問題がGoを介して行われる理由は、2つあります。1つは、ビジネスの開始時にサービスをデプロイするだけで1つを取得できること、もう1つはgo-zero
、組み込みのJWT
自動認証を使用できることを期待することです。
これは単なる例であり、を介してアップロードとダウンロードを実装する必要Go
がある。次に、このような単一のサービスをどのように解決go-zero
できる。これをファイルサービスと呼びます。アーキテクチャは次のとおりです。
モノリシック実装
API
意味
go-zero
これを使用した学生API
は、説明する形式のファイルを提供していることを知っています。RESTful API
その後、goctl
ワンlogic
ます。ファイルに対応するビジネスロジックを入力するだけで済みます。とサービスがどのように定義されdownload
ているかを見てみましょう。upload
API
Download
サービス定義
要件の例は次のとおりです。
/static/<filename>
パスで指定され<filename>
たファイルをダウンロードします- ファイルの内容を返すだけです
次の内容のディレクトリに名前の付いたファイルapi
を作成します。download.api
syntax = "v1"
type DownloadRequest {
File string `path:"file"`
}
service file-api {
@handler DownloadHandler
get /static/:file(DownloadRequest)
}
zero-api
構文は比較的自明であり、次の意味があります。
syntax = “v1”
zero-api
これを示すv1
構文は次のとおりです。type DownloadRequest
を定義Download
するservice file-api
Download
定義されたリクエストルーティング
Upload
サービス定義
要件の例は次のとおりです。
/upload
パス経由でファイルをアップロードjson
アップロードステータスを返すことにより、より豊富なcode
シナリオを表現するために使用できますHTTP code
次の内容のディレクトリに名前の付いたファイルapi
を作成します。upload.api
syntax = "v1"
type UploadResponse {
Code int `json:"code"`
}
service file-api {
@handler UploadHandler
post /upload returns (UploadResponse)
}
説明は次のとおりです。
syntax = “v1”
zero-api
これを示すv1
構文は次のとおりです。type UploadResponse
Upload
の戻り形式を定義しますservice file-api
Upload
定義されたリクエストルーティング
ここに問題があります
Download
とUpload
サービスを定義しましたが、ユーザーにサービスを提供するためにどのようにサービスに組み込むことができますか?
あなたがいくつかの詳細に気づいたかどうかはわかりません:
Download
または、データ定義の前に接頭辞をUpload
付け、またはなどをrequest
response
Request
Response
- とを定義するときにこれ
download.api
を使用し、upload.api
service
file-api
service name
download-api
upload-api
これの目的は、実際には、これら2つのサービスを同じモノマーに配置したときに、対応するGo
コードです。組み合わせる方法Download
をUpload
〜
モノリシックサービスインターフェイスの定義
簡単にするために、パラメータとしてgoctl
サポートされるのは1つのAPI
ファイルAPI
であり、同時に複数のファイルを受け入れる問題についてはここでは説明しません。単純で効率的な解決策があれば、将来的にサポートされる可能性があります。
次の内容の新しいファイルをディレクトリにapi
作成します。file.api
syntax = "v1"
import "download.api"
import "upload.api"
このようC/C++
にして、とのようなサービスをインポートし#include
ます。ただし、注意すべき点がいくつかあります。Download
Upload
- 定義された構造に同じ名前を付けることはできません
- すべてのファイルに同じものが含まれている
service name
必要
>最も外側のAPI
ファイルにもservice
同じの部分的な定義を含めることができますが、これらAPI
が実際に親レベルに属している場合(およびと同じ論理レベルに属してDownload
いる場合など)を除き、対称に保つことをお勧めします。Upload
file.api
これまでのところ、ファイル構造は次のとおりです。
.
└── api
├── download.api
├── file.api
└── upload.api
モノリシックサービスを生成する
API
インターフェイスの定義ができたので、go-zero
次のことAPI
はgoctl
。
$ goctl api go -api api/file.api -dir .
生成されたファイル構造を見てみましょう。
.
├── api
│ ├── download.api
│ ├── file.api
│ └── upload.api
├── etc
│ └── file-api.yaml
├── file.go
├── go.mod
├── go.sum
└── internal
├── config
│ └── config.go
├── handler
│ ├── downloadhandler.go
│ ├── routes.go
│ └── uploadhandler.go
├── logic
│ ├── downloadlogic.go
│ └── uploadlogic.go
├── svc
│ └── servicecontext.go
└── types
└── types.go
ディレクトリごとのプロジェクトコードの構成を説明しましょう。
api
ディレクトリ:前に定義したAPI
インターフェース、多くを言う必要はありませんetc
ディレクトリ:これはyaml
構成、すべての構成アイテムをfile-api.yaml
ファイルに書き込むことができますfile.go
:main
関数が配置されているファイル、ファイル名はservice
と同じ、サフィックスは削除されます-api
internal/config
ディレクトリ:サービスの構成定義internal/handler
ディレクトリ:API
ファイルで定義されたルートに対応するhandler
実装internal/logic
ディレクトリ:各ルートに対応するビジネス処理ロジックを配置するために使用されます。handler
とlogic
は、ビジネス処理部分の依存関係を可能な限り減らしHTTP requests
、簡単に分割できるようにするためです。の中へRPC service
internal/svc
ディレクトリ:ビジネスロジック処理の依存関係を定義するために使用されます。依存関係のあるリソースをその中に作成main
し、ServiceContext
それらをhandler
とができます。logic
internal/types
ディレクトリ:API
リクエストます
何も変えずに走って効果を見てみましょう。
$ go run file.go -f etc/file-api.yaml
Starting server at 0.0.0.0:8888...
ビジネスロジックを実装する
次に、関連するビジネスロジックを実装する必要がありますが、ここでのロジックはデモンストレーション用であり、実装の詳細にあまり注意を払う必要はありません。logic
レイヤー。
これが行われたいくつかのことです:
-
構成項目の
Path
設定、アップロードされたファイルを配置します。現在のディレクトリを書き込んだデフォルト値は、次の例です。type Config struct { rest.RestConf // 新增 Path string `json:",default=."` }
-
リクエスト本文のサイズ制限を次のように調整しました。
Name: file-api Host: localhost Port: 8888 # 新增 MaxBytes: 1073741824
-
Download
クライアントにファイルを書き込む必要があるため、レイヤーに渡さResponseWriter
れたものとして処理するため、変更されたコードは次のようになります。io.Writer
logic
func (l *DownloadLogic) Download(req *types.DownloadRequest) error { logx.Infof("download %s", req.File) body, err := ioutil.ReadFile(req.File) if err != nil { return err } n, err := l.writer.Write(body) if err != nil { return err } if n < len(body) { return io.ErrClosedPipe } return nil }
-
Upload
ユーザーがアップロードしたファイルを読み取る必要があるhttp.Request
ため、logic
レイヤーます。変更されたコードは次のとおりです。func (l *UploadLogic) Upload() (resp *types.UploadResponse, err error) { l.r.ParseMultipartForm(maxFileSize) file, handler, err := l.r.FormFile("myFile") if err != nil { return nil, err } defer file.Close() logx.Infof("upload file: %+v, file size: %d, MIME header: %+v", handler.Filename, handler.Size, handler.Header) tempFile, err := os.Create(path.Join(l.svcCtx.Config.Path, handler.Filename)) if err != nil { return nil, err } defer tempFile.Close() io.Copy(tempFile, file) return &types.UploadResponse{ Code: 0, }, nil }
完全なコード:https ://github.com/zeromicro/zero-examples/tree/main/monolithic
file
モノリシックサービスは次の方法で開始できます。
$ go run file.go -f etc/file-api.yaml
サービスは次の方法で確認できcurl
ますDownload
。
$ curl -i "http://localhost:8888/static/file.go"
HTTP/1.1 200 OK
Traceparent: 00-831431c47d162b4decfb6b30fb232556-dd3b383feb1f13a9-00
Date: Mon, 25 Apr 2022 01:50:58 GMT
Content-Length: 584
Content-Type: text/plain; charset=utf-8
...
サンプルリポジトリが含まれてupload.html
おり、ブラウザはこのファイルを開いてUpload
サービス。
モノリシック開発の概要
go-zero
モノリシックサービスを開発する完全なプロセスを次のように要約します。
- 次のような個々のサブモジュールを定義する
API
ファイル:download.api
およびupload.api
- 一般
API
ファイル。例:file.api
。import
手順1で定義された各サブモジュールのAPI
ファイル goctl api go
コマンドでモノリシックサービスフレームワークコードを生成する- 対応するサブモジュールのビジネスロジックを実現するために、構成を追加および調整します
さらに、ワンgoctl
クリックで生成およびコーディングできるため、単一のサービスをより迅速に開発できます。SQL
CRUD
cache
プロジェクトアドレス
https://github.com/zeromicro/go-zero
https://gitee.com/kevwan/go-zero
ようこそgo-zero
、スターが私たちをサポートします!
WeChat交換グループ
「マイクロサービスプラクティス」の公式アカウントをフォローし、交換、コミュニティグループのQRコードを取得します。