시작이 반

[MSA] Spring Cloud ( Service 등록 ) 본문

Programming/MSA

[MSA] Spring Cloud ( Service 등록 )

G_Gi 2021. 8. 4. 17:34
SMALL

https://happycloud-lee.tistory.com/207

 

지금까지 API Gateway, Discovery 를 만들었다.

이번에는 간단한 User-Service, order_service, catalog-service를 만들고 API와 Discovery에 등록해 볼 것이다.

 

 

USER-SERVICE

사용할 APIs (함수 내용은 설명하지 않겠습니다.)

기능 URI HTTP Method
사용자 정보 등록 /user-service/users POST
전체 사용자 조회 /user-service/users GET
사용자 정보, 주문 내역 조회 /user-service/users/{user_id} GET
작동 상태 확인 /user-service/health_check GET
환영 메시지 /user-service/welcome GET

 

(디스커버리에 서비스를 등록하기 위해서는 Eureka Discovery Client 디펜던시가 필요함)

 

 

우선 main class에 @EnableDiscoveryClient를 사용하여 유레카 서버에 등록할 준비를 한다.

(최신 Spring Boot에서는 이 어노테이션을 등록하지 않아도 자동으로 등록된다.)

 

application.yml에 유레카 서버주소를 알려준다.

server:
  port: 0

spring:
  application:
    name: user-service
  h2:
    console:
      enabled: true
      settings:
        web-allow-others: true
      path: /h2-console
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:testdb
    username: sa
    password:
  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        # show_sql: true
        format_sql: true

eureka:
  instance:
    lease-renewal-interval-in-seconds: 1
    lease-expiration-duration-in-seconds: 2
    prefer-ip-address: true
    instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka

(기존에 설명했던거 제외)

server.port : 서버 포트는 0으로 해놓으면 랜덤값이 할당된다.

instance-id : 인스턴스 아이디는 gateway에 나오는 서비스의 이름이다. 개발자가 원하는 것으로 작성하면됨

사용될 DB는 H2를 사용할 것이다. (나중에 바뀔수도 있음...)

 

서비스의 함수들을 다 만들었다면

 

이제 서비스를 API-Gateway 에 등록한다.

uri에 원래는 주소를 써야하지만 lb(로드밸런싱)을 통해서 서비스의 어플리케이션 이름을 통해 등록할 수 있다. 이러면 자동으로 주소가 들어간다.

 

gateway를 통해 user-service 접근 (user등록 POST)

 

gateway를 통해 user-service 접근 (user확인 GET)

 


CATALOG-SERVICE

사용할 APIs (함수 내용은 설명하지 않겠습니다.)

기능 URI HTTP Method
상품 목록 조회 /catalog-service/catalogs GET
작동상태 확인 /catalog-service/health_check GET

 

 

application.yml에 유레카 서버주소를 알려준다.

server:
  port: 0

spring:
  application:
    name: catalog-service
  h2:
    console:
      enabled: true
      settings:
        web-allow-others: true
      path: /h2-console
  datasource:
    url: jdbc:h2:mem:testdb
    username: sa
    password:
    driver-class-name: org.h2.Driver
    initialization-mode: always
  jpa:
    hibernate:
      ddl-auto: create-drop
    show_sql: true
    generate-ddl: true

eureka:
  instance:
    lease-renewal-interval-in-seconds: 1
    lease-expiration-duration-in-seconds: 2
    prefer-ip-address: true
    instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka
logging:
  level:
    com.example.catalogservice: DEBUG

해당 API에 필요한 서비스들을 만든다.

 

서비스의 함수를 다 만들었으면 

 

API-Gateway에 catalog-service를 등록한다.

gateway를 통해 catalog-service 접근 (상품 조회 GET)

 


ORDER-SERVICE

사용할 APIs (함수 내용은 설명하지 않겠습니다.)

기능 URI HTTP Method
사용자 별 상품 주문 /order-service/{user_id}/orders POST
사용자 별 주문 내역 조회 /order-service/{user_id}/orders GET
작동상태 확인 /order-service/health_check GET

 

마찬가지로 Eureka Discovery Client 를 디펜던시로 등록

 

application.yml에 유레카 서버주소를 알려준다.

server:
  port: 0

spring:
  application:
    name: order-service
  h2:
    console:
      enabled: true
      settings:
        web-allow-others: true
      path: /h2-console
  datasource:
    url: jdbc:h2:mem:testdb
    username: sa
    password:
    driver-class-name: org.h2.Driver
  jpa:
    hibernate:
      ddl-auto: create
    show_sql: true
    generate-ddl: true

eureka:
  instance:
    lease-renewal-interval-in-seconds: 1
    lease-expiration-duration-in-seconds: 2
    prefer-ip-address: true
    instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka

logging:
  level:
    com.example.orderservice: DEBUG

해당 API에 필요한 서비스들을 만든다.

 

서비스의 함수를 다 만들었으면 

 

API-Gateway에 catalog-service를 등록한다.

 

gateway를 통해 order-service 접근 (상품 주문 POST)

 

gateway를 통해 order-service 접근 (해당유저 상품 조회 GET)

 


모든 서비스 실행

 

여기까지는 일단 서비스가 다 별개로 동작을 한다.

즉, 원래는 유저가 하나의 상품을 주문한다면 catalog에 있는 물품의 수량이 변해야 하지만 아직 이러한 구현은 되어있지 않다.

 

이를 위해서는 하나의 서비스에서 다른 서비스의 api를 호출하여 통신하는 Feign Client(rest) 방식이 있으며,

또한 Kafka(메시지 큐잉 서비스)를 통해 비동기로 data를 동기화 시키는 방식이 있다.

 

 

 

<참고 : Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)>

 

service.zip
0.66MB

 

LIST