Spring Cloud로 개발하는 마이크로서비스 2

Seung jun Cha·2022년 7월 9일
0

1. Spring Cloud Config

1-1 개념

  • 서버 구성에 필요한 설정정보(application.yml)를 애플리케이션 내부가 아닌 하나의 중앙화된 저장소에서 관리
  • DEV - UAT - PROD 환경에 맞는 구성정보 사용가능(개발 - 테스트 - 프로덕션)
  • 각 서비스를 다시 빌드하지 않고 바로 적용가능
  • application.yml - application-name.yml - application-name<profile>.yml

1-2 과정

1-2-1 git bash

  1. mkdir로 디렉토리 생성
  2. cd 디렉토리로 이동
  3. git init로 깃 시작 : 현재 디렉토리 위치에서 깃 지역저장소 생성
  4. vim ecommerce.yml파일 생성
token:
  expiration_time: 86400000
  secret: user_token

gateway:
  ip: 127.0.0.1 
  1. git add ecommerce.yml
  2. git commit -m "upload an application taml file" 깃 커밋

1-2-2 애플리케이션

  • @EnableConfigServer로 등록 : 기본 포트번호가 8888
server:
  port: 8888

spring:
  application:
    name: cong-service
  cloud:
    config:
      server:
        git:
          uri: file:///Users/Cha/Desktop/마이크로서비스/git-local-repo 
          => file:// + yml파일의 경로(명령어 pwd)

1-2-3 서비스와 cloud config 연동

  • 서비스에 cloud config와 연동하기 위해 yml에 설정
 spring:
  application:
    name: user-service
  config:
    import: optional:configserver:http://localhost:8888
  cloud:
    config:
      name: ecommerce  // cloud config의 yml파일 이름
       => cloud config의 yml파일의 설정을 가져와서 서비스에 적용

1-3 changed cloud config 가져오기

1-3-1 Spring boot actuator

  1. Application 상태 모니터링 , Metrix 수집을 위한 Http End point 제공
  2. 서비스에 적용
 http.authorizeRequests().antMatchers("actuator/**").permitAll(); 
 => webSecurity 클래스에 경로 설정

management:
  endpoints:
    web:
      exposure:
        include: refresh, health, beans

=> refreshcloud config 정보가 변경되었을 때, actuator/refresh 를 uri로 Post 호출하면 서비스를 재가동하지 않아도 변경된 config정보를 적용할 수 있음 , 나머지는 Get방식
마이크로서비스가 많으면 refresh 해야할 횟수가 많아지므로 매우 불편

  1. ApiGateway에 적용
- id: user-service
  uri: lb://USER-SERVICE
  predicates:
   - Path=/user-service/actuator/**
   - Method=GET,POST
  filters:
   - RemoveRequestHeader=Cookie
   - RewritePath=/user-service/(?<segment>.*), /$\{segment}
   
management:
  endpoints:
    web:
      exposure:
        include: refresh, health, beans, httptrace
        
        => httptrace 기능을 사용하기 위해서는 
        HttptraceRepository를 빈으로 등록해야함
        
 @Bean
 public HttptraceRepository httptraceRepository(){
 	return new InMemoryHttptraceRepository();
    }

1-3-2 Spring cloud Bus

  • 분산 시스템의 서비스를 경량 메시지 브로커와 연결하고, 변경 사항을 연결된 모든 노드(service)에 전달
  • AMQP : 메시지 지향 미들워에를 위한 개방형 표준 응용 계층 프로토콜, Erlang, RabbitMQ에서 사용
    - RabbitMQ

    1. 메시지 브로커
    2. 초당 20+의 메시지를 소비자에게 전달
    3. 메시지 전달 보장, 시스템 간 메시지 전달
    4. 브로커, 소비자 중심
  • Kafka : Scalar 언어로 개발한 오픈 소스 메시지 브로커 프로젝트, 분산형 스트리밍 플랫폼으로 대용량 데이터를 처리할 수 있는 메시징 시스템

    • 초당 100K+ 이상의 이벤트 처리
    • Pub/Sub, Topic에 메시지 전달
    • Ack를 기다리지 않고 전달가능
    • 생산자 중심
  1. Erlang, RabbitMQ, RabbitMQ management 설치
  2. config 서버, Gateway, 마이크로서비스에 amqp, actuator 의존성을 추가
  3. config 서버, Gateway, 마이크로서비스를 RabbitMQ에 노드 연결,
    endpoint 설정
    => RabbitMQ의 client로 관리됨
    => 코드가 변경되면 busrefresh로 RabbitMQ에 알리고 RabbitMQ는 자신에게 연결된 다른 서비스에 변경된 코드를 자동으로 push
spring:
  application:
    name: config-service
  rabbitmq:
    host: 127.0.0.1
    port: 5672  //웹브라우저에서 접속할때는 15672 , 
    시스템에서 amqp프로토콜을 사용할 때는 5672
    username: guest
    password: guest
    
management:
  endpoints:
    web:
      exposure:
        include: health, busrefresh
  1. 테스트 과정
    (1) RabbitMQ server 시작
    (2) Cloud config service 시작
    (3)Eureka Discovery service 시작
    (4)Gateway service 시작
    (5)마이크로서비스 시작

1-4 profiles를 사용한 config 적용

  • 해당하는 profiles의 yml을 config에서 가져옴
  • apigateway와 service의 yml에서 spring.cloud.config.name이 같아야한다??
profiles:
    active: dev , prod 등.. [application]-[profiles].yml

1-5 git에서 config 가져오기

  • config-service의 yml
spring:
  application:
    name: config-service
  cloud:
    config:
      server:
        git:
#          uri: file:///Users/dowonlee/Desktop/Work/git-local-repo
          uri: https://github.com/joneconsulting/spring-cloud-config
#          basedir: /Users/dowonlee/Desktop/Work/tmp/config-repo
#          username: [username]
#          password: [password]
=>remote git repository가 private이라서 아이다와 비밀번호가 필요한 경우

0개의 댓글