최근 몇 년 동안 마이크로서비스 아키텍처의 적용은 서비스 중심이며 서비스를 분리하여 애플리케이션을 독립적인 기능 모듈로 분할함으로써 애플리케이션의 안정성과 확장성을 향상시키는 것이 점점 더 널리 보급되었습니다. 그러나 마이크로서비스 아키텍처에서는 서비스 수가 많기 때문에 서비스 간의 통신이 필연적으로 복잡해집니다. 이 시점에서 API 게이트웨이는 필수 구성 요소가 됩니다. 이 기사에서는 효율적인 마이크로서비스 API 게이트웨이를 구축하는 go-zero의 방법을 소개합니다.
API 게이트웨이는 수신 트래픽을 처리하고 요청과 응답을 전달하는 서버입니다. 클라이언트와 서버 사이의 중간 계층입니다. 마이크로서비스 아키텍처에서 API 게이트웨이는 주로 다음 두 가지 역할을 수행합니다.
아키텍처 모델로서 API 게이트웨이는 다음과 같은 특징도 있습니다.
go-zero는 높은 동시성 처리 기능과 간단하고 사용하기 쉬운 프로그래밍 인터페이스를 제공하는 데 전념하는 마이크로서비스 아키텍처용 웹 및 rpc 프레임워크입니다. Golang 표준 라이브러리를 기반으로 구축되었으며 Go 언어의 동시성 기능 및 메모리 관리 이점을 기반으로 효율적인 네트워크 요청 처리를 달성할 수 있습니다.
Go-Zero 프레임워크는 웹 프레임워크, RPC 프레임워크, 마이크로서비스 프레임워크 및 일련의 주변 도구를 제공합니다. 가장 중요한 구성 요소는 Go-Zero 마이크로서비스 프레임워크입니다. 이 프레임워크는 매우 유연하며 특정 비즈니스 요구에 따라 사용자 정의할 수 있습니다. 또한 다음과 같은 장점이 있습니다.
다음으로 go-zero가 API 게이트웨이를 구축하는 단계를 소개합니다.
먼저 몇 가지 API 인터페이스를 정의해야 합니다.
GET /api/user/{id} POST /api/user DELETE /api/user/{id}
다음으로 이러한 인터페이스를 처리하는 마이크로서비스를 작성해야 합니다. Go-Zero에서는 Handlers
를 정의하여 마이크로서비스를 구현할 수 있습니다. 이러한 Handler
는 프레임워크에 의해 자동으로 생성되고 API 게이트웨이에서 호출되는 서비스에 통합될 수 있습니다. 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), } }
在上述代码中,我们定义了一个Service接口,其中包含三个方法,分别对应前面定义的三个接口。同时,我们需要实现HttpHandlers接口,该接口可以通过实现rest.Handler接口,直接将请求路由到对应的处理函数中。
接下来,我们需要在API网关中配置相关信息,如路由、限流策略、服务发现等。go-zero提供了一个名为goctl的工具,可以帮助我们快速创建和管理微服务和API网关。
安装goctl工具:
goctl工具的安装非常简单,只需要通过以下命名进行安装即可:
$ curl -sSL https://git.io/godev | bash
创建API网关:
可以使用以下命令创建API网关:
$ 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
$ go run main.go -f etc/gateway-api.yaml위 코드에서는 이전에 정의한 세 가지 인터페이스에 해당하는 세 가지 메서드를 포함하는 서비스 인터페이스를 정의합니다. 동시에, Rest.Handler 인터페이스를 구현하여 요청을 해당 처리 기능으로 직접 라우팅할 수 있는 HttpHandlers 인터페이스를 구현해야 합니다. 3단계: API 게이트웨이 구성다음으로 라우팅, 현재 제한 정책, 서비스 검색 등과 같은 API 게이트웨이 관련 정보를 구성해야 합니다. go-zero는 마이크로서비스와 API 게이트웨이를 빠르게 생성하고 관리하는 데 도움이 되는 goctl이라는 도구를 제공합니다.
이 명령을 실행한 후 goctl은 자동으로 API 게이트웨이 코드 프레임워크를 생성합니다.
🎜라우팅 구성: 🎜🎜api
인터페이스를 정의한 후 관련 라우팅 구성을 추가해야 합니다. Go-Zero에서는 라우팅 구성에 Group
및 Proxy
를 사용할 수 있으며, WithJwtAuth
및 WithCircuitBreaker
도 사용할 수 있습니다. > 경로 필터링 및 제어를 수행하는 기타 방법. 🎜🎜샘플 코드는 다음과 같습니다. 🎜rrreee🎜🎜위 코드에서 api
의 요청이 userService , <code>프록시
를 사용하여 정의되지 않은 다른 요청을 지정된 서비스로 전달합니다. 🎜🎜API를 정의한 후 API 게이트웨이 서비스를 시작할 수 있습니다. 🎜rrreee🎜시작이 성공적으로 완료되면 API 게이트웨이에서 제공하는 인터페이스에 액세스할 수 있습니다. 🎜🎜요약🎜🎜go-zero를 기반으로 효율적인 마이크로서비스 API 게이트웨이를 구축하는 단계는 다음과 같습니다. 🎜🎜🎜API 인터페이스 정의 🎜🎜마이크로서비스 쓰기 🎜🎜API 게이트웨이 구성 🎜🎜API 게이트웨이 서비스 시작 🎜🎜🎜go-zero 매우 유연하고 확장성이 뛰어난 고성능 마이크로서비스 프레임워크입니다. 웹 프레임워크, RPC 프레임워크, 마이크로서비스 프레임워크를 제공할 뿐만 아니라 효율적인 마이크로서비스 애플리케이션을 빠르게 구축하는 데 도움이 되는 일련의 주변 도구도 제공합니다. 🎜🎜위 단계를 통해 효율적이고 강력한 마이크로서비스 API 게이트웨이를 쉽게 구축할 수 있으며 이를 통해 애플리케이션을 위한 확장성이 뛰어나고 성능이 뛰어난 아키텍처 기반을 제공할 수 있습니다. 🎜위 내용은 Go-Zero를 기반으로 효율적인 마이크로서비스 API 게이트웨이 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!