소프트웨어 아키텍처 변화 과정
Antifragile의 4가지 특징
Auto Scaling
MicroServices
Chaos Engineering
Continuous Deployments
Discovery 서버 생성
server:
port: 8761
spring:
application:
name: discoveryService
eureka:
client:
register-with-eureka: false
fetch-registry: false
// EnableEurekaServer 어토테이션을 추가하면 해당 서버가 Discovery서버가 된다.
@SpringBootApplication
@EnableEurekaServer
public class DiscoveryApplication {
public static void main(String[] args) {
SpringApplication.run(DiscoveryApplication.class, args);
}
}
Discovery 서비스에 MSA ( 디스커버리 서버의 클라이언트 ) 추가
이제 마이크로 서비스를 하나 만들어서 discovery에 추가해 보자.
discovery는 수많은 마이크로 서비스가 등록되는 서버고, 그에 따라 마이크로 서비스는 discovery의 클라이언트가 된다.
따라서 eureka server client 디펜던시를 설치하여 msa 프로젝트를 만들어 보자.
프로젝트롤 만들고 메인 메서드에 @EnableDiscoveryClient 어노테이션을 추가한다.
@SpringBootApplication
@EnableDiscoveryClient
public class Msa1Application {
public static void main(String[] args) {
SpringApplication.run(Msa1Application.class, args);
}
}
server:
port: 9001
spring:
application:
name: msa1
eureka:
client:
// 유레카 서버에 등록할 것인지 여부
register-with-eureka: true
// 유레카 서버로 부터 인스턴스들의 정보를 주기적으로 가져올 것인지 여부
fetch-registry: true
// msa가 등록되는 유레카 서버의 위치 정보 지정 아래는 유레카 서버에
/eureka 엔드포인트를 추가하여 현재 msa의 위치를 지정 한 것.
service-url:
defalutZone: http://127.0.0.1:8761/eureka
여기 까지 하고 실행을 해 보면 유레카 서버에 접속했을 때 msa1이 등록된 것을 확인할 수 있다.
msa를 하나더 등록해 보자.
인텔리제이의 edit configuration을 활용하면 같은 프로젝이트 이지만 설정 정보를 다르게 하여 다른 프로젝트 처럼 실행 시킬 수 있다.
아래 창을 열고, modify option에서 옵션 추가 해서 -Dserver.port=9002를 추가하여 MSA2는 9002번 포트에서 열리게 해보자.


Load Balancer
eureka:
// 아래 부분을 추가하였다.
instance:
instance_id: ${spring.cloud.client.hostname}:${spring.application.instance_id}:${random.value}}
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://127.0.0.1:8761/eureka
이제 실행해 보면 2개의 msa가 등록된 것을 확인할 수 있다.
이처럼 새로운 msa가 추가 될 때마다 Discovery 서비스에 등록이 되게 하여 로드 밸런싱 하는 작업을 구현할 수 있다.
Spring Cloud Gateway
// gateway 서버 포트
server:
port: 8000
// gateway를 Discovery에 등록
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:8761/eureka
spring:
application:
name: gateway-service
cloud:
gateway:
routes:
// 클라이언트가 first-service를 요청하면 아래 uri로 보내줌
- id: first-service
uri: http://localhost:8081/
predicates:
- Path=/first-service/**
- id: second-service
uri: http://localhost:8082/
predicates:
- Path=/second-service/**
❗여기서 주의할 점이 있다.위의 routes를 살펴 보자.
gateway 서버에서 /first-service로 요청이 오면 8081로,
/second-service 요청이 오면 8082로 이동을 한다고 되어 있는데
그냥 이동 하는 것이 아니라 Path 경로가 이동되는 url뒤에 붙게 된다.
예를 들어 localhost:8080/first-service로 요청을 하면
localhost:8081/first-service로 요청이 가게 되는 것이다.
따라서 해당 url을 컨트롤러에서 매핑을 해줘야 한다.
@RestController
@RequestMapping("/first-service")
public class FirstServiceController {
@GetMapping("/welcome")
public String welcome () {
return "Welcome to the first Service";
}
}
@RestController
@RequestMapping("/second-service")
public class SecondServiceController {
@GetMapping("/welcome")
public String welcome () {
return "Welcome to the second Service";
}
}
Gateway Filter 적용
Gateway Load Balancer
이번에는 Gateway와 Discovery 서버를 연동시켜 보자.
먼저 Gateway와 firstService, secondService를 모두 Discovery에 등록해야 한다.
우선 Discovery에 등록을 하려면 Eureka Client 라이브러리가 설치가 되어 있어야 한다. 각각 설치가 되었는지 확인하자.
// 라이브러리 설치 후 아래와 같이 application.yml에 작성해야 한다.
// defaultZone에 Discovery 서버의 주소를 입력한다.
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-uri:
defaultZone: http://localhost:8761/eureka
spring:
application:
name: gateway
// 아래 설정을 해석해 보면, gateway로 first-service 요청이 오면
lb://first-service로 이동한다는 의미인데
여기서 lb는 Discovery 서버에 등록된 서비스들의 이름을 찾겠다는 의미이고
first-service는 Discovery에 등록된 서비스의 이름이다.
cloud:
gateway:
routes:
- id: first-service
uri: lb:// first-service
predicates:
- Path=/first-service/**
- id: second-service
uri: lb://second-service
predicates:
- Path=/second-service/**