導入
Hertz は ByteDance が開発した Golang マイクロサービス HTTP フレームワークであり、高い使いやすさ、高いパフォーマンス、高いスケーラビリティの特徴を持っています。
Hertz-demoは公式のケースで、http サービスを非常に高速に構築できます。
package main
import (
"context"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/app/server"
"github.com/cloudwego/hertz/pkg/common/utils"
"github.com/cloudwego/hertz/pkg/protocol/consts"
)
func main() {
h := server.Default()
h.GET("/ping", func(c context.Context, ctx *app.RequestContext) {
ctx.JSON(consts.StatusOK, utils.H{
"message": "pong"})
})
h.Spin()
}
プロジェクト レベルの開発プロセスでは、これだけでは明らかに十分ではなく、Hertx はhz
標準の http サービス ディレクトリを生成するツールも提供します。次のように:
hz new -idl ./demo.thrift
生成されるフォルダーと生成されるコードの構造については、 hertz 公式にも詳しく説明されているので、ここでは詳しく説明しません。
中心となるのはbiz/handler
ディレクトリであり、service
IDLで定義されたインターフェースを継承し、メソッドを書き換えるために使用される、つまりHTTPサービスのサービス層です。
biz/model
その名前と同様、ディレクトリは http サービスのモデル レイヤーであり、データベースに接続してビュー レイヤー データを返すために使用されます。
biz/router
ディレクトリはルーティング層であり、その中のファイルの下にルーティングメソッドが定義されています。
// Register register routes based on the IDL 'api.${HTTP Method}' annotation.
func Register(r *server.Hertz) {
r.GET("/ping", func(c context.Context, ctx *app.RequestContext) {
ctx.JSON(consts.StatusOK, utils.H{
"message": "pong"})
})
}
ルーティング メソッドもここで分離されています。つまり、
biz/handler
サービス メソッドは上のディレクトリに定義されています。これらのメソッドは.HandlerFunc
すべてタイプです。ここでの分離により、メソッドがルートの背後に記述されることが防止され、コード階層が明確になります。
r.GET()
メソッド本体はすべてハンドラー ディレクトリに書き込まれ、ルーターは呼び出しのみを行います。
上記の呼び出し関係は次のとおりです。
biz/model ===> biz/hanlder ===> biz/router
モデルはデータの受け入れと返却を定義し、データベースとビューのインターフェイスを接続します。ハンドラーは論理処理機能を定義し、ルーターはルーティング機能を定義します。分業は明確です。
hz
上記のコードはツールを使用してワンクリックで生成でき、thrift ファイル内でそれに応じて設定するだけでよいことに注意してください。
プロジェクトの最外層にはrouter.go
idl定義以外のルーティングメソッドを定義する機能もあり、そのメソッド本体は引き続きbiz.handler
以下に。
router_gen.go
はいhz
生成されたルート登録コードは、ユーザー定義ルートと hz によって生成されたルートを呼び出すために使用され、その後、main 関数を呼び出してすべてのルートを開始します。
また、router.go を削除して、それをすべて idl で定義することもできます。これは理解しやすいです。biz ディレクトリ内のルーターが呼び出されると、その中にあるすべてのルーティング定義が呼び出されます。ディレクトリ内の Router_gen は自動的にルーターを呼び出します。これにより、サーバーのすべてのサービスが開始できるようになります。
通常の状況では、thrift ファイル内でアノテーションを直接設定するだけで、hz を通じて自動的に生成されます。IDLアノテーションの説明
thrift ファイルを次のように変更します。
namespace go demo
struct addStoreReq{
1:i32 id
2:string storeName
3:i32 type
4:string uuid
5:string identitionTime
6:string createAt
7:i32 status
}
struct deleteReq{
1:i32 id
}
struct updateReq{
1:i32 id
2:string storeName
3:i32 type
4:string uuid
5:string identitionTime
6:string createAt
7:i32 status
}
struct getStoreReq{
1:i32 id
2:string storeName
3:i32 type
4:string uuid
5:string identitionTime
6:string createAt
7:i32 status
}
// 定义HTTP方法,通过hertz注解自动生成
service storeInterface{
i32 addStore(1:addStoreReq req) (api.post="/addstore")
i32 deleteStore(1:deleteReq req) (api.get="/deletestore")
i32 updateStore(1:updateReq req) (api.post="/updatestore")
list<getStoreReq>getStore(1:i32 id 2:string uuid) (api.get="/getstore")
}
以下に示すように、コマンドを使用してhz update -idl demo.thrift --module demo
、更新された thrift ファイルを生成します。コンテキスト パラメータが欠落しているため、モデル内のすべてのファイルがエラーを報告することがわかります。これは、thrift のバージョンが高すぎるためです。このコマンドを
使用してgo mod edit -replace github.com/apache/thrift=github.com/apache/[email protected]
、再生成してください。それ。
hz
コマンドによって生成されたファイルは直接使用できます。次のように生成された後は、コードを変更せずにサーバーを直接起動できます。
現時点では、biz/handler
ルーティング ロジックのメソッド本体を変更するだけで済みます。ヘルツデモ