MSA
MSA
MSA Basic
Microservice Architecture
애플리케이션을 기능별로 나누고 여러 서비스로 만듭니다.
서비스 간에 정보를 공유하고 통합 기능을 수행하는 기술입니다.
- 간편한 장애 격리 및 복구
- 비용 효율적인 확장성
- 코드 크기가 작고 유지보수가 용이하여 생산성 향상
- 신속한 구현 및 구현으로 서비스 개선 속도 향상
- 각 서비스에 대해 최적화된 개발 언어 및 DB 선택 가능
MSA는 클라우드 네이티브 환경의 핵심 기술 중 하나 입니다.
Spring Cloud
Spring Cloud는 마이크로 서비스의 개발, 배포, 운영에 필요한 아키텍처를 쉽게 구성할 수 있도록 지원하는 Spring Boot 기반의 프레임워크
Cloud Native
클라우드 컴퓨팅 모델을 최대한 활용하는 애플리케이션을 개발, 구축 및 실행하기 위한 방법론입니다.
애플리케이션 아키텍처를 설계 시점부터 클라우드 환경에 맞게 설계하여 클라우드 환경에 대한 의존성을 제거하는 것이 그 목적입니다.
- DevOps: 소프트웨어 개발과 운영의 합성어로 소프트웨어 개발자와 정보기술 전문가 간의 소통, 협업, 통합을 강조하는 개발 환경이나 문화를 말합니다.
- 마이크로서비스: 다음의 조합으로 단일 프로그램을 구축하는 방법 소규모 서비스를 개별 구성요소로 세분화합니다.
- 컨테이너: 응용 프로그램 코드와 함께 특정 버전의 프로그래밍 언어 런타임 및 소프트웨어 서비스를 실행하는 데 필요한 라이브러리를 포함하는 경량 패키지입니다.
- CI/CD: 지속적인 통합 및 지속적인 제공. 통합 및 테스트 단계에서 제공 및 배포에 이르기까지 애플리케이션의 라이프사이클 전반에 걸쳐 지속적인 자동화 및 지속적인 모니터링을 제공합니다.
Practice
Project Structure
Member Service
MemberService 응용 프로그램을 클라이언트 서비스로 등록하고 멤버 도메인 컨트롤러가 RESTful 요청을 처리하도록 합니다.
project structure
- 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
- 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에 등록되지 않도록 지정하십시오.
- 클라이언트가 서버의 등록된 인스턴스 목록을 캐시하지 않도록 지정합니다.
- 동일한 영역에서 유레카 서버 클러스터링 구성
API Gateway
API Gateway를 통해 마이크로 서비스의 라우팅을 관리하고 인증 및 보안에 대한 기능을 제공할 수 있습니다.
API Gateway Platform
구성은 크게 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/**
References: 가천 SW 아카데미