近年、サービスを分離することでアプリケーションを独立した機能モジュールに分割し、アプリケーションの信頼性と拡張性を向上させる、サービス中心のマイクロサービスアーキテクチャの適用がますます広がっています。ただし、マイクロサービス アーキテクチャでは、サービスの数が多いため、サービス間の通信が必然的に複雑になります。この時点で、API ゲートウェイは必須のコンポーネントになります。この記事では、効率的なマイクロサービス API ゲートウェイを構築する go-zero の方法を紹介します。
API ゲートウェイは、イングレス トラフィックを処理し、リクエストと応答を転送するサーバーであり、クライアントとサーバーの間の中間層です。マイクロサービス アーキテクチャでは、API ゲートウェイは主に次の 2 つの役割を果たします。
アーキテクチャ モデルとして、API ゲートウェイには次の特性もあります。
GET /api/user/{id} POST /api/user DELETE /api/user/{id}ステップ 2: マイクロサービスを作成する次に、これらのインターフェイスを処理するマイクロサービスを作成する必要があります。仕える。 go-zero では、
Handlers を定義することでマイクロサービスを実装できます。これらの
Handlers はフレームワークによって自動的に生成され、API ゲートウェイによって呼び出されるサービスに統合されます。
package service import "github.com/tal-tech/go-zero/rest" type Request struct { Id int `json:"id"` } type Response struct { Data string `json:"data"` } type Service interface { GetUser(*Request) (*Response, error) AddUser(*Request) (*Response, error) DeleteUser(*Request) (*Response, error) } type UserService struct { } func NewUserService() *UserService { return &UserService{} } func (s *UserService) GetUser(req *Request) (*Response, error) { return &Response{ Data: "get user success", }, nil } func (s *UserService) AddUser(req *Request) (*Response, error) { return &Response{ Data: "add user success", }, nil } func (s *UserService) DeleteUser(req *Request) (*Response, error) { return &Response{ Data: "delete user success", }, nil } func (s *UserService) HttpHandlers() []rest.Handler { return []rest.Handler{ rest.Get("/api/user/:id", s.GetUser), rest.Post("/api/user", s.AddUser), rest.Delete("/api/user/:id", s.DeleteUser), } }上記のコードでは、前に定義した 3 つのインターフェイスに対応する 3 つのメソッドを含む Service インターフェイスを定義します。同時に、HttpHandlers インターフェイスを実装する必要があります。HttpHandlers インターフェイスは、rest.Handler インターフェイスを実装することで、対応する処理関数にリクエストを直接ルーティングできます。 ステップ 3: API ゲートウェイの構成次に、ルーティング、電流制限ポリシー、サービス検出などの関連情報を API ゲートウェイで構成する必要があります。 go-zero は、マイクロサービスと API ゲートウェイを迅速に作成および管理できる goctl と呼ばれるツールを提供します。
$ curl -sSL https://git.io/godev | bash
$ goctl api new gatewayこのコマンドを実行すると、goctl は、 APIゲートウェイ。
api インターフェイスを定義した後、関連するルーティング構成を追加する必要があります。 go-zero では、ルーティング設定に
Group と
Proxy を使用できます。また、
WithJwtAuth、
WithCircuitBreaker などのメソッドも使用できます。 、など ルートのフィルタリングと制御。
package api import ( "github.com/tal-tech/go-zero/rest" "github.com/tal-tech/go-zero/zrpc" "gateway/internal/service" ) type Api struct { rest.RestHandler } func NewApi() (*Api, error) { userService := service.NewUserService() cli := zrpc.MustNewClient(zrpc.RpcClientConf{ ServiceConf: zrpc.ServiceConf{ Name: "gateway", Etcd: zrpc.EtcdConf{ Endpoints: []string{"localhost:2379"}, Key: "rpc", Timeout: 5000, }, Middleware: []zrpc.Middleware{ zrpc.NewClientMiddleware(), }, }, }) handler := rest.NewGroupRouter("/api"). GET("/user/:id", rest.WithNoti(func(ctx *rest.RestContext) error { response, err := userService.GetUser(&service.Request{Id: ctx.Request.Params["id"]}) if err != nil { return nil } ctx.SendJson(response) return nil })). POST("/user", rest.WithNoti(func(ctx *rest.RestContext) error { response, err := userService.AddUser(&service.Request{}) if err != nil { return nil } ctx.SendJson(response) return nil })). DELETE("/user/:id", rest.WithNoti(func(ctx *rest.RestContext) error { response, err := userService.DeleteUser(&service.Request{Id: ctx.Request.Params["id"]}) if err != nil { return nil } ctx.SendJson(response) return nil })). Proxy(func(ctx *rest.RestContext) error { err := zrpc.Invoke(ctx, cli, "gateway", ctx.Request.Method, ctx.Request.URL.Path, ctx.Request.Params, &ctx.Output.Body) if err != nil { return err } return nil }) return &Api{ RestHandler: handler, }, nil }
api のリクエストが ## にルーティングされることがわかります。 #userService
定義された処理関数。Proxy
を使用して、他の未定義のリクエストを指定されたサービスに転送します。 API を定義した後、API ゲートウェイ サービスを開始できます。
$ go run main.go -f etc/gateway-api.yaml
起動に成功すると、API ゲートウェイが提供するインターフェイスにアクセスできます。
概要
上記の手順により、効率的で強力なマイクロサービス API ゲートウェイを簡単に構築できるため、アプリケーションに拡張性とパフォーマンスの高いアーキテクチャ基盤が提供されます。
以上がgo-zero に基づいて効率的なマイクロサービス API ゲートウェイを構築するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。