>백엔드 개발 >Golang >Go-Zero를 기반으로 효율적인 마이크로서비스 API 게이트웨이 구축

Go-Zero를 기반으로 효율적인 마이크로서비스 API 게이트웨이 구축

WBOY
WBOY원래의
2023-06-23 10:13:401683검색

최근 몇 년 동안 마이크로서비스 아키텍처의 적용은 서비스 중심이며 서비스를 분리하여 애플리케이션을 독립적인 기능 모듈로 분할함으로써 애플리케이션의 안정성과 확장성을 향상시키는 것이 점점 더 널리 보급되었습니다. 그러나 마이크로서비스 아키텍처에서는 서비스 수가 많기 때문에 서비스 간의 통신이 필연적으로 복잡해집니다. 이 시점에서 API 게이트웨이는 필수 구성 요소가 됩니다. 이 기사에서는 효율적인 마이크로서비스 API 게이트웨이를 구축하는 go-zero의 방법을 소개합니다.

API 게이트웨이란 무엇입니까

API 게이트웨이는 수신 트래픽을 처리하고 요청과 응답을 전달하는 서버입니다. 클라이언트와 서버 사이의 중간 계층입니다. 마이크로서비스 아키텍처에서 API 게이트웨이는 주로 다음 두 가지 역할을 수행합니다.

  • 외부 세계에 통합 인터페이스 제공
  • 내부적으로 요청 라우팅 및 인터페이스 프록시 제공

아키텍처 모델로서 API 게이트웨이는 다음과 같은 특징도 있습니다.

  • 외부에서 들어오는 요청을 내부 서비스로 전달하는 역할
  • 다양한 조건에 따라 요청 라우팅, 필터링 및 변환
  • 인증, 보안 및 전류 제한과 같은 서비스 제공

go-zero 프레임워크

go-zero는 높은 동시성 처리 기능과 간단하고 사용하기 쉬운 프로그래밍 인터페이스를 제공하는 데 전념하는 마이크로서비스 아키텍처용 웹 및 rpc 프레임워크입니다. Golang 표준 라이브러리를 기반으로 구축되었으며 Go 언어의 동시성 기능 및 메모리 관리 이점을 기반으로 효율적인 네트워크 요청 처리를 달성할 수 있습니다.

Go-Zero 프레임워크는 웹 프레임워크, RPC 프레임워크, 마이크로서비스 프레임워크 및 일련의 주변 도구를 제공합니다. 가장 중요한 구성 요소는 Go-Zero 마이크로서비스 프레임워크입니다. 이 프레임워크는 매우 유연하며 특정 비즈니스 요구에 따라 사용자 정의할 수 있습니다. 또한 다음과 같은 장점이 있습니다.

  • 고성능: Golang의 높은 동시성 및 낮은 메모리 소비 기능을 기반으로 go-zero는 고성능 네트워크 처리 및 리소스를 구현합니다. 사용.
  • 확장성: go-zero는 계층형 개발을 지원하고 고부하 서비스를 독립 계층으로 격리하여 안정성과 확장성을 보장할 수 있습니다.
  • 높은 신뢰성: go-zero는 포괄적인 테스트 방법을 사용하여 시스템 기능의 정확성을 보장하고 재시도, 퓨즈 및 전류 제한과 같은 고가용성 설계를 통합하여 시스템의 신뢰성을 향상시킵니다.
  • 풍부한 도구 체인: go-zero는 서비스를 빠르게 개발하고 배포하는 데 도움이 되는 다양한 도구를 제공합니다.

go-zero가 API 게이트웨이를 구축합니다

다음으로 go-zero가 API 게이트웨이를 구축하는 단계를 소개합니다.

1단계: 인터페이스 정의

먼저 몇 가지 API 인터페이스를 정의해야 합니다.

GET /api/user/{id}
POST /api/user
DELETE /api/user/{id}

2단계: 마이크로서비스 작성

다음으로 이러한 인터페이스를 처리하는 마이크로서비스를 작성해야 합니다. 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网关

接下来,我们需要在API网关中配置相关信息,如路由、限流策略、服务发现等。go-zero提供了一个名为goctl的工具,可以帮助我们快速创建和管理微服务和API网关。

  1. 安装goctl工具:

    goctl工具的安装非常简单,只需要通过以下命名进行安装即可:

    $ curl -sSL https://git.io/godev | bash
  2. 创建API网关:

    可以使用以下命令创建API网关:

    $ goctl api new gateway

    执行该命令后,goctl会自动生成一个API网关的代码框架。

  3. 配置路由:

    我们需要在定义api接口后,添加相关的路由配置。在go-zero中,可以使用GroupProxy进行路由配置,同时也可以使用WithJwtAuthWithCircuitBreaker等方法,进行路由过滤和控制。

    示例代码如下:

    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 도구 설치:
    • goctl 도구 설치는 매우 간단합니다. 이름을 지정하여 설치하세요.
    • rrreee
    • API 게이트웨이 만들기:
    • 다음 명령을 사용하여 API 게이트웨이:
    rrreee

    이 명령을 실행한 후 goctl은 자동으로 API 게이트웨이 코드 프레임워크를 생성합니다.

    🎜라우팅 구성: 🎜🎜api 인터페이스를 정의한 후 관련 라우팅 구성을 추가해야 합니다. Go-Zero에서는 라우팅 구성에 GroupProxy를 사용할 수 있으며, WithJwtAuthWithCircuitBreaker도 사용할 수 있습니다. > 경로 필터링 및 제어를 수행하는 기타 방법. 🎜🎜샘플 코드는 다음과 같습니다. 🎜rrreee🎜🎜위 코드에서 api의 요청이 userService , <code>프록시를 사용하여 정의되지 않은 다른 요청을 지정된 서비스로 전달합니다. 🎜🎜API를 정의한 후 API 게이트웨이 서비스를 시작할 수 있습니다. 🎜rrreee🎜시작이 성공적으로 완료되면 API 게이트웨이에서 제공하는 인터페이스에 액세스할 수 있습니다. 🎜🎜요약🎜🎜go-zero를 기반으로 효율적인 마이크로서비스 API 게이트웨이를 구축하는 단계는 다음과 같습니다. 🎜🎜🎜API 인터페이스 정의 🎜🎜마이크로서비스 쓰기 🎜🎜API 게이트웨이 구성 🎜🎜API 게이트웨이 서비스 시작 🎜🎜🎜go-zero 매우 유연하고 확장성이 뛰어난 고성능 마이크로서비스 프레임워크입니다. 웹 프레임워크, RPC 프레임워크, 마이크로서비스 프레임워크를 제공할 뿐만 아니라 효율적인 마이크로서비스 애플리케이션을 빠르게 구축하는 데 도움이 되는 일련의 주변 도구도 제공합니다. 🎜🎜위 단계를 통해 효율적이고 강력한 마이크로서비스 API 게이트웨이를 쉽게 구축할 수 있으며 이를 통해 애플리케이션을 위한 확장성이 뛰어나고 성능이 뛰어난 아키텍처 기반을 제공할 수 있습니다. 🎜

    위 내용은 Go-Zero를 기반으로 효율적인 마이크로서비스 API 게이트웨이 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.