2개의 마이크로 서비스 간의 통신
저는 마이크로 서비스 아키텍처로 프로젝트를 만들고 있습니다.그리고 저는 두 개의 마이크로 서비스를 만들었습니다.
하나는 제품 주체를 위한 것이고, 다른 하나는 청구 주체를 위한 것입니다.이들은 자체 엔드포인트를 가지고 있으며 게이트웨이와 함께 연결되어 있습니다(저는 jhipster 마이크로 서비스 아키텍처를 사용하고 있습니다).
청구서가 제품 목록에 액세스해야 합니다.저는 그 두 ms 사이에 어떻게 의사소통을 할 수 있는지 궁금합니다.내 머릿속에는 세 가지 접근법이 있습니다.
bill-ms에서 queue(rabbit MQ 등)로 요청을 전송하여 product-ms에서 이러한 ID를 가진 제품을 가져오십시오(이것의 병목현상이 무엇인지 모르겠습니다).
게이트웨이에 제품 서비스 요청을 전송하고 게이트웨이에서 제품을 가져옵니다(데이터 크기 때문에 지연이 걱정됩니다.이렇게 하면 데이터베이스에 직접 접근할 수 없기 때문에 항상 게이트웨이에 의존합니다).
저장소, 서비스 및 엔티티를 bill-ms로 복제할 수 있습니다(이것은 보기 흉한 방법으로 ms-architecture의 규칙을 어기고 유지보수가 매우 어렵다고 생각합니다).
다른 방법이 있다면 공유해주시면 감사하겠습니다.
편집
- 이제 병목현상이 무엇인지 알게 되었습니다.예를 들어, 3개의 bill-ms 인스턴스가 있으며, rabbit은 어떻게 하면MQ가 응답할 인스턴스를 결정합니까?또는 로드 밸런싱을 위해 리본에 "rabbit MQ로부터의 요구에 가입하기 위한 무료 bill-ms 인스턴스를 주세요"라고 어떻게 말해야 할까요?
내가 대답할 것이 옳은 방법인지 잘 모르겠다.난 아직도 나 자신을 배우고 있어.하지만 마이크로 서비스 시도를 어떻게 구현했는지 말씀드릴 수 있습니다.
★★★★★★★★★★★★★★★★★★★★★★HTTP
이 블로그를 사용하여 커뮤니케이션 기반 마이크로 서비스를 제공합니다.이 조작은 정상적으로 동작하지만 문제는 서비스 간에 의존관계가 형성된다는 것입니다.서비스 A는 서비스 B를 인식하고 (물론 서비스 디스커버리 등을 통해) 직접 호출해야 합니다.이것은 마이크로 서비스를 개발할 때 일반적으로 피하려고 하는 것입니다.
최근에 한 또 다른 은 '아까부터 하다'라는 표현을 거예요.message bus
질문에서 터치한 세 번째 질문입니다.
나는 사람을 저장하는 서비스 A를 가지고 있다(예에 불과하다).이 서비스가 새로운 사용자를 생성할 때 수행하는 작업은 다음과 같습니다.송신한다.event
RabbitMQ
스::personCreatedEvent
이러한 이벤트에 관심이 있는 다른 서비스가 있으면 구독할 수 있습니다.이러한 관심 서비스는 관심 있는 관련 정보를 자체 데이터스토어에 보관합니다.
이 마지막 접근방식에서는 서비스 간에 직접적인 커뮤니케이션이 이루어지지 않기 때문에 서비스 간의 의존성은 거의 없습니다.서비스 A는 서비스 B를 인식하지 않습니다.이는 B가 이벤트를 송신할 뿐이기 때문입니다.RabbitMQ
이러한 이벤트와 관련된 서비스 또는 그 반대도 마찬가지입니다.
물론 서비스를 통해 데이터스토어 간에 중복이 발생합니다.그러나 이 방법에서도 이익을 얻을 수 있습니다.예를 들어 서비스 B는 서비스 A와 동일한 스키마나 데이터 스토어 메커니즘을 사용할 필요가 없습니다.이 서비스에 최적인 방법으로만 관련 정보를 저장합니다.
http://stytex.de/blog/2016/03/25/jhipster3-microservice-tutorial/ Part 2: 서비스 간 커뮤니케이션 섹션을 살펴보셨습니까?실현 방법의 구체적인 예에 대해 설명합니다.
제품 및 Biiling과 관련하여 이벤트로 적합하거나 적합하지 않을 수 있는 사항을 강조하기 위해 이 시나리오에 몇 가지 세부 사항을 추가해 보겠습니다.Billing-MS는 주문이 이루어진 경우에만 Product-MS와 대화해야 합니다.주문은 주로 개별 MS를 대상으로 합니다.주문 작성 또는 발주 시 제품 정보가 행 항목으로 포함됩니다.
주문 작성은 이벤트로 간주할 수 있습니다.Order Creation 이벤트가 발생하면 Billing 서비스 큐에 푸시할 수 있습니다.큐는 Rabbit MQ에서 워크큐로 구현해야 합니다.이렇게 하면 과금-MS의 여러 인스턴스가 동일한 큐에 가입할 수 있지만 한 명의 워커만 처리합니다.서비스를 RabbitMQ에 워커로 등록할 때 RIBON 역할이 없습니다. 각 인스턴스는 큐 및 래빗에 등록됩니다.MQ는 이 이벤트를 처리할 과금 서비스의 인스턴스를 결정합니다.
주문서에 기재된 제품에 대한 자세한 내용은 리본(사용하시는 경우)을 통해 서비스 간 콜 부하를 분산해야 합니다.제품 상세 정보를 얻는 것은 실제로 이벤트가 아니며, 주문도 마찬가지이므로 차이가 있습니다.
또한 Edge 서비스를 노출하기 위해 Gateway를 사용해야 합니다.Service-to-Service 콜의 경우 게이트웨이 서비스를 경유하여 홉하는 것이 이상적이지 않습니다.
하나의 옵션은 eureka 레지스트리에 등록된 이름을 사용하여 마이크로 서비스에 대한 청구 요청을 보내는 것입니다.
마이크로 서비스 A(UAA-SERVICE) 및 마이크로 서비스 B의 솔루션을 사용할 수 있습니다.Microservice B는 Microservice A와 Feign 클라이언트에 콜서비스를 접속하려고 합니다.
1) 이 Microservice B의 코드
@AuthorizedFeignClient(name = "UAA-SERVICE")
공용 인터페이스 UaaServiceClient {
@RequestMapping(method = RequestMethod.GET, path = "api/users")
public List<UserDTO> getUserList();
@RequestMapping(method = RequestMethod.PUT, path = "api/user-info")
public String updateUserInfo(@RequestBody UserDTO userDTO);
}
UAA-SERVICE : 레지스트리와 함께 실행 중인 응용 프로그램인스턴스에서 이 이름을 찾습니다.
2) Microservice B(application.yml)에서 클라이언트 접속 위장 Time Out --------------> feign: config: default:
connectTimeout: 10000 readTimeout: 50000 이미지 설명을 여기에 입력합니다.히스트릭스 스레드 타임아웃을 늘립니다.-------------->
hystrix: 명령어: 기본: 실행: 분리: 스레드: timeoutInMilliseconds: 60000 share Security Context: true
enter image description here 3) main @SpringBootApplication 클래스에 @EnableFeignClients를 추가합니다.-------> 이 솔루션은 정상적으로 동작하고 있습니다.
언급URL : https://stackoverflow.com/questions/36701111/communication-between-two-microservices
'programing' 카테고리의 다른 글
반응 - DOM 렌더링 중에 로드 화면을 표시하시겠습니까? (0) | 2023.03.01 |
---|---|
JSONAray에서 JSONObject 가져오기 (0) | 2023.03.01 |
CSS를 통한 인라인 이미지 표시 (0) | 2023.03.01 |
typescript: 오류 TS2693: 'Promise'는 유형을 나타낼 뿐이지만 여기서 값으로 사용되고 있습니다. (0) | 2023.03.01 |
woocommerce 2.1.5의 도구 메뉴에서 누락된 woocommerce 페이지를 설치하는 방법 (0) | 2023.02.24 |