티스토리 뷰
-해당 글은 아래의 글에서 이어 집니다.
https://ggparkitbank.tistory.com/124
이번에 서술할 부분은 꽤나 중요합니다. Load Balancer의 역할과 사용법에 대해서 서술 되어 있습니다.
자 일단은 이번 실습은 STS or Eclipse 환경에서는 어려울 수도 있습니다. 이미 저는 IntelliJ 가 아니면 만족 못하는 몸이 되어 버려서... 해당 기능을 어떻게 사용해야하는지 자세히는 모르겠네요. 만약 다른 환경이시더라도 Load Balancer에 대한 정리 내용을 해당 포스팅 하단에 서술할 예정이라 해당 부분으로 이론적으로 파악하시면 좋을 것 같습니다.
#Duplication Service
첫번째로 한번 Service를 복제해봅시다. 우측 상단에
해당 항목에서 FristServiceApplication으로 이동해주세요.
Edit Configuration 항목을 클릭해주세요.
상단에 문서모양의 버튼이 보이시나요? FirstServiceApplication을 클릭하고 해당 버튼을 눌러주시면
아래와 같이 복제가 됩니다.
Build and Run 부분에 Modifty Options가 보이시나요? 해당 버튼을 클릭해 Add VM options를 활성해줍시다.
그리고 VM options에
-Dserver.port=9002 를 입력해줄게요. port번호는 임의로 지정해주셔도 상관 없습니다.
해당 포트를 지정해주지 않으면 기존의 yml세팅에서 지정한 포트와 충돌로 실행이 되지 않을거에요.
여기에서 임의로 포트를 설정해주세요.
이제 다시 Configuration 옵션으로 이동해보면 다음과 같이 어플리케이션이 2개로 늘어난걸 확인 할 수 있습니다.
이제 두개의 어플리케이션을 모두 실행해주세요! Gateway 서비스와 DiscoveryService도 켜주셔야 해요!
http://localhost:8761로 접속 하시면 다음과 같이 같은 서비스에 2개의 서비스가 출력되는게 확인 되시나요?
그럼 성공적으로 Service 복제가 완료가 됐습니다!
Post-Man으로 확인해볼까요?
음 아주 잘되네요.. 근데 여기서 궁금증이 하나 생기지 않나요?
저희는 지금 url가 lb:// 형태로 작성되었기 때문에 특정 포트를 참조하는게 아니에요. 하지만 똑같은 서비스는
포트만 다를뿐 동시에 실행되고 있어요... 그럼 도대체 어떤 포트를 참조하는걸까요?
그럼 이걸 확인하는 과정을 밟아야해요. 그렇게 복잡하진 않으니까 한번 수정해봐요!
#또또 다시 First-Service 수정
일단 yml파일을 수정하도록 해볼게요.
#application.yml
server:
port: 0
spring:
application:
name: my-first-service
eureka:
client:
fetch-registry: true
register-with-eureka: true
service-url:
defaultZone: http://localhost:8761/eureka
instance:
instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}
해당 yml 파일에 대한 약간의 설명입니다.
첫번째로는 port번호를 0으로 지정할거에요. port 0번은 랜덤포트를 의미해요 자동으로 랜덤한 포트를 부여하도록 설정되어 있어요. 정말 편리해요! 이제 포트중복은 신경안쓸수있으니까요.
다만 0번 port로 지정하게 되면 EurekaServer에서 0번으로만 인식해서 두개의 서버를 올려도 하나만 나오는 문제가 있어요.
그래서 instance를 활용해서 instance-id를 지정해줘야 해요!
그럼 yml설정도 바꿨으니 한번 확인해볼까요? my-first-sevice 뒤에 이상한 외계어들이 보이시나요? 그럼 성공이에요!
자 그럼 바로 이어서 복제를 해볼게요. 기존에 작성해둔 VM-options을 이제 지워줄까요? 왜냐면 저희는 자동으로 포트를 부여해줄 예정이니까요 :) 더 이상 복제된 어플리케이션의 port를 지정해주지 않아도 됩니다!
자 사전 준비는 끝났으니 본격적으로 Port번호를 알아볼게요.
Controller를 한번 수정 해봅시다!
#FirstServiceController.java
package com.example.firstservice;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@RestController
@RequestMapping("/first-service")
@Slf4j
public class FirstServiceController {
Environment env;
@Autowired
public FirstServiceController(Environment env){
this.env = env;
}
@GetMapping("/welcome")
public String welcome(){
return "첫번째 서비스에요.";
}
@GetMapping("/message")
public String message(@RequestHeader("first-request") String header ){
System.out.println(header);
return "나는.. 첫번째 메시지 서비스에요.";
}
@GetMapping("/check")
public String check(HttpServletRequest request){
log.info("Server port={}",request.getServerPort());
return String.format("Hi, there. This is a message from First Service on PORT %s", env.getProperty("local.server.port"));
}
}
log를 통해서 출력을 해주기 위해서 @Slf4j Annotation을 사용하는건 이제 너무나도 익숙하네요.
자 두가지 방식으로 포트를 가져올 건데요 하나는 request를 통해서 값을 가져오고, 다른 하나로는 환경변수를 사용해서 값을 가져올 거에요. 먼저 환경변수 부분을 설명해드릴게요! 아래의 코드를 확인 해주세요.
Environment env;
@Autowired
public FirstServiceController(Environment env){
this.env = env;
}
주로 환경변수값을 가져올때는 Environment로 받아오는 경우가 일반적이에요.
그리고 해당값을 받아오기 위해서 @Autowired를 활용할거에요!
FirstServiceController의 환경변수를 가져올거니까 생성자를 만들어서 Autowired를 할거랍니다.
실행후에는 환경변수가 env라는 변수에 담겨져있어요! 그럼 환경변수를 받기위한 준비는 끝!
그리고 저희가 기존에 Mapping했던 "/check" 부분을 수정해볼까요?
@GetMapping("/check")
public String check(HttpServletRequest request){
log.info("Server port={}",request.getServerPort());
return String.format("Hi, there. This is a message from First Service on PORT %s", env.getProperty("local.server.port"));
}
원래는 아무런 입력값이 없었는데 HttpServletRequest request 부분이 추가됐네요. 해당값에서 요청값에 대한 정보를 가지고 있어요. 이제 log를 활용해서 해당 값을 출력해볼게요. request안에 getServerPort() 함수는 포트에 대한 정보를 가지고 있어요, 그리고 마찬가지로 env.getProperty("local.server.port")도 같은 정보를 가지고 있어요. 그래서 해당 URL로 접근하게 되면 화면에도 포트가 출력되고 로그에도 포트가 출력될거에요 한번 확인해볼까요?
#test case 1
#test case2
Test Case라고 거창하게 써놓긴 했지만 단순히 똑같은 요청을 두번 보냈을 뿐인데 서로 다른 포트를 참조하는게 보이시나요?. 아마 순차적으로 계속해서 변동되는 것을 확인 할 수 있을거에요.
지금까지 로드밸런싱에 대해서 이론을 말씀드리지 않았는데 여기까지 잘따라오셨다면, 사실 여러분은
로드밸런싱의 황제입니다.
#이미 로드밸런싱의 황제인 저희들이지만 그래도 조금은 자세히 알고가자!
🤴 나 | 로드밸런싱이 무엇인지 읊어 보거라 |
로드밸런싱이란, 쉽게 말해서 부하 분산 시스템 입니다. | |
🤴 나 | 그럼 그 부하분산이 어떻게 이루어지는 건가? |
지금까지 진행하신 내용을 보니 서로 다른 Port를 사용해서 로드밸런싱을 이루셨네요? | |
🤴 나 | 머 글쵸 ㅋ |
그럼 포트의 분산을 통해서 이제 서버의 과부하를 막을 수 있어요 서버에 오는 부하를 두 포트로 분산 시켜서 보내서 응답속도는 늘리고 부하는 줄일 수 있겠죠? | |
🤴 나 | 호오... 그럼 부하가 클만한 서비스는 로드밸런싱이 필수겠구나 |
네 맞아요! 정확해요 |
쉽게 말해서 로드밸런싱은 서버에 오는 부하를 줄이기위한 분산 시스템이에요. 규모가 큰 서비스 일수록 포트를 분산시켜서
서버에 오는 부하를 줄이는게 중요하다는 개념에서 시작된 시스템이죠!
복잡한 내용이지만 읽어주셔서 감사합니다. :)
'웹 프로그래밍 > MSA 학개론' 카테고리의 다른 글
[MSA] Spring Cloud로 개발하는 E-commerce 마이크로 서비스 어플리케이션(User Service) - 1 - (0) | 2022.04.08 |
---|---|
[MSA] Spring Cloud로 개발하는 E-commerce 마이크로 서비스 어플리케이션 - 0 - (0) | 2022.04.08 |
[MSA] Spring Cloud로 개발하는 MS 어플리케이션 (Load Balancer) - 8 - (0) | 2022.04.08 |
[MSA] Spring Cloud로 개발하는 MS 어플리케이션 ( Gateway Global Filter) - 7 - (0) | 2022.04.08 |
[MSA] Spring Cloud로 개발하는 MS 어플리케이션 ( Gateway Custom Filter) - 6 - (0) | 2022.04.08 |
- Total
- Today
- Yesterday
- prometheus
- producer
- Spring + ELK
- kafka
- springcloud
- Logstash 활용
- consumer
- LoadBalancer
- git
- Kafka Connect
- docker
- github
- 루틴기록
- zipkin
- config
- Logstash to ElasticSearch
- 미래의나에게동기부여
- UserService
- Gateway
- ACTUATOR
- elasticSearch
- 운동일기
- 빅-오
- MariaDB
- 오늘저녁 삼겹살
- JWT
- rabbitmq
- 운동
- MSA
- Feign
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |