반응형

아래와 같은 URL 이 있다고 치자. 

http://localhost:8080/id/abcd.efg

 abcd 와 efg 사이에 점 ( . )이 있다.

@slf4j
@RequestMapping(value = {"/id/{userId}"}
public String TestController(@PathVariable String userId) {
	log.info(userId);
    .
    .
}

url에 해당하는 컨트롤러에서는 

"abcd" 만 출력하게 된다.

abcd 다음에 들어간 점( . ) 이후로는 인식되지 않는다.

@도 마찬가지.

이럴때는

@slf4j
@RequestMapping(value = {"/id/{userId:.+}"}
public String TestController(@PathVariable String userId) {
	log.info(userId);
    .
    .
}

위처럼 

@RequestMapping 의 url에 해당하는 곳 뒤쪽에 ":.+" 를 붙여 넣어주자.

그럼 점( . ) 같은 문자도 정상적으로 문자로 인식한다.

반응형
반응형

Spring Cloud의 오픈소스. 

MSA의 기반 구조가 되는 Service Discovery 의 한 종류로 IP, PORT, ID값을 저장 / 관리하는 Rest 기반 미들웨어 서버.

 * Service Discovery : MSA에서 다수의 서비스 관리가 필요함에 따라 서비스 호출 경로 등의 정보들을 저장, 관리하는 것.  

  => 클라이언트가 서비스 호출 시 해당 서비스의 위치를 Eureka 에게 물어봄. (굳이 물어보는 이유? MSA에서는 서비스들의 IP와 PORT가 지속적으로 변함. 이를 관리하고 있는것이 Eureka 이기 때문.)

간단한 설정과 서비스별 LB(로드밸런싱) 이 가능한 장점.

 

Eureka 는 Server 와 Client로 나눔.

 - MSA 내 Client 서비스가 시작되면 유레카 Server  에 해당 Client 등록됨.

 - 주기적으로 ping으로 서버를 확인하며 리스트를 관리함.

 

 

반응형
반응형

특징

  • 인메모리 데이터베이스. : 메모리에 모든 데이터를 올려 동작하므로 빠른 처리가 가능함.
  • NoSQL 로서 key - value 형태의 데이터 구조를 가짐.
  • 다양한 형태의 자료구조 사용가능. : 개발 난이도가 낮아져 편의성 증대.

 

주 사용처

  • 캐싱 : 다른 DB 앞에 배치하여 빠른 응답시간과 RDB의 부담을 줄이는 역할.
  • 세션 관리 : TTL과 함께 빠른 key - value 스토어로 사용하여 손쉬운 세션관리.
  • 분산 환경에서의 이점 : 원격 시스템간 동일한 맵 형태의 데이터를 참고해야 할 때, 시스템 별 동기화가 어려운 문제가 있음. Redis 서버를 별도로 구축하여 값을 저장해두고 시스템마다 Redis 서버에서 값을 꺼내어 쓴다면 빠른 처리시간과 데이터 불일치 문제 해결 가능.
반응형
반응형

개요

PM2의 역할과 사용법을 간단하게 알아보자.

  • 목차
    • PM2란?
    • pm2 설치
    • pm2 명령어

 

PM2란?

공식 홈페이지에 나온 설명을 보면

PM2 is a daemon process manager that will help you manage and keep your application online. 요약하면 PM2는 어플리케이션의 관리와 온라인상태를 유지하도록 돕는 역할을 하는 데몬 프로세스 관리자 라고 한다.

PM2 장점

  • 어플리케이션의 예상치 못한 종료시 자동 재시작
  • 배포시에도 무중단 서비스
  • 클러스터 모드
  • 모니터링

 

PM2 설치

$ npm install pm2@latest -g

또는

$ yarn global add pm2

위 명령어로 최신버젼을 설치할 수 있다.

 

PM2 명령어

이 명령어로 간단한 pm2의 사용예를 볼 수 있다.

pm2 examples

 

서버 시작

app.js 라는 소스가 있다는 가정하에

$ pm2 start app.js

이 명령어 한 줄로 쉽게 서버를 데몬화 하고 모니터링 할 수 있다.

 

프로세스 관리

$ pm2 restart app_name
$ pm2 reload app_name
$ pm2 stop app_name
$ pm2 delete app_name

app_name 대신에 all 이나 id 를 사용할 수 있다.

  • all : 모든 프로세스를 실행한다.
  • id : 특정 프로세스 id만 실행한다.

 

목록 보기

$ pm2 [list|ls|status]

 

로그 보기

$ pm2 logs // 기본 15줄의 로그가 보인다.

$ pm2 logs --lines 200 // 여러줄을 보고 싶을 경우 --lines 옵션을 사용한다.

실시간 로그도 간단한 명령어 하나로 확인 가능하다.

 

모니터링

$ pm2 monit

이 명령어로 대쉬보드 형태로 모니터링도 가능하다.

클러스터 모드

pm2를 클러스터 모드로 실행하지 않으면 fork 모드로 실행이 되는데 fork모드는 싱글스레드로만 동작한다.
pm2의 장점인 멀티 스레드를 활용하기 위해 클러스터 모드로 실행해보자.

  • 클러스터 옵션
    --watch : PM2가 어플리케이션 변경사항을 자동으로 감지하여 서버를 재시작함
    -i (코어수) : 클러스터 모드로 실행할 시 사용할 코어수. max 로 적을시 cpu 코어 수 만큼 할당됨
    --name : 어플리케이션 이름
    --log (경로) : 로그 파일 경로
    -- arg1 arg2 arg3 : 스크립트에 전달 될 파라미터
    --restart-delay (딜레이 시간) : 재시작시 딜레이 시간 지정 (ms)
    --no-autorestart : 재시작 불가능하도록 설정함
    

클러스터를 더욱 편하게 관리하기 위해 전용 설정파일을 이용할 수도 있다.

$ pm2 ecosystem
File C:\ecosystem.config.js generated

위 명령어는 자동으로 ecosystem.config.js 파일을 생성한다.
이 파일에서 클러스터 옵션들을 설정하여 사용할 수 있다.

// ecosystem.config.js 설정 예
module.exports = {
  apps : [{
    name   : "app1",
    script : "./app.js",
    env_production: {
       NODE_ENV: "production"
    },
    env_development: {
       NODE_ENV: "development"
    }
  }]
}

ecosystem.config.js 을 실행하는 것으로 해당 옵션이 실행된다.

하단에는 간단히 적은 옵션들.

  • General
    • name : “my_app” // 어플리케이션 명칭
    • script : “./api/app.js” \/\/ pm2 시작 스크립트 경로
    • cwd : “/var/www/” // 앱이 실행될 디렉토리
    • args : “-a 13 -b 12” // CLI에서 실행하는 모든 아규먼트
    • interpreter : “/usr/bin/python” // 인터프리터 경로 (기본값은 node)
    • interpreter_args : “–harmony” // 인터프리터 파라미터 옵션
    • node_args : // interpreter_args 의 별칭
  • Advanced features
    • instances : 0 // 인스턴스 수. 0이면 CPU 코어수만큼.
    • exec_mode : “cluster” // cluster 또는 fork 모드 선택. 기본은 fork 모드
    • watch : true // 폴더 혹은 하위 폴더를 감시하여 변경시 어플리케이션 reload
    • ignore_watch : [”[\/\]./”, “node_modules”] // watch 제외경로
    • max_memory_restart : “150M” // 설정한 메모리를 초과하면 자동으로 어플리케이션 재시작
    • source_map_support : true // 소스 맵 파일의 활성화/비활성화 설정. 기본값은 true
  • Log files
    • log_date_format : “YYYY-MM-DD HH:mm Z” // 로그 날짜 포멧
    • error_file : // 에러로그 파일 경로 (기본 경로는 $HOME/.pm2/logs/-error-.log)
    • out_file : // 로그 파일 출력 경로 (기본 경로는 $HOME/.pm2/logs/-out-.log)
    • log_file : // error_file, out_file 두 파일의 경로. 기본은 비활성화
    • pid_file : // pid 파일경로 (기본 경로는 $HOME/.pm2/pids/-.pid)
  • Control flow
    • min_uptime : // 어플리케이션이 시작되었다고 생각하는 최소 시간
    • listen_timeout : 8000 // 강제 reload가 일어나기 전 대기시간(ms)
    • kill_timeout : 1600 // 최종 SIGKILL 을 보내기 전 대기시간(ms)
    • shutdown_with_message : false // 어플리케이션 종료 수행 시 process.kill(pid, SIGINT) 명령어 대신 process.send(‘shutdown’)로 수행
    • wait_ready : false // Reload 대기 이벤트 대신 어플리케이션의 process.send(‘ready’) 를 기다린다
  • Deployment
    • key : SSH key path. Default $HOME/.ssh
    • user : SSH user
    • host : SSH host
    • ssh_options : SSH options with no command-line flag, see ‘man ssh’
    • ref : GIT remote/branch
    • repo : GIT remote
    • path : path in the server
    • pre-setup : Pre-setup command or path to a script on your local machine
    • post-setup : Post-setup commands or path to a script on the host machine
    • pre-deploy-local : pre-deploy action
    • post-deploy : post-deploy action

그 외 옵션 링크

반응형
반응형

개요

Spring Cloud OpenFeign에 관해 간단하게 알아보자.

  • 목차
    • OpenFeign 이란?
    • 기본설정
    • 사용법
    • 기타설정
  •  

 

OpenFeign 이란?

  • 외부 API 호출을 쉽게할 수 있도록 도와주는 HTTP 클라이언트 도구로 어노테이션으로 손쉽게 구현가능하다. Spring Cloud에서 Open Feign을 스프링 클라우드로 통합하였다.

 

기본설정

  • spring-cloud-dependencies 와 openfeign 의존성 추가를 해준다.
// Gradle 기준 예시
compile("org.springframework.cloud:spring-cloud-dependencies:Finchley.SR3")
compile("org.springframework.cloud:spring-cloud-starter-openfeign:2.1.4.RELEASE")
  • Application 파일에 @EnableFeignClients 어노테이션을 추가해준다.
@SpringBootApplication
@EnableFeignClients	// 요거 추가 필요.
public class WebApplication {
	public static void main(String[] args) {
		SpringApplication.run(WebApplication.class, args);
	}
}

 

사용법

jpa 사용법과 유사하다.

interface 를 만들고,
@FeignClient 어노테이션을 정의하고
호출하기만 하면 된다.

// 동일한 도메인을 이용하는 여러 API의 경우 @FeignClient URL 속성에 공통부분을 적어주고, 
// interface 내부에 메서드를 정의할 때 개별 url 뒷부분의을 적어주면 이용 가능하다.
@FeignClient(name = "testApi", url = "https://api.test.com", configuration = TestApi.Configuration.class)
public interface TestApi {
	@GetMapping(value = "/abc/auth", headers = "Accept=application/json")	
	String getAuth(@RequestHeader("aaa") String param1, @RequestHeader("bbb") String param2);	// 헤더에 들어갈 파라미터를 정의할 수도 있다.


	@GetMapping(value = "/def/select", headers = "Accept=application/json")
	List<UserDao> getSelect(@SpringQueryMap UserDao param);

	// interface 내에 설정을 정의할 수도 있다.
	class Configuration {
		@Bean
		Encoder feignFormEncoder(ObjectFactory<HttpMessageConverters> converters) {
			return new SpringFormEncoder(new SpringEncoder(converters));
		}
	}
}

위 클래스 안의 메서드를 호출하기만 하면 API 통신이 가능하다.

 

기타설정

타임아웃 설정

OpenFeign 이 제공하는 타임아웃은 두 종류가 있다.

  • connectTimeout: 1000
  • readTimeout: 30000

시간은 ms 기준으로, 1000 = 1초 이다.

설정은 properties 파일과 java Configuration 에서도 가능하며, properties가 우선순위를 가진다.
각 클라이언트 별로 다른 설정이 필요하면 @FeignClient 에 직접 Configuration을 설정하면 된다.

#yml 사용 예
feign:
   client:
      config:
         default:
            connectTimeout: 15000
            readTimeout: 15000

로그설정

로그는 각각의 Feign client 마다 만들어지며 기본적으로 로그의 이름은 Feign client를 사용하는 인터페이스 명이다. Feign logging 은 오직 DEBUG level 에서 동작한다.

  • NONE : 로그 없음 (기본)
  • BASIC : 요청 메서드와 URL, 응답 상태코드와 실행 시간만 남긴다.
  • HEADERS : 요청, 응답 헤더와 가본정보들만 남긴다.
  • FULL : 헤더, 바디, 요청과 응답의 메타 데이터 모두 남긴다.

다음은 full 속성으로 로그를 설정한 예제이다.

@Configuration
public class FooConfiguration {
	@Bean
	Logger.Level feignLoggerLevel() {
		return Logger.Level.FULL;
	}
}
반응형

+ Recent posts