GraphQL API 게이트웨이를 사용하여 마이크로서비스 아키텍처 개선

14795 단어 webdevgraphql
작성자Alec Brunelle✏️
조직이 발전함에 따라 보통 여러 개의 API 서비스를 만들고 모든 서비스는 자신의 기능 집합을 제공한다.이러한 서비스를 제외하고, 사용자는 사용자에게 서로 다른 클라이언트 응용 프로그램을 제공하여 당신의 제품을 사용해야 합니다.결과적으로 아키텍처는 다음과 같습니다.

클라이언트 애플리케이션마다 요구 사항이 다름
이런 상황이 발생한 원인은 매우 많다.시간의 추이에 따라 팀 구조는 서비스의 창설을 지도할 수 있다. 그 당시에 한 팀에게 하나의 코드 라이브러리를 가지게 하는 것이 한 팀에게 서비스 소유권을 가지게 하는 것보다 쉽다.
또 다른 원인은 제품의 서로 다른 기능이 서로 다른 확장 문제를 가지고 있기 때문일 수 있다.예를 들어, 당신의 분석 창고는 사용자의 로그인 창고와 전혀 다른 수요를 가지고 있기 때문에, 둘을 결합시키는 것은 무의미하다.
원인이 무엇이든지 이런 유형의 구조는 백엔드 서비스팀과 백엔드 고객팀의 미래 개발을 늦출 수 있다.클라이언트 응용 프로그램은 여러 프로토콜과 상호작용을 하고 서로 다른 인증 정책을 사용해야 한다. 어떤 API가 어떤 종류의 데이터를 제공할지 걱정하고, 여러 개의 API 호출을 해서 한 페이지의 데이터를 검색할 수 있다.
모든 API 서비스를 재구성하거나 전체 아키텍처를 재구성하는 것(비싸고 위험함)보다는 API gateways이 도움이 됩니다.

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


API 게이트웨이는 마이크로 서비스에 있어서 결코 새로운 일이 아니다.많은 개발자들이 여러 원본에서 데이터를 얻기 위해 클라이언트 프로그램에 단일 인터페이스 (프로토콜) 를 제공하는 것을 본 적이 있다.
이들은 단일 API 프로토콜, 단일 인증 메커니즘을 제공하고 고객이 새로운 기능을 개발할 때 한 팀과 대화만 할 수 있도록 함으로써 앞에서 설명한 문제를 해결할 수 있다.
한편, GraphQLAPI 게이트웨이를 사용하는 것은 비교적 새로운 개념으로 최근 유행하고 있다.이는 GraphQL의 일부 속성이 API 게이트웨이에 적합하기 때문입니다.
GraphQL API 게이트웨이는 하나의 단일한 정의 모델과 여러 개의 서로 다른 마이크로 서비스에서 온 원본 데이터를 가지고 있기 때문에 클라이언트는 데이터가 어디에서 왔는지 모르는 상황에서 여러 필드의 조합을 조회할 수 있다.
이 기능을 통해 데이터를 어떻게 검색하는지는 더 이상 누구와 이야기하는 문제가 아니라 데이터가 GraphQL schema에 있는 위치를 발견했다.

많은 JavaScript 패키지가 개발을 지원합니다.어떤 것들은GraphQLAPI 인터페이스를 실현하기 위해 추상적인 것을 제공하고, 다른 것들은 당신을 위해 더 많은 것을 할 수 있습니다.

GraphQL 게이트웨이를 사용하여 모드 결합


새로운 서비스와 기존 서비스로부터 작업을 수신하고 데이터를 반환하는 API 게이트웨이 서비스가 필요합니다.우리는 두 가지 다른 방식으로 이 점을 실현할 수 있다. schema stitching 또는 federation.
시간을 절약하기 위해서, 우리는 모델 결합을 더욱 자세하게 연구할 것이지만, 당신은 GraphQL federation in this article에 대한 더 많은 정보를 얻을 수 있습니다.
사용할 JavaScript 패키지에 따라 사용자 정의 노드를 작성할 수 있습니다.jsGraphQL 서버는 Apollo ServerMercurius와 유사하다. 우리는 클라이언트로부터의GraphQL 조작을 설명하기 위해 코드를 작성하여 하위 API로 보내고 클라이언트가 원하는 데이터를 되돌려준다.
이런 방법은 많은 시간을 필요로 하지만, 당신의 상황에 따라 의미가 있을 수 있습니다.고객의 조직과 모범 사례에 맞게 조정할 수 있다는 장점이 있습니다.

GraphQL Mesh를 GraphQL API 게이트웨이로 사용


다른 한편, GraphQL Mesh와 같은 라이브러리는 자동으로 여러 개의 데이터 원본을 하나의GraphQL API에 봉합한다.이것은 개발 시간을 절약할 수 있지만, 많은 일을 하는 라이브러리처럼 사용자 정의 덮어쓰기를 제공해야 할 수도 있습니다.
GraphQL Mesh는 GraphQL API 게이트웨이뿐만 아니라 데이터 맵 역할을 합니다.OpenAPI/Swagger REST API, gRPC API, 데이터베이스,GraphQL 등 다양한 데이터 원본을 지원합니다.이러한 데이터 소스를 가져와 GraphQL API로 변환한 다음 함께 봉합합니다.
이러한 라이브러리의 강력한 기능을 보여주기 위해 간단한 스페이스X 비행 로그 API를 만들 것입니다.우리의 응용 프로그램은 우리가 여러 해 동안 참가한 모든 스페이스X 발사를 기록할 것이다.이것은 이 프로젝트의 GitHub repo 버전입니다.
Google 응용 프로그램은 두 개의 데이터 원본을 사용합니다. 하나는 스페이스X의 발사 상황을 알려주는 공공 GraphQL API이고, 하나는 로컬 MongodB 데이터베이스입니다.
GraphQL SpaceX API는 에이전트를 통해 우리에게 제공될 것입니다. 그러나 GraphQL Mesh는 Google MongoDB 데이터베이스 연결에 새로운 조작을 제공할 것입니다.그것은 우리로 하여금 사용자를 창조하게 하고, 우리가 참가한 발표회를 표시할 것이다.
먼저 라이브러리를 설치합니다.
npm install @graphql-mesh/cli @graphql-mesh/graphql @graphql-mesh/mongoose graphql mongoose
이제 MongoDB 모드를 설명하는 기본 Mongoose 모델을 만듭니다.
// ./src/models.js
const { model, Schema } = require("mongoose");
const UserSchema = new Schema(
  {
    name: {
      type: String,
    },
  },
  {
    collection: "users",
  }
);
const User = model("User", UserSchema);
const LaunchesAttendedSchema = new Schema(
  {
    spacexLaunchID: {
      type: String,
    },
    userId: { type: "ObjectId", ref: "User" },
  },
  {
    collection: "launches_attended",
  }
);
const LaunchesAttended = model("LaunchesAttended", LaunchesAttendedSchema);
module.exports = {
  User,
  LaunchesAttended,
};
그런 다음 GraphQL 그리드 구성 파일.meshrc.yaml을 만듭니다.
// .meshrc.yml
sources:
  - name: SpaceX
    handler:
      graphql:
        endpoint: https://api.spacex.land/graphql/
        method: POST
  - name: Mongoose
    handler:
      mongoose:
        connectionString: mongodb://admin:password@localhost:27017/test?authSource=admin&readPreference=primary&appname=MongoDB%20Compass&directConnection=true&ssl=false
        models:
          - name: User
            path: ./src/models.js#User
          - name: LaunchesAttended
            path: ./src/models.js#LaunchesAttended
Docker Composeexample docker-compose.yml here를 사용하여 MongoDB 데이터베이스를 시작합니다.
docker-compose up mongo
이렇게!새로운 GraphQL 서버에 제공되는 기능:
./node_modules/.bin/graphql-mesh serve
GraphiQL 실례를 보여 드리겠습니다. GraphiQL 서버를 조회하는 데 아주 좋은 인터페이스입니다.문서의 사이드바를 클릭하여 우리가 사용할 수 있는 옵션을 탐색하십시오.너는 우리가 과거의 발사를 볼 수 있는 방법이 있다는 것을 알아차릴 것이다.

우리의 새로운 기능을 테스트하기 위해서, 우리는 과거의 발사를 조회하고, 목록에서 하나를 선택하고, MongoDB 데이터베이스에 줄을 만들어서, 사용자가 스페이스X를 사용하여 참고할 수 있도록 할 수 있습니다.
먼저 사용자를 만듭니다.
mutation CreateUser($input: CreateOneUserInput!) {
  userCreateOne(record: $input) {
    recordId
  }
}
지금, 발사를 통해:
query PastLaunches {
  launchesPast(limit: 10) {
    mission_name
    id
    launch_date_local
  }
}
게시를 참석자로 표시하기
mutation LaunchesAttendedCreateOne($input: CreateOneLaunchesAttendedInput!) {
  launchesAttendedCreateOne(record: $input) {
    recordId
  }
}
마지막으로 당신이 전에 참가한 모든 발표회를 보세요.
query LaunchesAttended {
  launchesAttendedFindMany {
    spacexLaunchID
    userId
  }
}

결론


짧은 시간(그리고 몇 개의 프로필 이후)에 우리는 자신의 GraphQL API 인터페이스를 구축할 수 있다. 이것은 SpaceX GraphQL API와 로컬 몬고 DB 데이터베이스에서 생성된 GraphQL API를 봉합하여 우리가 참여한 작동을 기록하는 프로그램을 만들 수 있다.이 용례는GraphQL 게이트웨이가 고객의 개발자 체험에 얼마나 강한지 보여준다.
이 게이트웨이가 없으면 클라이언트는 각각 두 개의 API를 조회해야 합니다.반면 GraphQL Mesh는 Mongo 데이터베이스에서 실행할 수 있는 기본적인 CRUD 조작을 신속하게 생성하여 Google 응용 프로그램이 사용자에 특정한 기능을 가지도록 도와줍니다.
전반적으로 말하면 API 게이트웨이와 대량의 라이브러리를 사용하여 분포식 시스템을 구축하는 데 도움을 줄 수 있는 방법이 많은데 이 시스템은 성능, 안전성과 다중 팀 조직을 대상으로 미세하게 조정할 수 있다.

운영 중단 및 느린 GraphQL 요청 모니터링


GraphQL은 디버깅 요청과 응답 기능이 있지만 GraphQL이 생산 응용 프로그램에 안정적으로 자원을 제공할 수 있도록 확보하는 것은 더욱 어려워졌다.백엔드 또는 타사 서비스에 대한 네트워크 요청이 성공적으로 이루어졌는지 확인하려는 경우try LogRocket.

LogRocket 인터넷 응용 프로그램의 DVR처럼 당신의 사이트에서 발생한 모든 것을 기록합니다.문제가 발생한 원인을 추측하는 것이 아니라 문제의 GraphQL 요청을 모아서 보고할 수 있습니다.또한 Apollo 클라이언트 상태를 추적하고 GraphQL 쿼리의 키 값 쌍을 확인할 수 있습니다.
LogRocket은 웹 페이지의 불러오는 시간, 첫 번째 바이트의 시간, 느린 네트워크 요청, Redux, NgRx, Vuex 작업/상태를 기록하는 기기를 제공합니다.Start monitoring for free .

좋은 웹페이지 즐겨찾기