Computer Science/MSA

    Monolithic Architecture란 무엇인가?

    Monolithic, MSA, SOA 정리 1편 Monolithic Architecture 개발되는 서비스의 모든 비즈니스 로직, UI, 데이터베이스 등을 한 곳에 다 때려넣고 운영하는 구조로 프로그램을 설계하는 방법이다. 하지만 소프트웨어의 규모가 커지고 복잡해지는 현 상황에서 대규모 서비스를 제작하기에는 합리적이지 않기에 서비스 개발 초기 빠른 개발을 위해 사용하더라도 해당 서비스가 어느정도 사업 모델로서 인정을 받고 기능들이 추가되면서 프로그램 복잡도가 높아진다면 MSA로 변경 작업을 거친다. 그렇기 때문에 처음부터 대규모 프로젝트를 생각했다면 사용되지 않는다. 장점 -하나의 언어와 프레임워크에 종속되어 구현하는 사람 입장에서는 하나의 언어와 프레임워크만 사용하면 된다. -하나의 프로그램을 실행하면..

    081321 MSA_SpringCloud

    Apigateway-service 해당 서비스는 rabbitmq, eureka-server(discovery-service), config-service를 사용한다. 도커 run 옵션을 줄때 환경변수를 세팅해서 연관된 서비스들과 연결될 수 있게 해야 한다. docker run -d -p 8000:8000 --network ecommerce-network -e "spring.cloud.config.uri=http://config-service:8888" \ -e "spring.rabbitmq.host=rabbitmq" \ -e "eureka.client.serviceUrl.defaultZone=http://discovery-service:8761/eureka/" \ --name apigateway-serv..

    081221 MSA_SpringCloud

    Rabbitmq Rabbitmq를 Docker에서 실행 Rabbitmq 다운로드 사이트에 들어가면 Docker에서 어떻게 써야하는지 명령어가 나와있다. docker run -d --name rabbitmq --network ecommerce-network -p 15672:15672 -p5672:5672\ -p 5671:5671 -p 15671:15671 -p 4369:4369 -e RABBITMQ_DEFAULT_USER=guest\ -e RABBITMQ_DEFAULT_PASS=guest rabbitmq:management -d는 백그라운드에서 실행옵션 --name은 컨테이너 이름지정 옵션 --network는 docker의 어떤 network에서 사용하겠다는 옵션 -p는 포트바인딩해주는 옵션 Rabbitm..

    081121 MSA_SpringCloud

    현재까지 개발한 것들을 Docker에 올려서 Sevice해보자 docker 명령어 ex> mysql docker run -d -p 3306:3306 --name mysql mysql:${version} docker run은 create + start 합쳐놓은것 -d 옵션 : 백그라운드에 실행 -p 옵션 : 포트설정 -p 3306:3306 앞부분포트는 Host에서 접근하고자하는 포트 뒷부분포트는 컨테이너에서 응답하는 포트 --name 옵션 : container의 이름 설정, 설정안하면 임의의 이름 들어감 docker exec -it mysql bash 실행중인 컨테이너에 명령을 실행하거나 shell로 진입하려 사용 Docker Network 사용 docker는 3개의 Network방식 제공 Bridge, ..

    081021 MSA_SpringCloud

    Prometheus, Grafana 설치 https://prometheus.io/download/ Download | Prometheus An open-source monitoring system with a dimensional data model, flexible query language, efficient time series database and modern alerting approach. prometheus.io https://grafana.com/get/?plcmt=top-nav&cta=downloads OS에 맞춰서 다운로드 받고 Grafana는 cloud 말고 self-managed에서 다운로드 받는다. Window기준 Prometheus폴더에서 prometheus.yml에서 내가 s..

    080921 MSA_SpringCloud

    Micrometer - JVM 기반의 Application의 Metrics 제공 - Prometheus등의 다양한 모니터링 시스템지원 Timer - 짧은 지연 시간, 이벤트의 사용빈도를 측정 - 시계열로 이벤트 시간, 호출 빈도 등의 정보를 제공 - @Timed 어노테이션을 메소드에 붙여 사용 MSA에 Micrometer 적용 pom.xml에 Micrometer Dependency 추가 application.yml의 actuator에 info, metrics, prometheus 추가 메소드위에 어노테이션 @Timed Prometheus - Metrics를 수집하여 모니터링 및 알람에 사용되는 Opensource Application - CNCF에서 두번째로 관리하는 프로젝트(첫번째는 k8s) - 시계열..

    080821 MSA_SpringCloud

    Micro Service의 분산 추적 Zipkin - 타이밍 데이터 수집, 추적 시스템 - Google의 Drapper에서 발전 - 분산환경에서 시스템 병목현상 파악 - Collector, Query Service, Database, Web ui로 구성 - Span 하나의 요청에 사용되는 단위 64bit UniqID - Trace 트리구조로 이루어진 Span Set 하나의 요청에 대한 같은 TraceID 발급 SpringCloud Sleuth - Spring Boot APP과 Zipkin과 연동 - 요청 값에 따른 Span ID,Trace ID 부여 - Trace, Span ID를 로그에 추가 가능 Servlet filter, REST Template, Scheduled Actions, Message C..

    080721 MSA_SpringCloud

    주문이 들어오면 Kafka Message 만들어서 전달하자. Message구성 = Schema, Field(DB 정보), Payload(DB 값) --> 만드는 방식에 대해 코드로 올려보자 Service가 Kafka topic에 Message 전달 Kafka Sink Connect가 해당 Message를 쿼리로 DB(MariaDB)에 전달하여 저장하는 형식 MSA 운영중에 다른 Service가 오류가 발생해도 현재 사용하는 Service에서는 문제가 없는 것처럼 보여야한다. CircuitBreaker -> 장애가 발생한 서비스에 반복적인 호출이 되지 않게 장애가 발생시 차단시킴. 장애가 발생한 서비스를 계속 호출하면 서비스가 느려지거나 다른 기능으로 대체수행 되도록 해야함 = 장애회피 CircuitBre..

    080621 MSA SpringCloud

    Order Service에 Kafka 설정 Controller에 kafka Message Producer 작업 두개의 Order Service를 실행 -> Postman으로 주문 API를 전송하여 저장한 뒤 조회하면 두개 Order Service의 DB(MariaDB)에 분산되어 주문이 저장됨 = 각 OrderService가 독립적인 DB를 가지고 있어서 그런것 DB에 바로 저장하는게 아니라 kafka Topic으로 주문 내용을 전송 -> Kafka Sink Connect에서 mariaDB로 전달하도록 수정해서 단일 DB에 저장하도록 수정

    080521 SpringCloud_MSA 공부

    kafka Source Connect추가 localhost:8083/connectors (Postman으로 Post로 전송 아래내용을 JSON형식으로) { "name" : "my-source-connect", "config" : { "connector.class" : "io.confluent.connect.jdbc.JdbcSourceConnector", "connection.url":"jdbc:mysql://localhost:3307/mydb", "connection.user":"root", "connection.password":"${password}", "mode": "incrementing", "incrementing.column.name" : "id", "table.whitelist":"users..