React, GraphQL, gRPC 및 반응식 마이크로서비스 - Appwish 플랫폼의 데이터 흐름 설명
28215 단어 architecturewebdevopensourcejava
우리는 두 개의 백엔드 마이크로서비스를 예로 사용할 것이다 - graphqlapi 과 wishservice.
만약 당신이 Appwish에 익숙하지 않다면, 이것은 개원 프로젝트입니다. 저는 2주 전에 시작했습니다.이것은 일종의 강좌가 되어야 하는데 130여 명이 저Slack에 가입한 후에 저는 개원 지역사회를 구축하는 데 중점을 두기로 했습니다. 목표는 완전한 개원과 지역사회가 구동하는 진실한 플랫폼을 발표하는 것입니다.
Appwish의 데이터 흐름을 파악하려면 먼저 차트를 살펴보겠습니다.
이 그림은 Appwish에서 구성 요소 간의 데이터 흐름과 상호작용을 보여 줍니다.
UI에서 데이터베이스로 전환하는 방법에 대해 살펴보겠습니다.
모든 것이 전면에서 시작되다
사용자 인터페이스는 GraphQL 클라이언트를 사용하여 GraphQL 쿼리를 전송합니다. 이 쿼리는 우리의 첫 번째 백엔드 마이크로 서비스 GraphQL API 에 접근합니다.
이 섹션은 다음 그림에 표시됩니다.
GraphQL 조회를 보내려면 클라이언트가 GraphQL 모드를 알아야 합니다. 이 모드는 .graphqls files 에 설명되어 있습니다.GraphQL 서버는 이러한 파일을 분석하여 UI 백엔드 통신의 계약으로 사용합니다.
클라이언트가 이 질의를 보냈다고 가정해 보겠습니다.
query {
wish(id: 123) {
title
content
rating
}
}
이 경우 GraphQL 서버는 UI에서 요구하는 데이터(id=123의 소망 제목, 내용, 등급)를 반환해야 합니다얘는 혼자 못해.
GraphQL 서버는 모드를 생성해도 UI에서 요구하는 데이터를 제공할 수 없습니다.
얘는 어떻게 하는지 몰라!모델을 실행 가능한 코드에 연결해야 합니다. 이 코드들은 필요한 데이터를 얻거나 적당한 업무 논리를 실행할 수 있습니다.
다시 말하면 GraphQL 모드에서 선언된 모든 작업은 전달할 수 있는 코드와 연결되어야 한다
필요한 데이터.
이것은 이른바 RuntimeWirings and DataFetchers 을 통해 실현된 것이다.RuntimeWiring은 GraphQL 형식(예를 들어 "wish 조회")과 데이터 가져오기 프로그램(쉽게 말하면 wish 데이터를 얻을 수 있는 코드)을 연결합니다.
이것은 GraphQL 서버 응용 프로그램의 데이터 추출기 소망과 관련된example 연결 GraphQL 형식입니다.
GraphQL 서버는 런타임 케이블 연결 및 데이터 캡처기를 제공하면 필요한 데이터를 전달하는 방법을 알게 됩니다.
그러면 데이터 캡처기를 어떻게 실현하는지 토론해 봅시다.
Appwish는 Vert.x 를 주요 백엔드 프레임워크로 사용하고 gRPC 를 사용하여 서비스에 대한 통신을 하는 것을 알고 있을 것입니다.핵심 수직 중 하나.x 분량은 Event Bus 입니다.이벤트 버스는 응용 프로그램의 각 부분 간의 통신 채널로 사용할 수 있다.다른 응용 프로그램과 통신하는 데도 사용할 수 있지만 Appwish에서는 이 기능을 사용하지 않습니다. gRPC를 사용하여 다른 백엔드 응용 프로그램과 통신합니다.이벤트 버스는 응용 프로그램 내부의 내부 통신에만 사용됩니다.
소망에 대한 데이터를 얻기 위해서는 데이터 획득 프로그램이 다른 서비스인 wish 서비스와 대화해야 합니다.Wish 서비스 담당
소망 데이터와 관련 업무 논리를 관리하다.
이를 위해서는 gRPC 요청을 사용해야 합니다.보시다시피 here,
WishFetcher는 gRPC를 사용하지 않습니다.반대로 이벤트 버스에서 이벤트를 보냅니다."wish id=123에 대한 데이터를 주세요!"
이 부분은 다음 그림의 빨간색 원에서 볼 수 있습니다.
DataFetcher는 이벤트 버스에서 이벤트를 보내고 gRPC Verticle에서 처리합니다.
VerticleVert의 또 다른 중요한 개념이다.x, 간단하게 말하자면, 이벤트를 처리하는 이벤트 순환으로 볼 수 있습니다.그것은 개념적으로 노드와 매우 유사하다.js의 이벤트 순환 - 그것도 실현 Reactor pattern.
gRPC Verticle은 데이터 획득 프로그램이 보내는 이벤트를 탐지하고 gRPC 클라이언트를 사용하여 다른 마이크로서비스에서 필요한 데이터를 가져옵니다.
gRPC verticle은 gRPC 서비스 캐시(클라이언트)를 사용하여 다른 마이크로서비스에서 필요한 데이터를 얻는 부분
다음 그림에 표시됩니다.
gRPC 통신은 어떻게 발생했습니까?
사실 gRPC 클라이언트는 생성된'서비스 캐시'입니다.gRPC를 사용할 때, 기본적으로protobuf를 사용합니다.gRPC는 protobuf를 기본 메시지 교환 형식과 IDL 인터페이스 정의 언어로 사용합니다.
우리는 .proto files 를 만들고 그것을 이용하여 우리가 원하는 모든 프로그래밍 언어의 코드를 생성합니다. 이 예에서는 자바입니다.
예:
message WishProto {
int64 id = 1;
int64 authorId = 2;
string title = 3;
string content = 4;
string url = 5;
string cover_image_url = 6;
}
데이터 전송 대상 클래스를 생성하는 데 사용됩니다. 이 클래스는 우리가 필요로 하는 데이터를 저장하고 매우 효율적으로 서열화합니다.네트워크 전송을 위해 반서열화되다.
이 섹션:
service WishService {
rpc GetAllWish (AllWishQueryProto) returns (AllWishReplyProto) {
}
rpc GetWish (WishQueryProto) returns (WishReplyProto) {
}
rpc CreateWish (WishInputProto) returns (WishReplyProto) {
}
rpc UpdateWish (UpdateWishInputProto) returns (WishReplyProto) {
}
rpc DeleteWish (WishQueryProto) returns (WishDeleteReplyProto) {
}
}
wish 서비스와 통신하는 인터페이스를 정의합니다.모든 rpc 방법에는 이름, 입력, 출력이 있습니다.이 설명을 사용하면 자바 코드를 생성해서 wish 서비스와 다른 서비스와 통신할 수 있습니다
응용
우리가 에서 서비스 성명을 통해 원본 코드를 생성할 때.우리가 동시에 얻은 원형 파일 - 클라이언트와 서버.서비스는 생성된 서버를 사용하여 다른 응용 프로그램에서 요청을 처리하고 다른 응용 프로그램은 생성된 클라이언트로 요청을 보내기를 원합니다.
클라이언트에서 생성된 클라이언트 (서비스 캐시) 는 당신이wish 서비스와 통신하는 데 필요한 모든 내용입니다.우리가 다른 응용 프로그램에서 받은 데이터를 처리하는 논리를 제외하고는 아무것도 실현할 필요가 없습니다.
생성된 클라이언트here.의 사용법을 볼 수 있습니다.
나는 스텁의 사용법을 신속하게 소개할 것이다.
eventBus.<WishQueryProto>consumer(Address.WISH.get(), event -> {
stub.getWish(event.body(), grpc -> {
if (grpc.succeeded()) {
event.reply(grpc.result());
} else {
event.fail(FAILURE_CODE, WISH_SERVICE_COMMUNICATION_ERROR_MESSAGE);
}
});
});
gRPC 클라이언트 서비스는 이벤트 소비자를 등록합니다. 이 소비자는 "WishQueries"를 입력으로 받아들입니다.이벤트가 발생했을 때 (DataFetchers가 wish 데이터를 요청할 때) 위의 코드를 실행합니다.
나무 그루터기.getWish () 를 호출합니다.Stub는 생성된 wish 서비스 gRPC 클라이언트입니다. getWish는 우리가 에서 설명한 내용에 대응합니다.원형 파일:
rpc GetWish (WishQueryProto) returns (WishReplyProto) {
}
보시다시피 WishQueryProt를 입력으로 사용하여 캐시 루트를 호출합니다.메서드, WishReply 출력을 기다립니다.그것은 우리가 중간에서 성명한 내용에 완전히 부합된다.원형 파일 서비스 정의.
다른 프로그램의 결과를 기다리는 것은 비동기적이기 때문에 결과를 기다리는 코드는 lambda 리셋으로 표시되며, 결과가 도착할 때 이 리셋을 호출합니다.
grpc -> {
if (grpc.succeeded()) {
event.reply(grpc.result());
} else {
event.fail(FAILURE_CODE, WISH_SERVICE_COMMUNICATION_ERROR_MESSAGE);
}
}
만약 gRPC 호출이 성공한다면, 우리는 이벤트 버스에서 DataFetcher에 gRPC 요청 결과(WishReply)가 있는 회답을 보낼 것입니다.그렇지 않으면 DataFetcher에 장애가 발생합니다.
좋아, 이거 어려워.UI에서 전송한 GraphQL 쿼리는 GraphQL 서버, DataFetcher 및 gRPC 클라이언트를 거쳐 도착했습니다.
wish 서비스 gRPC 서버에서
이제 gRPC 서버가 어떻게 gRPC 호출에 서비스를 제공하는지 토론합시다
gRPC 서버를 실현하기 위해서도 우리는 에서 설명한 내용을 따라야 한다.원형 파일:
service WishService {
rpc GetAllWish (AllWishQueryProto) returns (AllWishReplyProto) {
}
rpc GetWish (WishQueryProto) returns (WishReplyProto) {
}
rpc CreateWish (WishInputProto) returns (WishReplyProto) {
}
rpc UpdateWish (UpdateWishInputProto) returns (WishReplyProto) {
}
rpc DeleteWish (WishQueryProto) returns (WishDeleteReplyProto) {
}
}
생성된 gRPC 서버는 5가지 방법이 있습니다. GetAllWish, GetWish, CreateWish, UpdateWish, DeleteWish 및 그에 상응하는 입력과 출력 (모든 내용은.proto 파일에 따름) 을 다시 작성하고 실현해야 합니다.우리가 해야 할 일은 바로 이런 방법들을 실현하기 위한 것이다.
소망 서비스에서 그것은 완성되었다 here.
덮어쓰는 방법을 살펴보겠습니다.
/**
* This method gets invoked when other service (app, microservice) invokes stub.getWish(...)
*/
@Override
public void getWish(final WishQueryProto request, final Promise<WishReplyProto> response) {
eventBus.<Optional<Wish>>request(
Address.FIND_ONE_WISH.get(), converter.toDomain(WishQuery.class, request),
event -> {
if (event.succeeded() && event.result().body().isPresent()) {
response.complete(converter.toProtobuf(WishReplyProto.class, new WishReply(event.result().body().get())));
} else if (event.succeeded()) {
response.complete();
} else {
response.fail(event.cause());
}
});
}
보시다시피 방법 이름은 에서 설명한 내용과 일치합니다.원형 파일.WishQuery 입력과 WishReply 약속도 받았습니다.우리가 해야 할 일은 입력을 얻고 데이터베이스와 대화하여 필요한 데이터를 얻고 WishReply 약속을 해결하는 것이다.
Vert를 사용할 때x, 이것은 이벤트 버스를 사용하여 실현된 것이다.이벤트 버스 요청을 보내고 프로세서가 필요한 내용에 응답하기를 기다립니다.
이 섹션은 다음 그림에 표시됩니다.
gRPC 서버는 이벤트 버스를 사용하여 wish 데이터를 요청합니다.이벤트 버스의 두 번째 면에는 데이터베이스 수직 채널이 있습니다. 이 요청을 사용하여 데이터베이스와 대화하고 그 결과로 응답합니다.
Database Verticle은 Database Service를 사용하여 wish 데이터 요청을 정탐하는 처리 프로그램을 등록합니다.
Here's 데이터베이스 서비스의 실현.
보시다시피 이벤트 버스 프로세서는 다음과 같이 설명합니다.
public void registerEventBusEventHandlers() {
eventBus.<AllWishQuery>consumer(Address.FIND_ALL_WISHES.get())
.handler(event -> wishRepository.findAll(event.body()).setHandler(findAllHandler(event)));
eventBus.<WishQuery>consumer(Address.FIND_ONE_WISH.get())
.handler(event -> wishRepository.findOne(event.body()).setHandler(findOneHandler(event)));
eventBus.<WishInput>consumer(Address.CREATE_ONE_WISH.get())
.handler(event -> wishRepository.addOne(event.body()).setHandler(addOneHandler(event)));
eventBus.<UpdateWishInput>consumer(Address.UPDATE_ONE_WISH.get())
.handler(event -> wishRepository.updateOne(event.body()).setHandler(updateOneHandler(event)));
eventBus.<WishQuery>consumer(Address.DELETE_ONE_WISH.get())
.handler(event -> wishRepository.deleteOne(event.body()).setHandler(deleteOneHandler(event)));
}
WishQueries/Inputs가 있는 이벤트 버스 이벤트를 사용합니다.이벤트가 발생할 때, 그들은 wishRepository (실제로 데이터베이스 클라이언트와 SQL 조회와 관련된 논리적인 코드) 를 사용하여 데이터베이스와 상호작용한다.Vert에 반응하기 때문에 데이터베이스 호출은 비동기적이다.x Postgres 클라이언트.
이것이 바로 우리가 wishRepository 방법의 이러한 비동기적인 결과에 대해 프로세서를 설정하는 이유입니다.
// setHandler to react to async result
wishRepository.findOne(event.body()).setHandler(findOneHandler(event))
프로세서는 gRPC Verticle에 응답을 보내서 성공한 경우 이벤트 버스를 통해 데이터베이스에서 데이터를 요청하거나 오류가 발생한 경우 실패를 알립니다. private Handler<AsyncResult<Optional<Wish>>> updateOneHandler(
final Message<UpdateWishInput> event) {
return query -> {
if (query.succeeded()) {
event.reply(query.result(), new DeliveryOptions().setCodecName(Codec.WISH.getCodecName()));
} else {
event.fail(1, "Error updating the wish in the database");
}
};
}
전체 프로세스가 성공하면 데이터는 초기 GraphQL 요청을 보낸 UI로 돌아갑니다.
결론
좋아, 이것이 바로 내가 이 문장에 포괄하고 싶은 모든 내용이다.나는 그것이 당신에게 Appwish project의 데이터 흐름에 대한 고급 개술을 제공할 수 있기를 바랍니다.이렇게 많은 개념이 있어서 나는 모든 세부 사항을 포괄할 수 없다. - 깊이 파고들고 싶다면 내가 댓글에 올린 링크를 사용해서 댓글을 쓰거나 나에게 한 가지 질문을 할 수 있다Slack.
나는 또 너를 이 프로젝트에 공헌하도록 초청하고 싶다.
우리가 한 모든 것은 100% 개원과 투명이다.이미 130여 명이 우리의 대열에 합류했다.우리는 천천히 실시하기 시작하고 있다.더 많은 정보를 알고 싶으면 저의 이전 게시물을 읽고 댓글을 쓰거나 Slack 채널에 가입하세요. 거기서 저는 프로젝트 상태를 자주 업데이트할 것입니다.
Reference
이 문제에 관하여(React, GraphQL, gRPC 및 반응식 마이크로서비스 - Appwish 플랫폼의 데이터 흐름 설명), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/pjeziorowski/react-graphql-grpc-and-reactive-microservices-the-dataflow-in-appwish-platform-explained-34ag텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)