Post

MSA

MSA

MSA Basic

Microservice Architecture

image

애플리케이션을 기능별로 나누고 여러 서비스로 만듭니다.

서비스 간에 정보를 공유하고 통합 기능을 수행하는 기술입니다.

  • 간편한 장애 격리 및 복구
  • 비용 효율적인 확장성
  • 코드 크기가 작고 유지보수가 용이하여 생산성 향상
  • 신속한 구현 및 구현으로 서비스 개선 속도 향상
  • 각 서비스에 대해 최적화된 개발 언어 및 DB 선택 가능

MSA는 클라우드 네이티브 환경의 핵심 기술 중 하나 입니다.

Spring Cloud

Spring Cloud는 마이크로 서비스의 개발, 배포, 운영에 필요한 아키텍처를 쉽게 구성할 수 있도록 지원하는 Spring Boot 기반의 프레임워크

image

Cloud Native

클라우드 컴퓨팅 모델을 최대한 활용하는 애플리케이션을 개발, 구축 및 실행하기 위한 방법론입니다.

애플리케이션 아키텍처를 설계 시점부터 클라우드 환경에 맞게 설계하여 클라우드 환경에 대한 의존성을 제거하는 것이 그 목적입니다.

image

  • DevOps: 소프트웨어 개발과 운영의 합성어로 소프트웨어 개발자와 정보기술 전문가 간의 소통, 협업, 통합을 강조하는 개발 환경이나 문화를 말합니다.
  • 마이크로서비스: 다음의 조합으로 단일 프로그램을 구축하는 방법 소규모 서비스를 개별 구성요소로 세분화합니다.
  • 컨테이너: 응용 프로그램 코드와 함께 특정 버전의 프로그래밍 언어 런타임 및 소프트웨어 서비스를 실행하는 데 필요한 라이브러리를 포함하는 경량 패키지입니다.
  • CI/CD: 지속적인 통합 및 지속적인 제공. 통합 및 테스트 단계에서 제공 및 배포에 이르기까지 애플리케이션의 라이프사이클 전반에 걸쳐 지속적인 자동화 및 지속적인 모니터링을 제공합니다.

Practice

Project Structure

image

Member Service

MemberService 응용 프로그램을 클라이언트 서비스로 등록하고 멤버 도메인 컨트롤러가 RESTful 요청을 처리하도록 합니다.

project structure

image

  • MemberServiceApplication: Spring Boot 응용 프로그램으로 서비스를 Eureka 서버에 클라이언트로 등록합니다.
  • Member: 멤버클래스 도메인.
  • MemberConroller: HTTP 요청을 처리할 컨트롤러 및 매핑 방법을 지정합니다.
  • applicaion.yml: 서버 포트 번호, 서비스 이름 및 Eureka 서버 정보를 지정합니다.

MemberService Dependency

pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
...
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-client
	</artifactId>
</dependency>
<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<optional>true</optional>
</dependency>

💡 MSA 환경에서는 동적으로 IP와 포트번호를 지정하므로 지속적으로 변경됩니다.

MSA 환경에서 서비스 정보를 등록하고 관리하도록 지원합니다.

MemberServiceApplication.java

1
2
3
4
5
6
7
8
9
@SpringBootApplication
@EnableDiscoveryClient
public class MemberServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(MemberServiceApplication.class, args);
    }

}

DiscoveryClient로 등록

Member.java

1
2
3
4
5
6
7
8
9
@Data
@AllArgsConstructor
public class Member {

    private Long id;
    private String name;
    private String password;

}

MemberController.java

1
2
3
4
5
6
7
@RestController
public class MemberController {
    @GetMapping("/api/member")
    public Member getMember() {
        return new Member(1L, "Gachon", "gcu");
    }
}

resources/application.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server:
  port: 8081

spring:
  application:
    name: memberservice

eureka:
  instance:
    preferIpAddress: true
    lease-renewal-interval-in-seconds: 30
  client:
    registerWithEureka: true
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://127.0.0.1:8761/eureka/

💡 서버 포트 번호를 8081로 설정합니다.

preferIpAddress: 서비스 간 통신 시 IP가 먼저 사용됩니다.

lease-renewal-interval-inseconds : 30초마다 하트비트 전송

registerWithEureka: 서비스가 Eureka에 등록되도록 지정

fetchRegistry: 클라이언트가 서버의 등록된 인스턴스 목록을 캐시 하지 않도록 지정합니다.

defaultZone: 동일한 영역에서 유레카 서버 클러스터링 구성

Order Service

OrderService 응용 프로그램을 HTTP 클라이언트 서비스(FeignClient)로 등록하고 구성원 서비스를 Feign 클라이언트로 등록합니다. HTTP 요청 매핑을 수행합니다.

Project Structure

image

  • OrderServiceApplication: Spring Boot 애플리케이션으로 서비스를 Eureka 서버에 HTTP 클라이언트(Feign)로 등록합니다.
  • Member: 멤버 클래스 도메인
  • MemberServiceFeignClient: feign 클라이언트로 memberservice 등록
  • OrderController: 종속성 주입을 통해 Feign 클라이언트의 개체 변수를 만들고 HTTP 요청을 매핑합니다.
  • applicaion.yml: 서버 포트 번호, 서비스 이름, Eureka 서버 정보를 지정합니다.

OrderService Dependency

pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
...
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-client
  </artifactId>
</dependency>
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <optional>true</optional>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

💡 openfeingn: 원래 Netflix에서 만든 선언적 HTTP 클라이언트 도구로 외부 API 호출을 쉽게 할 수 있도록 도와줍니다. MSA 통신제공

OrderServiceApplication.java

1
2
3
4
5
6
7
8
@SpringBootApplication
@EnableFeignClients
public class OrderServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderServiceApplication.class, args);
    }
}

@EnableFeignClients : Netflix에서 개발한 Http 클라이언트입니다. HTTP 요청을 쉽게 생성하고 보낼 수 있도록 도와주는 객체입니다.

Member.java

1
2
3
4
5
6
@Data
public class Member {
	private Long id;
	private String name; 
	private String password;
}

MemberServiceFeighClient.java

1
2
3
4
5
@FeignClient("memberservice")
public interface MemberServiceFeignClient {
        @GetMapping(value = "/api/member", consumes = "application/json")
        Member getMember();
}

@FeignClient("members ervice"): memberservice 이름의 페인트 클라이언트를 지정합니다.

인터페이스 정의

/api/member 경로가 포함된 GET 요청이 오면 getMember가 호출되어 Member 객체를 json 형식으로 반환합니다.

OrderController.java

1
2
3
4
5
6
7
8
9
10
@RestController
public class OrderController {
    @Autowired
    private MemberServiceFeignClient memberServiceFeignClient;

    @GetMapping("/api/order")
    public String order() {
        return memberServiceFeignClient.getMember().getName() + " requested an order.";
    }
}

FeinClient 객체변수를 통해 멤버이름을 Order서비스에서 가져와서 출력합니다.

application.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server:
  port: 8082

spring:
  application:
    name: orderservice

eureka:
  instance:
    preferIpAddress: true
    lease-renewal-interval-in-seconds: 30

  client:
    registerWithEureka: true
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://127.0.0.1:8761/eureka/

Eureka Server

마이크로 서비스를 등록하고 장애 감지를 위해 넷플릭스의 유레카 서버를 구축합니다.

EurekaServerApplication.java

1
2
3
4
5
6
7
8
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

EurekaServer를 검색 서버로 등록

application.yml

1
2
3
4
5
6
7
8
9
10
11
12
server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
  server:
    serverUrl:
      defaultZone: http://127.0.0.1:8761/eureka/

서버 포트 번호를 8761로 설정합니다. Eureka 서버의 기본 포트 번호입니다.

  • 서비스가 Eureka에 등록되지 않도록 지정하십시오.
  • 클라이언트가 서버의 등록된 인스턴스 목록을 캐시하지 않도록 지정합니다.
  • 동일한 영역에서 유레카 서버 클러스터링 구성

image

API Gateway

API Gateway를 통해 마이크로 서비스의 라우팅을 관리하고 인증 및 보안에 대한 기능을 제공할 수 있습니다.

API Gateway Platform

image

구성은 크게 GATEWAY, EUREKA, FALLBACKSERVER, ADMIN, DB, CONFIG-SERVER 및 GIT로 구성됩니다.

  • 게이트웨이 - 실제 라우팅 또는 모니터링을 담당하는 게이트웨이
  • Eureka 서버- 마이크로 서비스를 검색하는 서버입니다.마이크로서비스의 IP 및 포트 번호를 등록하고 제공합니다.
  • 폴백 서버 - 실패한 요청에 대한 폴백 응답을 제공하는 서버
  • 구성 서버 - 게이트웨이 구성 정보를 동적으로 변경하기 위한 요소

APT Gateway

SCG(Spring Cloud Gateway)를 통한 여러 마이크로 서비스의 라우팅을 지원합니다.

  • implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
  • implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'

GatewayApplication.java

1
2
3
4
5
6
7
@SpringBootApplication
@EnableDiscoveryClient
public class GcuGatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GcuGatewayApplication.class, args);
    }
}

application.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
server:
  port: 8000

eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:8761/eureka

spring:
  application:
    name: apigateway-service
  cloud:
    gateway:
      routes:
        - id: memberservice
          uri: http://localhost:8081/
          predicates:
            - Path=/api/member/**
        - id: orderservice
          uri: http://localhost:8082/
          predicates:
            - Path=/api/order/**

image


References: 가천 SW 아카데미

This post is licensed under CC BY 4.0 by the author.