[TIL - 0901] HTTP/2 간단하게 알아보기, 도커 문서 읽기
간단하게 HTTP/2 알아보기
HTTP의 단점과 HTTP/1.1의 해결방법 그리고 단점
- 무거운 헤더 : 헤더를 통해 전달되는 데이터(key-value) 모두 무거운 존재 - 해당 값들을 모두 서버에 보내줘야하고, 서버는 또 필요한 헤더를 설정해서 클라이언트에 보내줘야함
- 3way handshake를 거쳐 형성되는 TCP 커넥션을 한번의 리소스를 응답받은 뒤 끊어버림 : 주고 받아야할 리소스가 많아질수록 커넥션이 많이 필요하게됨 - 그만큼 커넥션을 맺기위한 사전 작업 또한 계속해서 하게됨
- HTTP(TCP 기반) : 직렬적(순서대로), 여러 리소스가 있으면 요청하고 응답받고 순서대로 하나씩 진행
- HTTP/1.1 해결 방법 : 파이프라이닝
- 파이프라이닝 : 커넥션을 유지하면서, 이전 리소스 요청에 대한 응답을 기다리지않고 다음 리소스에 대한 요청을 날림
- 단순히 커넥션 재활용(Keep-Alive : 타임아웃 걸어둠)만 하는 것이 아니라 응답을 신경쓰지않고 요청부터 다 날림
- 단점 : 응답을 받을 때에는 순차적으로 받기때문에 앞서서 요청한 결과가 아직 응답되지않았을 경우 모두 대기상태, 구현이 어렵다함
HTTP/2 : 성능 개선
- TLS 기반 : HTTPS(보안 강조)
- 단순히 요청을 보내고 응답 기다리지않고, 다음 요청을 보내는 구조가 아님(FIFO)
- 스트림, 프레임 : 해당 내용을 좀 잘 파악해봐야겠음
-
HTTP 메세지를 프레임 단위로 나눔 : 헤더 프레임 데이터 프레임
-
- 헤더 압축 : 중복되는 헤더를 인덱스로 바꿔치기 하는 것으로 파악됨 - 조금 더 파악해보기
- 서버 푸시 : 필요한 리소스에 대해서 클라이언트가 요청을 보내기 전에 서버가 알아서 내려줌 - JS, CSS
- latency를 줄일 수 있음 : 요청에 대한 응답 속도(완료)
- 그렇다면 html에 연관된 리소스를 어떻게 알고있나? 관련 리소스 정보를 어딘가에 기록해두나? html와 연결된 리소스
- springboot http2 setting - embedded tomcat 설정
- tomcat8.5 지원 : spring boot 2.x 의 내장 톰캣 버젼
- 클라이언트, 서버 모두 지원해야함
도커 문서 읽어보기
docker-compose
- 도커 컨테이너가 프로덕션 환경에서 어떻게 동작해야할지 정함 : 서비스(프로덕션 환경에서의 컨테이너를 지칭)에 필요한 컨테이너 인스턴스 개수, 자원 할당(CPU, 메모리), 포트 설정
- 설정된 포트와 짧게 짧게 붙음 : 하나의 포트로 여러 인스턴스가 붙어서 처리(로드밸런싱)
- 서비스는 하나인데, 컨테이너 인스턴스(task)가 여러개
- docker-compose.yml
// 매번 다른 컨테이너 인스턴스
Hello World!
Hostname: c0ec37e6ac0b
Hello World!
Hostname: dc347dfebb06
Hello World!
Hostname: e7f59431ddd2
Hello World!
Hostname: 84e376eb2308
// 처음과 같은 인스턴스
Hello World!
Hostname: c0ec37e6ac0b
> docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
j3vjmsafet8e getstartedlab_web replicated 5/5 jinbro/get-started:part2 *:80->8090/tcp
docker swarm : 실제로 운영해보지않으면 확 와닿지 않음
- 도커를 실행하고 있는(컨테이너를 띄운) 머신을 클러스터링한 것을 swarm이라고 함 : 머신의 경우 리얼일 수도 가상일 수도 있음
- 이전까지 single host 모드로 사용한 것
docker-machine
: 가상 머신 생성(도커가 설치된), 관리할 수 있음
- swarm manager : 클러스터링 매니져, swarm에 포함된 node에 도커 관련 명령어를 내리기위해서 swarm-manager를 통해야함
- node : 클러스터링 된 머신 - manager(+ worker)와 worker로 나뉨
- 클러스터링 후 컨테이너 할당하는 모드(전략)가 따로 있음 : global(머신당 적어도 1개의 컨테이너 인스턴스를 가짐), emptiest node()
docker swarm init
: swarm 생성 - 해당 node가 swarm manager가 됨docker swarm join
: 생성되어있는 swarm에 join함