0531 - 0606
# 0531 - 0606
# 0531 - hal+json
# Hypertext Application Language (HAL)
HAL은 JSON 또는 XML 코드 내의 외부 리소스에 대한 링크와 같은 하이퍼 미디어를 정의하기위한 인터넷 초안 표준 규칙.
- MIME 유형 media type :
application/hal+json
# HAL 예
{
"_links": {
"self": {
"href": "http://example.com/api/book/hal-cookbook"
}
},
"id": "hal-cookbook",
"name": "HAL Cookbook"
}
# 0601 - jmap으로 JVM heap 상태 확인
JDK에 포함된 jmap 명령으로 실행 중인 JVM의 heap 상태를 확인해보자.
- JVM의 프로세스 ID 확인
$ jps
또는
$ ps -ef | grep java
- JVM의 heap 상태를 확인할 때는 -heap 옵션을 사용한다.
$ jmap -heap PID
- -histo 옵션으로 클래스별 객체 수와 메모리 사용량 확인
$ jmap -histo:live PID | more
- -dump 옵션으로 heap dump 후, MAT 등으로 분석
$ jmap -dump:format=b,file=heap.PID.hprof PID
# 0602 - jenkins를 이용해서 배포하기
# 젠킨스의 큰 기능 두가지
- Build & Deploy
- Batch
# 젠킨스 설치
# jenkins
sudo yum install wget
sudo yum install maven
sudo yum install git
sudo yum install docker
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
sudo yum install jenkins
sudo systemctl start jenkins
sudo systemctl status jenkins
- 초기 비밀번호 확인
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
# 배포시 젠킨스 인스턴스만 접속할 수 있게 하기
Publish over SSH 플러그인 설치(젠킨스 인스턴스)
공개키 & 개인키(젠킨스 인스턴스)
// 공개키 & 개인키 생성
ssh-keygen -t rsa -f ~/.ssh/id_rsa
// 키 복사
vi ~/.ssh/id_rsa.pub // 해당내용 복사
*** gcp 환경에서는 authorized_keys 수정 불가능
- 공개키 등록(워커 인스턴스)
// authorized_keys 파일 끝에 공개키 복사
vi ~/.ssh/authorized_keys
- 폴더들 권한 변경(워커 인스턴스)
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
- Publish over SSH 설정 추가
- 개인키 및 워커 서버정보 추가
# 배포스크립트 관리 및 빌드
- item 추가
- item 설정 및 빌드 후 조치 설정
- 관리 및 빌드 명령어
nohup docker run -p 8080:80 sung431/spring-boot-cpu-bound > /dev/null 2>&1 &
- docker.sock 권한 변경
sudo chmod 666 /var/run/docker.sock
- build
- console 확인
# 정리
- 소스코드는 GitHub가 가지고 있다.
- 애플리케이션 실행은 인스턴스에서 되어야 한다.
- 인스턴스에서 바로 GitHub에 있는 소스코드를 가져와서 빌드 후 실행시킬 수도 있지만, 이러면 매번 인스턴스에 접속해야한다.
- 인스턴스가 여러개면 여러개의 인스턴스에 각각 다 접속해서 3번을 해야한다. 비효율적
- 중간에 Jenkins 라는 미들웨어를 두고, GitHub에서 소스코드를 가져와서 빌드하고 인스턴스에 배포/실행 할 수 있다.
- 5번을 위해 Jenkins에 GitHub 저장소 URL을 등록하고, 빌드 스크립트를 작성하고, 배포될 인스턴스에 SSH로 접속할 수 있도록 세팅한다.
- 6번까지 완료되었으면 이제 Jenkins에서 간단히 배포할 수 있다.
- 명령어 정리
// 1. jenkins-instance 서버 명령어
$ sudo yum install wget
$ sudo yum install maven
$ sudo yum install git
$ sudo yum install docker
$ sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
$ sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
$ sudo yum install jenkins
$ sudo systemctl start jenkins
$ sudo systemctl status jenkins
// 2. cpu-instance 서버 명령어
$ vi authorized_keys
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys
$ sudo chmod 666 /var/run/docker.sock
# 0605 - @Bean 과 @Component 차이
# @Bean 과 @Component 차이
- @Component는 Class Level에서, @Bean은 Method Level에서 적용된다.
- @Bean의 경우 개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶은경우 사용, @Component는 직접 컨트롤이 가능한 Class들의 경우 사용
# @SpringBootApplication
- @SpringBootApplication은 @Configuration, @ComponentScan을 상속
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {