Skip to content

Getting Started (5min) korean ver

onigiri edited this page Oct 2, 2022 · 4 revisions

5λΆ„λ§Œμ— λ©”μ‹œμ§• 인프라 κ΅¬μ„±ν•˜κΈ°

ZSMQ λ₯Ό μ΄μš©ν•΄μ„œ 5λΆ„λ§Œμ— λ©”μ‹œμ§• ν”Œλž«νΌμ„ κ΅¬μ„±ν•΄λ΄…μ‹œλ‹€.

μ˜ˆμ œλŠ” λ‹€μŒκ³Ό 같은 상황을 κ΅¬ν˜„ν•©λ‹ˆλ‹€.

image
  • order-service μ—μ„œ 두가지 이벀트λ₯Ό λ°œν–‰ν•©λ‹ˆλ‹€.
    1. ORDER-CONFIRMED
    2. ORDER-CANCELED
  • delivery-service μ—μ„œλŠ” 두가지 이벀트λ₯Ό consume ν•©λ‹ˆλ‹€
    • ORDER-CONFIRMED 의 payload λŠ” 객체 ν˜•νƒœμž…λ‹ˆλ‹€.
    • ORDER-CANCELED 의 payload λŠ” String ν˜•νƒœμž…λ‹ˆλ‹€.

μˆœμ„œ

ꡬ성 μˆœμ„œλŠ” README 에 μ‘΄μž¬ν•˜λŠ” quick start λ₯Ό κ·ΈλŒ€λ‘œ λ”°λ¦…λ‹ˆλ‹€.

  1. run messaging server and dashboard
  2. gradle dependency
  3. configure property
  4. just U.S.E it

1. run messaging server and dashboard

μš°μ„  도컀λ₯Ό μ΄μš©ν•΄μ„œ messaging μ„œλ²„μ™€ dashboard λ₯Ό μ‹€ν–‰μ‹œν‚΅λ‹ˆλ‹€.

image

잘 μ‹€ν–‰λœ 것을 ν™•μΈν•©λ‹ˆλ‹€.

2. gradle dependency

gradle μ˜μ‘΄μ„±μ„ μΆ”κ°€ν•˜κΈ° μœ„ν•΄μ„œ λ‘κ°œμ˜ spring application 을 μƒμ„±ν•΄μ€λ‹ˆλ‹€.

image

그리고 각각의 build.gradle μ—μ„œ μ˜μ‘΄μ„±μ„ μΆ”κ°€ν•©λ‹ˆλ‹€.

image

version 은 release note λ₯Ό ν™•μΈν•΄μ£Όμ„Έμš”

3. configure property

두 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μš©λ„λŠ” μ„œλ‘œ λ‹€λ¦…λ‹ˆλ‹€.

  1. order-service (produce)
  2. delivery-service (consume)

order-service, produce

order-service λŠ” λ©”μ‹œμ§€λ₯Ό λ°œν–‰ν•˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μž…λ‹ˆλ‹€.

λ‹€μŒκ³Ό 같이 application.yml μ„€μ •ν•˜μ„Έμš”

image

zsmq.listening 을 false 둜 μ€€λ‹€λŠ” 것은 λ©”μ‹œμ§€ λ¦¬μŠ€λ„ˆ μŠ€λ ˆλ“œλ₯Ό μ‹€ν–‰μ‹œν‚€μ§€ μ•Šκ² λ‹€λŠ” λœ»μž…λ‹ˆλ‹€.

이제 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•΄λ΄…μ‹œλ‹€!

Order.java

κ°„λ‹¨ν•œ Order 객체λ₯Ό μ •μ˜ν•˜κ³  Order 객체λ₯Ό delivery-service 둜 전달할 κ²ƒμž…λ‹ˆλ‹€.

@Value(staticConstructor = "of")
public class Order {
    String orderId;
    String address;
    int price;
}

MessagePublisher.java

그리고 κ°„λ‹¨ν•œ message publisher λ₯Ό κ΅¬ν˜„ν•΄μ€λ‹ˆλ‹€.

@Component
@RequiredArgsConstructor
public class MessagePublisher {
    private final ZolaQueueMessageTemplate template;

    public void sendConfirmedMessage(Order order) {
        template.convertAndSend("ORDER-CONFIRMED", order);
    }

    public void sendCanceledMessage(String orderId) {
        template.convertAndSend("ORDER-CANCELED", orderId);
    }
}

ZolaQueueMessageTemplate λ₯Ό μ΄μš©ν•΄μ„œ convert 와 send λ₯Ό μ‰½κ²Œ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

객체 ν˜•μ‹μœΌλ‘œ 전달할 μˆ˜λ„ 있고 λ‹¨μˆœ λ¬Έμžμ—΄ ν˜•μ‹μœΌλ‘œ 전달할 수 μžˆμŠ΅λ‹ˆλ‹€.

OrderController.java

@RestController
@RequiredArgsConstructor
public class OrderController {

    private static final Order[] SAMPLE_ORDERS = {
            Order.of(UUID.randomUUID().toString(), "Seoul", 125_000_000),
            Order.of(UUID.randomUUID().toString(), "New York", 25_602_900),
            Order.of(UUID.randomUUID().toString(), "singapore", 5_120_000),
            Order.of(UUID.randomUUID().toString(), "tokyo", 9_000_000),
    };

    private final MessagePublisher publisher;

    @GetMapping("/orders/{index}/confirm")
    public boolean confirm(@PathVariable int index) {
        try {
            Order order = SAMPLE_ORDERS[index];
            publisher.sendConfirmedMessage(order);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    @GetMapping("/orders/{index}/cancel")
    public boolean cancel(@PathVariable int index) {
        try {
            String orderId = SAMPLE_ORDERS[index].getOrderId();
            publisher.sendCanceledMessage(orderId);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}

κ°„λ‹¨ν•œ controller λ₯Ό κ΅¬ν˜„ν•΄μ€μ‹œλ‹€.

2개의 api κ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€.

  1. orders/{index}/confirm : 객체λ₯Ό publish
  2. orders/{index}/cancel : λ¬Έμžμ—΄μ„ publish

이제 message λ₯Ό produce ν•˜λŠ” μͺ½μ€ λͺ¨λ“  μ€€λΉ„κ°€ λλ‚¬μŠ΅λ‹ˆλ‹€.

delivery-service, consume

delivery-service λŠ” λ©”μ‹œμ§€λ₯Ό consume ν•  것이기 λ•Œλ¬Έμ— λ‹€μŒκ³Ό 같이 yml 에 λ¦¬μŠ€λ‹ μŠ€λ ˆλ“œλ₯Ό ν™œμ„±ν™”μ‹œμΌœμ€˜μ•Ό ν•©λ‹ˆλ‹€.

image

zsmq.listening λ₯Ό true 둜 μ„€μ •ν•˜μ„Έμš”.

λ‘κ°œμ˜ 큐λ₯Ό consuming ν•  λ‹€μŒ 두 processor λ₯Ό λ§Œλ“€μ–΄μ£Όμ„Έμš”.

OrderCanceledProcessor.java

order-service 의 orders/{index}/cancel κ°€ 호좜되면 λ°œν–‰λ˜λŠ” queue λ₯Ό consume ν•©λ‹ˆλ‹€.

@Component
@ZolaConsumer
@Slf4j
public class OrderCanceledProcessor {
    @ZolaMessageListener(queueName="ORDER-CANCELED", deletionPolicy = DeletionPolicy.ALWAYS)
    public void listen(String message) {
        log.info("order was canceled id: [{}]", message);
    }
}

@ZolaMessageListener λ₯Ό μ‚¬μš©ν•  λ•Œ λ©”μ„œλ“œμ˜ νŒŒλΌλ―Έν„°λŠ” ν•˜λ‚˜μ˜ String νƒ€μž… 이어야 ν•©λ‹ˆλ‹€.

ν•΄λ‹Ή λ§€κ°œλ³€μˆ˜λ‘œ consume ν•œ 데이터λ₯Ό μ „λ‹¬ν•©λ‹ˆλ‹€.

OrderConfirmedProcessor.java

order-service 의 orders/{index}/confirm κ°€ 호좜되면 λ°œν–‰λ˜λŠ” queue λ₯Ό consume ν•©λ‹ˆλ‹€.

@Component
@ZolaConsumer
@Slf4j
public class OrderConfirmedProcessor {

    @ZolaMessageListener(queueName="ORDER-CONFIRMED", deletionPolicy = DeletionPolicy.ALWAYS)
    public void listen(String message) {
        log.info("json : {}", message);
        Order order = ZolaJsonSerializer.getInstance().deserialize(message, Order.class);
        log.info("order was confirmed : id : {}, address: {}, price: {}", order.getOrderId(), order.getAddress(), order.getPrice());
    }
}

Object λ₯Ό publish ν•œλ‹€λ©΄ json ν˜•νƒœλ‘œ 데이터λ₯Ό λ°›μ•„μ˜΅λ‹ˆλ‹€.

ZolaJsonSerializer λ₯Ό μ‚¬μš©ν•˜λ©΄ json 을 μ‰½κ²Œ

μ‹€ν–‰ν•΄λ΄…μ‹œλ‹€!

이제 λͺ¨λ“  개발이 λλ‚¬μŠ΅λ‹ˆλ‹€.

μ‹€ν–‰ κ²°κ³Όλ₯Ό ν™•μΈν•΄λ΄…μ‹œλ‹€

μš°μ„  큐λ₯Ό λ§Œλ“€μ–΄μ•Ό ν•©λ‹ˆλ‹€.

localhost:8290 으둜 μ‹€ν–‰λ˜λŠ” dashboard 에 μ ‘μ†ν•˜μ„Έμš”.

image

μš°λ¦¬λŠ” 2개의 큐λ₯Ό 생성해야 ν•©λ‹ˆλ‹€. 였λ₯Έμͺ½μ˜ νƒ­μ—μ„œ QUEUE 생성 메뉴λ₯Ό ν΄λ¦­ν•˜κ³  큐λ₯Ό μΆ”κ°€ν•˜μ„Έμš”

image

λ‘κ°œμ˜ 큐λ₯Ό λͺ¨λ‘ μΆ”κ°€ν•΄μ€λ‹ˆλ‹€.

image

그리고 order-service 와 delivery-service λ₯Ό μ‹€ν–‰μ‹œμΌœμ£Όμ„Έμš”

그리고 order-service 에 api λ₯Ό μ „μ†‘ν•΄λ΄…μ‹œλ‹€.

image

그럼 μ•„λž˜μ™€ 같이 λ‘œκ·Έκ°€ μ°νžˆλŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

image

ν•˜λ‚˜λŠ” json ν˜•νƒœ κ·ΈλŒ€λ‘œ, λ‹€λ₯Έ ν•˜λ‚˜λŠ” κ°μ²΄μ—μ„œ κΊΌλ‚΄μ˜¨λŒ€λ‘œ 잘 좜λ ₯λ˜μ—ˆλ„€μš”,

이제 λ‚˜λ¨Έμ§€ cancel 도 ν˜ΈμΆœν•˜λ©΄ λ™μΌν•˜κ²Œ κ²°κ³Όκ°€ λ‚˜μ˜¬ κ²ƒμž…λ‹ˆλ‹€.

image image