[MSA스터디] 5. 마이크로서비스 도구 다루기 -1 (with 에러해결..)

vector13·2022년 9월 14일
0
post-thumbnail

UI를 따로 두고 마이크로 서비스와 통신하면 환경은 더욱 복잡해진다. --> 이게 마이크로 서비스 (장점만큼 복잡해짐)

이번 장에서는

  • 두 개의 서비스를 호스트명과 포트로 호출하는 UI부터 시작,
    -> 서비스끼리 강하게 결합되어 인프라를 확정해도 시스템은 확장할 수 없으며 유지 관리가 매우 어려운 시스템이 됨==> 디스커버리 개념 도입해서 서비스 결합도 낮춤
  • 그 다음에 서비스 확장해서 고가용성 어떻게 확보할지 분석
  • 현재 아키텍처 평가후 서버 측 로드밸런싱 할 수 있는 라우팅 서비스(게이트웨이) 살펴봄

이런 목표 위한 도구 : 스프링 클라우드 Spring Could
(스프링 클라우드의 유레카 Eureka, 리본Ribbon, 주울Zuul, 하이스트릭스Hystrix)

1. UI 추출하고 게임화 서비스와 연결하기

이번 장 코드는 아래 링크에 있음
https://github.com/wikibook/springboot-microservices/tree/master/microservices-v6

  • 위 그림에서 왼쪽 : ui 추출 하지 않는 경우 -> 곱셈 마이크로서비스가 정적 콘텐츠 제공
    해당 코드에는 게임화 서비스의 rest api 참조 필요하다.
    UI는 두 마이크로서비스에 걸친 기능 포함해서 더이상 곱셈에만 국한X

단점 : 상호 의존성, 확장의 유연성X

  • 위 그림 오른쪽 : 우리가 앞으로 나아갈 길
    곱셈서비스에서 정적 콘텐츠 추출 후 새로운 웹 서버 컴포넌트에 넣음 (9090배포 예정)

자바스크립트 코드는 ui 없는 곱셈 및 게임화 서비스에서 제공하는 rest api와 연결

정적 콘텐츠 옮기기

서비스 분리 위해서 정적 콘텐츠 옮긴다. 스프링부트까진 말고 경량 웹서버
tomcat, nginx, jetty등 다양한 웹서버 존재
그 중 jetty 사용 (자바 위 동작, 리눅스, 윈도우 모두 쉽게 설치 실행 가능)

jetty 설치 : https://www.eclipse.org/jetty/download.php
설치 버전 : 10.0.11

cmd 에서 서버 띄우기
ui 있는 폴더에서 cmd 띄우고
java -jar '아까 jetty 다운받아서압축푼 파일경로'/start.jar

http://localhost:9090/ui/index.html 로 접속 시 jetty 웹 서버가 제공하는 웹페이지 보임

페이지에서 CORS 문제가 나오고 있어서 스프링 시큐리티 처리해준다.
다른 오리진에서 오는 요청 허용하기 위해서 백엔드 서비스에서 CORS(Cross-Origin resource Sharing)을 활성화

package microservices.book.gamification.configuration;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
@EnableWebMvc
public class WebConfiguration extends WebMvcConfigurerAdapter {

  /**
   * CORS(Cross-Origin Resource Sharing) 설정
   * 자세한 정보 : http://docs.spring.io/spring/docs/current/spring-framework-reference/html/cors.html
   *
   * @param registry
   */
  @Override
  public void addCorsMappings(final CorsRegistry registry) {
    registry.addMapping("/**");
  }

}

gameification 애플리케이션 을 실행하려했는데
AMQP 관련해서
org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection refused: connect

Caused by: java.net.ConnectException: Connection refused: connect
에러가 떴다

구글링 해서 아래 코드를 추가했지만 여전히 에러였음

#spring.rabbitmq.host=loalhost
#spring.rabbitmq.port=5672
#spring.rabbitmq.username=root
#spring.rabbitmq.password=123456

시간이 걸려 생각해보니 이전 장에서 rabbitMQ를 안깔았다!!!
브로커를 실행하지 않으니 브로커가 없다는 에러가 뜨지.... 참내.... (p134, p153 )

rabbitMQ 설치

Erlang 설치
https://www.erlang.org/downloads

rabbitMQ 설치
https://www.rabbitmq.com/download.html 에서 rabbitMQ 다운로드

설치 완료

브로커 실행
rabbitMQ Service -start 통해서 실행

rabbitMQ는 아래 폴더에 기본으로 설치된다.
C:\Program Files\RabbitMQ Server\


여기서 cmd 띄우고 rabbitMQ 잘 돌아가는지 확인

rabbitmq-plugins enable rabbitmq_management
를 통해서 management 페이지로 가야하는데

rabbitmq_managemt Error: {:plugins_not_found, [:rabbitmq_managemt]} 에러뜸

해결 : cmd 를 관리자모드로 실행 후 같은 명령어 기입

성공

http://localhost:15672/ 로 RabbitMQ Management 접속


guest/guest 로 접속 가능

이제 다시 GamificationApplication 실행 해보자

꺄 드디어 돌아간다

드디어...!!! 울랄라.... 홀리몰리 과카몰리~~

그런데 점수가 또 안보인다....
ConditionalRejectingErrorHandler : Execution of Rabbit message listener failed.

Caused by: org.springframework.messaging.converter.MessageConversionException: Could not read JSON:

Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of microservices.book.gamification.event.MultiplicationSolvedEvent (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

구글링 통해서 원작 저자의 github에서 있던 issue를 참고해서 lombok.config 파일 생성
https://github.com/microservices-practical/microservices-v5/pull/1
lombok.anyConstructor.addConstructorProperties=true

여전히 이 부분에서 에러

에러는
org.springframework.amqp.rabbit.support.ListenerExecutionFailedException: Listener method could not be invoked with the incoming message
Endpoint handler details:
Method [void microservices.book.gamification.event.EventHandler.handleMultiplicationSolved(microservices.book.gamification.event.MultiplicationSolvedEvent)]

Caused by: org.springframework.messaging.converter.MessageConversionException: Could not read JSON: Cannot construct instance of microservices.book.gamification.event.MultiplicationSolvedEvent`

Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of microservices.book.gamification.event.MultiplicationSolvedEvent`

lombok.config에 아래코드 추가 했음
config.stopBubbling = true

그리고 재 빌드를 해주었다!!!

드디어 된다...... 하..... 자야겠다.... 이거 해결하느라 시간을 너무 많이 썼다...내일 민서한테 혼나겠드아...

너무 길어져서 2부터 7까지 내용은 다음 게시글에서 작성하겠다

profile
HelloWorld! 같은 실수를 반복하지 말기위해 적어두자..

0개의 댓글