8/1 진행사항
✅ 알고리즘 4문제
✅ MSA 강의 1-4 ~ 1-7
오늘 코드카타에서 형변환과 반환타입을 잘 확인해야 되는 문제들을 풀었다.
(풀었던 문제도 그냥 초기화해서 다시 풀어보고있다.)
프로그래머스 문제를 풀다 보면 형변환 때문에 실패를 받는 경우가 종종 있다.
그래서 아래와 같이 정리한다.
Java 형변환
자바에서는 작은 타입에서 큰 타입으로의 자동 형 변환이 이루어진다.
public class Main {
public static void main(String[] args) {
int x = 1;
long num = x; // int 값이 long 타입으로 자동 형 변환됨
System.out.println(num); // 1
}
}
int 값을 long 변수에 할당할 때 자바는 자동으로 int 값을 long 값으로 변환하기 때문에
num변수는 여전히 long타입이다.
이는 산술 연산을 수행할 때도 마찬가지이다.
public class Main {
public static void main(String[] args) {
int intValue = 10;
long longValue = 3L;
long result = longValue % intValue; // long 타입과 int 타입의 % 연산
System.out.println(result); // 1
}
}
% 연산을 수행할 때 intValue가 long타입으로 자동 변환되어 연산이 수행된다.
그러므로 결괏값 result는 long 타입으로 저장된다.
반대로 작은 타입 변수에 큰 타입값을 넣으려면 명시적 형 변환이 필요하다.
public class Main {
public static void main(String[] args) {
int intValue = 10;
long longValue = 3L;
// long 타입과 int 타입의 % 연산
long resultLong = longValue % intValue;
// 결과를 int 타입으로 변환하여 저장
int resultInt = (int) resultLong;
System.out.println(resultInt); // 1
}
}
앞으로 형변환 때문에 틀리는 일이 없기를!
Integer.parseInt와 Integer.valueOf의 차이
문자열을 정수로 변환하는 방법에는
Integer.parseInt와 Integer.valueOf가 있다. 이 두 개의 차이는 반환 타입에 있다.
Integer.parseInt
반환 타입: int (단순 정수값)
메모리 및 성능: 기본 타입을 반환하므로 메모리 오버헤드가 적다.
Integer.valueOf
반환타입: Integer(객체 타입)
기능: Integer 객체로서 메서드 호출 가능 (equals, compare, intValue 등등...)
메모리 및 성능: 객체를 반환하므로 메모리 사용이 증가할 수 있다.
Math.sqrt()와 Math.pow()
Math.sqrt(double a) 메서드는 입력값 a의 제곱근을 계산하여 반환한다.
반환 타입은 double이다.
Math.pow(double base, double exponent) 메서드는 base의 exponent 거듭제곱을 계산한다.
반환 타입 역시 double이다.
이제 MSA 강의 내용을 정리해 보자.
클라이언트 사이드 로드 밸런싱
로드밸런싱이란?
서버 간 트래픽을 고르게 분배하여 특정 서버에 부하가 집중되는 것을 방지하는 기술로
클라이언트 사이드 로드 밸런싱과 서버 사이드 로드 밸런싱이 있다.
클라이언트 사이드 로드 밸런싱이란?
클라이언트가 직접 여러 서버 중 하나를 선택해 요청 보내는 방식이다.
클라이언트가 갖고 있는 서버 목록을 바탕으로 로드 밸런싱을 수행한다.
클라이언트 사이드 로드 밸런싱을 이해하기 위한 실습이 진행되었다.
유레카 서버 하나에 주문 인스턴스 1개 그리고 같은 기능을 하지만 포트가 다른 상품 인스턴스 3개를 연결한다.
FeignClient는 Ribbon을 통해 3개의 Product 인스턴스 중 하나를 선택하여 호출한다.
이 과정에서 Round Robin 알고리즘을 사용하여 요청을 순차적으로 분배한다.
Round Robin 알고리즘이란? 프로세스나 작업을 순환 방식으로 공정하게 할당하는 방법으로 공정성을 보장한 방법이다.
아래 그림에 기반하여 프로젝트를 생성하고, 실습을 진행한다.
server -> product -> order 순으로 실행
실습결과
포트 호출이 19094 > 19092 > 19093 순으로 반복됨
라운드로빈으로 로드밸런싱 되는 것을 확인했다.
위의 진행 과정은 다음과 같다.
1. Order 서비스 실행: Order 서비스가 실행되면 Eureka 서버에서 Product 서비스 인스턴스 목록을 가져온다.
2. Product 서비스 호출: Order 서비스에서 Product 서비스의 정보를 가져오기 위해 FeignClient를 사용하여 호출한다.
3. Ribbon을 통한 로드 밸런싱: FeignClient는 Ribbon을 통해 3개의 Product 인스턴스 중 하나를 선택하여 호출한다. 이 과정에서 Round Robin 알고리즘을 사용하여 요청을 순차적으로 분배한다.
4. 응답 처리: 선택된 Product 인스턴스에서 응답을 받아 Order 서비스에 반환하고, 최종적으로 클라이언트에 응답을 전달한다.
서킷 브레이커 (Resilience4j)
서킷 브레이커란?
마이크로 서비스 간의 실패를 감지하여 안정성을 보장하는 패턴으로 장애를 격리하고 다른 시스템으로의 에러 전파를 방지한다.
상태변화 : CLOSED -> OPEN -> HALF_OPEN
Resilience4j란?
서킷 브레이커 라이브러리로, 다양한 서킷 브레이커 기능을 제공한다.
Fallback 메서드를 통해 호출 실패 시 대체 로직을 제공하여 시스템 안정성을 확보한다.
이는 에러가 발생해도 사용자에게 일정한 응답을 제공하기 때문에 안정성이 높은 시스템이라고 인식하기 쉽다.
실습결과
실패율이 임계값을 넘어가면 CLOSED에서 OPEN으로 바뀌고
OPEN으로 넘어가는 순간 서킷브레이커가 동작한다.
기존 함수는 타지 않고 fallback 메소드만 타게 된다.
일정시간 지난 후 정상으로 돌아왔는지 확인하기 위해 HALF_OPEN 상태로 전환을 하고
이때 정상호출을 보내면 HALF_OPEN에서 CLOSED로 다시 전환된다.
Spring Cloud Gateway
Spring Cloud Gateway란?
클라이언트 요청을 적절한 서비스로 라우팅하고 다양한 필터링 기능을 제공하는 API 게이트웨이다.
아래 그림에 기반하여 실습을 진행한다.
게이트웨이가 추가되면서 통합된 호스트(localhost:19091)로 서로 다른 서비스 호출이 가능해진다.
게이트웨이 application.yml
server:
port: 19091 # 게이트웨이 서비스가 실행될 포트 번호
spring:
main:
web-application-type: reactive # Spring 애플리케이션이 리액티브 웹 애플리케이션으로 설정됨
application:
name: gateway-service # 애플리케이션 이름을 'gateway-service'로 설정
cloud:
gateway:
routes: # Spring Cloud Gateway의 라우팅 설정
- id: order-service # 라우트 식별자
uri: lb://order-service # 'order-service'라는 이름으로 로드 밸런싱된 서비스로 라우팅
predicates:
- Path=/order/** # /order/** 경로로 들어오는 요청을 이 라우트로 처리
- id: product-service # 라우트 식별자
uri: lb://product-service # 'product-service'라는 이름으로 로드 밸런싱된 서비스로 라우팅
predicates:
- Path=/product/** # /product/** 경로로 들어오는 요청을 이 라우트로 처리
discovery:
locator:
enabled: true # 서비스 디스커버리를 통해 동적으로 라우트를 생성하도록 설정
eureka:
client:
service-url:
defaultZone: http://localhost:19090/eureka/ # Eureka 서버의 URL을 지정
게이트웨이 yml 파일에 설정된 내용처럼
/order 아래로 요청이 들어오면 'order-service'라는 이름을 가진 서비스를 호출하고
/product 아래로 요청이 들어오면 'product-service'라는 이름을 가진 서비스를 호출한다.
실습결과
오늘의 tmi)
방대한 지식을 욱여넣느라 머리가 아픈 하루다
양이 많아 정리하기 쉽지 않다..😂
'TIL' 카테고리의 다른 글
[TIL] Zipkin이란? | Redis란? (0) | 2024.08.06 |
---|---|
[TIL] QueryDsl 사용방법 (0) | 2024.08.06 |
[TIL] 인증과 인가 | 컨피그 서버 (Spring Cloud Config) (0) | 2024.08.02 |
[TIL] MSA란? | Spring Cloud란? (1) | 2024.07.31 |
[TIL] @Data vs @Getter, @Setter | Building Result란? | CreatedAt UpdatedAt null 해결 (0) | 2024.07.31 |