로그 분석 및 패킷 캡처를 통한 비회원 로그인 프로세스 이해
소개
이 문서는 클라우드 네이티브 환경에서 DevOps(GitOps), Kubernetes, BPF, SRE 등을 적용하여 Golang으로 생산급 마작 게임 서버를 만드는 과정을 다룹니다. 특히, 비회원(Guest) 로그인 프로세스를 통해 서버와 클라이언트 간의 상호 작용을 분석합니다.
Nano Game Server 개요
Nano Game Server는 Golang 기반의 빠르고 확장 가능한 게임 서버 프레임워크입니다. 주요 구성 요소는 다음과 같습니다:
- Component: 독립적인 기능 모듈.
- Handler: Component 내부에서 정의된 특정 요청 처리 메서드.
- Route: 서비스 또는 메시지 전달 경로를 식별하는 URI.
- Session: 클라이언트 연결 시 생성되는 컨텍스트 정보 저장소.
- Group: Session들을 그룹화하여 메시지를 방송할 수 있는 컨테이너.
Nano 컴포넌트 생명주기
아래는 Nano 컴포넌트의 기본 생명주기 코드입니다:
type SampleComponent struct{}
func (c *SampleComponent) Init() {
// 초기화
}
func (c *SampleComponent) AfterInit() {
// 초기화 후 실행
}
func (c *SampleComponent) BeforeShutdown() {
// 종료 전 실행
}
func (c *SampleComponent) Shutdown() {
// 종료 시 실행
}
Debug 모드 활성화
`internal/game/game.go` 파일에서 Debug 모드를 활성화했습니다:
nano.Listen(addr,
nano.WithPipeline(pipeline),
nano.WithHeartbeatInterval(time.Duration(heartbeat)*time.Second),
nano.WithLogger(log.WithField("component", "nano")),
nano.WithSerializer(json.NewSerializer()),
nano.WithComponents(components),
nano.WithDebugMode(),
)
게임 서버 시작 및 로그 확인
서버가 시작되면 다음과 같은 로그를 확인할 수 있습니다:
The current server running in singleton mode: 현재 서버는 단일 인스턴스 모드로 실행 중입니다.
- 등록된 핸들러 목록:
- Manager: CheckOrder, Login
- DeskManager: DissolveStatus, QiPaiFinished 등
- ClubManager: ApplyClub
Charles를 통한 API 패킷 캡처 분석
1.
/v1/user/login/query: 비회원 로그인이 활성화되었는지 확인
POST http://192.168.31.125:12307/v1/user/login/query HTTP/1.1
content-type: application/json
{
"channelId": "konglai",
"appId": "konglai"
}
2.
/v1/user/login/guest: 비회원 로그인 수행
POST http://192.168.31.125:12307/v1/user/login/guest HTTP/1.1
content-type: application/json
{
"channelId": "konglai",
"appId": "konglai",
"imei": "c0a4ce912c48a3d0b17b59e6b97f1dca"
}
서버 로그 출력 분석
서버 로그에서는 다음 메시지들이 출력됩니다:
Message={ Request Manager.Login }: 비회원 로그인 요청 처리.
Message={ Request DeskManger.UnCompleteDesk }: 미완료된 테이블 상태 확인.
비즈니스 프로세스 요약
1. 사용자가 로그인 버튼 클릭.
2. 서버에 비회원 로그인 가능 여부 확인.
3. 가능하다면 비회원 로그인 수행.
4. 게임 서버 주소 획득.
5. 게임 서버와 소켓 연결.
6. 연결 성공 시 게임 로비 진입.