동기식 통신에는 한 서비스가 다른 서비스에 요청을 보내고 응답을 받을 때까지 해당 작업을 일시 중지하는 실시간 상호 작용이 포함됩니다. REST API와 gRPC는 이러한 유형의 통신을 촉진하는 데 사용되는 일반적인 프로토콜입니다.
RESTful API(Representational State Transfer)는 마이크로서비스 시스템에서 서비스가 서로 통신하는 가장 일반적인 방법 중 하나입니다. REST는 데이터 교환을 위해 HTTP/HTTPS와 JSON 또는 XML 형식을 활용합니다.
일반적으로 서비스는 다른 서비스의 API를 직접 호출하여 서로 상호 작용합니다.
요청 및 응답 예시:
GET /users/12345 HTTP/1.1 Host: api.userservice.com Accept: application/json Authorization: Bearer your-access-token { "userId": "12345", "name": "Michel J", "email": "[email protected]", "address": "Mountain View, Santa Clara, California" }
소스 코드 예시
import org.springframework.web.client.RestTemplate; import org.springframework.http.ResponseEntity; public class OrderService { private final RestTemplate restTemplate = new RestTemplate(); private final String userServiceUrl = "https://api.userservice.com/users/"; public User getUserById(String userId) { String url = userServiceUrl userId; ResponseEntityresponse = restTemplate.getForEntity(url, User.class); return response.getBody(); } }
장점:
다양한 언어 및 도구를 쉽게 배포하고 통합할 수 있습니다.
테스트 및 모니터링 도구를 쉽게 사용할 수 있습니다.
단점:
동기식 특성으로 인해 고속 요구 사항에는 효율적이지 않을 수 있습니다.
네트워크 오류나 연결 끊김을 처리하는 데 어려움이 있을 수 있습니다.
gRPC는 Google Remote Procedure Call의 약자로 고성능 오픈 소스 범용 RPC 프레임워크입니다. 이는 효율적인 데이터 전송을 위해 HTTP/2를 활용하며 일반적으로 구조화된 데이터를 직렬화하기 위한 언어 중립적이고 플랫폼 중립적이며 확장 가능한 메커니즘인 프로토콜 버퍼를 사용하여 전송 및 수신되는 데이터의 구조를 정의합니다.
프로토콜 버퍼의 예, 정의
syntax = "proto3"; package userservice; // Define message User message User { string userId = 1; string name = 2; string email = 3; string address = 4; } // Define service UserService service UserService { rpc GetUserById (UserIdRequest) returns (User); } // Define message UserIdRequest message UserIdRequest { string userId = 1; }
사용자 관리 서비스의 경우 .proto 파일에 제공된 서비스 정의를 준수하는 gRPC 서버를 구현해야 합니다. 여기에는 들어오는 gRPC 요청을 처리하고 적절한 응답을 생성하는 데 필요한 서버 측 로직을 만드는 것이 포함됩니다.
import io.grpc.stub.StreamObserver; import userservice.User; import userservice.UserIdRequest; import userservice.UserServiceGrpc; public class UserServiceImpl extends UserServiceGrpc.UserServiceImplBase { @Override public void getUserById(UserIdRequest request, StreamObserverresponseObserver) { // Assuming you have a database to retrieve user information. User user = User.newBuilder() .setUserId(request.getUserId()) .setName("Michel J") .setEmail("[email protected]") .setAddress("Mountain View, Santa Clara, California") .build(); responseObserver.onNext(user); responseObserver.onCompleted(); } } import io.grpc.Server; import io.grpc.ServerBuilder; public class UserServer { public static void main(String[] args) throws Exception { Server server = ServerBuilder.forPort(9090) .addService(new UserServiceImpl()) .build() .start(); System.out.println("Server started on port 9090"); server.awaitTermination(); } }
장점:
HTTP/2 및 프로토콜 버퍼 사용으로 인한 고성능 및 대역폭 효율성.
다양한 프로그래밍 언어를 지원하며 확장성이 좋습니다.
단점:
서비스가 gRPC를 지원하지 않는 경우 번역 레이어가 필요합니다.
배포 및 관리가 더 복잡할 수 있습니다.
비동기 통신은 서비스가 응답을 기다리기 위해 자체 작업을 차단하지 않고 다른 서비스에 요청을 보내는 프로세스를 의미합니다. 이는 일반적으로 메시지 대기열이나 게시/구독 시스템을 통해 달성됩니다.
RabbitMQ 및 Apache ActiveMQ와 같은 메시지 큐 시스템은 서비스 간 비동기 통신을 촉진합니다.
장점:
향상된 확장성 및 내결함성: 시스템은 증가된 작업 부하를 더 잘 처리할 수 있으며 오류에 덜 민감합니다.
서비스 부하 감소: 요청 송수신을 분리함으로써 주요 서비스는 지속적인 요청에 압도당하지 않고 작업 처리에 집중할 수 있습니다.
단점:
관리 및 유지 관리를 위해 추가적인 노력이 필요할 수 있습니다. 대기열 기반 시스템은 더 복잡할 수 있으며 작동하는 데 더 많은 리소스가 필요할 수 있습니다.
순서 처리 및 메시지 전달 보장의 어려움: 요청이 올바른 순서로 처리되고 메시지가 손실되지 않도록 하는 것은 기술적인 문제가 될 수 있습니다.
Apache Kafka 또는 Google Pub/Sub와 같은 Pub/Sub(게시/구독) 시스템을 사용하면 서비스에서 메시지를 게시하고 주제를 구독할 수 있습니다.
장점:
대규모 및 높은 처리량의 데이터 스트림을 지원합니다.
서비스 간의 종속성을 줄입니다.
단점:
주제와 메시지를 관리하고 모니터링하려면 더 복잡한 계층이 필요합니다.
메시지의 순서 및 안정성 문제를 처리하는 것이 어려울 수 있습니다."
관심이 있으시면 게시/구독 주제에 대한 이전 기사를 읽어보실 수 있습니다.
메시지 브로커의 배달 못한 편지 대기열 1부
메시지 브로커의 배달 못한 편지 대기열 2부
메시지 브로커 시스템 내 일관성 및 신뢰성 문제
이벤트 기반 통신은 서비스가 이벤트를 내보내고 다른 서비스가 해당 이벤트를 기반으로 응답하거나 조치를 취하는 경우입니다.
동기 이벤트는 서비스가 이벤트를 내보내고 다른 서비스의 응답을 기다릴 때 발생합니다.
장점:
이벤트 처리 프로세스를 쉽게 제어하고 모니터링할 수 있습니다.
단점:
서비스 응답이 느리거나 오류가 발생하면 병목 현상이 발생할 수 있습니다.
비동기 이벤트는 서비스가 이벤트를 내보내고 즉각적인 응답을 기다릴 필요가 없을 때 발생합니다.
장점:
대기 시간을 줄이고 확장성을 향상시킵니다.
서비스가 보다 독립적으로 작동하고 상호 종속성을 줄이는 데 도움이 됩니다.
단점:
이벤트가 적시에 올바르게 처리되도록 하려면 추가 메커니즘이 필요합니다.
순서 확보 및 중복 이벤트 처리가 어렵습니다.
마이크로서비스 시스템의 서비스 간 통신 방법 선택은 성능 요구 사항, 안정성, 시스템 복잡성과 같은 요소에 따라 달라집니다. 각 방법에는 고유한 장점과 단점이 있으며 이러한 방법을 이해하면 보다 효율적이고 유연한 마이크로서비스 시스템을 구축하는 데 도움이 됩니다. 가장 적합한 통신 방법을 선택하려면 시스템 요구 사항을 신중하게 고려하십시오.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3