Yivgame
YivGame은 Go-Kit을 기반으로 GO 언어로 작성된 Microservice Architection Game Server 솔루션입니다. 게임 서버 (Long Connection) 외에도 프론트 엔드 및 백엔드 작업을위한 API 인터페이스 서버도 포함됩니다. 서버 자체 외에도 Docker 배포에 대한 자세한 구성도 관련됩니다.
특성
- 마이크로 서비스 아키텍처
- 클라이언트와 게임 서버는 GRPC 양방향 스트리밍을 통한 변속성을 실현합니다.
- 클라이언트-서버 측 웹 소켓 통신
- HTTP 엔드 포인트 및 WebSocket 엔드 포인트 가중치 및 로그를 구현하십시오
디자인 연습
마이크로 서비스 아키텍처
- 마이크로 서비스 아키텍처를 통해 전통적인 게임 서버는 다른 마이크로 서비스로 나뉩니다.
- 다른 마이크로 서버
도메인 중심 모델
- 다양한 수준의 소프트웨어의 분리를 달성하기 위해 각 서비스는 도메인 구동 모델에 따라 설계됩니다.
- 마이크로 서비스의 소프트웨어 구조를 내부에서 외부로 게임 비즈니스 계층으로 나눕니다.
- 외부에서 다양한 레벨 사이의 내부로 일방 통행 의존성을 엄격하게 준수합니다.
비즈니스 계층은 주로 게임 또는 서버의 핵심 논리를 구현하고 외부 구현에 신경 쓰지 않으며 파일 시스템, 데이터베이스 등에 따라 다릅니다. 비즈니스 계층은 인터페이스를 사용하여 인터페이스를 정의하고 종속성 계층으로 인터페이스 메소드를 구현합니다. 그것들은 의존성 주입을 통한 메인입니다. 따라서 일부 기본 표준 라이브러리를 인용하는 것을 제외하고 비즈니스 계층은 타사 패키지를 거의 의미하지 않습니다.
Kafka의 이벤트 중심 모델
- 전체 마이크로 서비스 시스템 사이의 핵심 통신 방법은 Kafka를 스트리밍 플랫폼으로 사용하는 GRPC 동기 호출 및 비동기 이벤트 통신입니다.
- 마이크로 서비스에서 따르는 모든 활동은 Kafka가 다른 관심사를 가진 이벤트를 구독 할 것입니다
이벤트 중심 모델 및 데이터 분석
- 과거에는 게임 데이터 분석을 수행 할 때 공동 테이블을 통해 검색되었습니다.
- 이벤트 중심 모델을 사용한 후, 우리가주의를 기울이는 모든 플레이어 동작은 이벤트로 기록 될 수 있으며, 다양한 이벤트에 대한 다양한 속성을 설계하며 매우 확장 가능한 데이터 분석을 달성 할 수 있습니다.


프로젝트 디렉토리 구조
- Go-Kit에서 구현 한 MicroService 아키텍처는 디렉토리 구조에서 Go-Kit의 공식적인 예와 일관성을 유지하려고 노력하십시오.
- 도메인 구동 모델은 계층화되므로 대부분의 GO 프로젝트의 플랫 디렉토리 구조를 선호하기 때문에 내부 패키지 디렉토리를 외부 레이어에 포함시키는 것이 당연합니다 디렉토리 구조 도메인 레벨에서 다른 레벨의 패키지 디렉토리는 동일한 레벨의 디렉토리 아래에 배치됩니다.
글로벌 변수가 없습니다
- 코드 로직에서 소프트웨어를 더 명확하게하기 위해 글로벌 변수를 엄격히 피하십시오.
데이터 캐시, 데이터 저장 및 Kafka
- 따라서 플레이어 데이터는 서비스 메모리에 직접 저장되어 직접 데이터 처리를 용이하게합니다.
- 플레이어 데이터의 수정은 WAL을 통해 Kafka에 기록되며 스토리지 서비스는 데이터베이스에 비동기로 기록됩니다.
- WAL 메소드가 사용되므로 플레이어 데이터의 Redo 및 Undo는 쉽게 구현할 수 있습니다.
Newsql Cockroachdb
- Data Persistence는 분산 트랜잭션을 지원하는 관계형 데이터베이스 인 CockroAChDB를 사용합니다.
- 바퀴벌레 사용을 사용하면 수평 스케일링, 결함 허용, 자동 복구 및로드 밸런싱을 쉽게 달성 할 수 있습니다.
V1.0에서 V1.0.6에서 V1.0에서 CockroachDB를 사용하기 시작했으며 CockroachDB는 V1.1이 출시 된 이래로 충돌 문제가 다시 나타나지 않았지만 성능은 다시 나타났습니다. 크고 크지 않았습니다. 개선. YivGame의 거의 모든 데이터가 메모리에 있으며 저장할 때 DB 만 작성해야하므로 전체 YivGame 시스템의 경우 DB 성능 병목 현상이 없습니다.
모델
커뮤니케이션 다이어그램

- 의사 소통 방법
- HTTP : HTTP는 주로 배경 운영 시스템에서 통신에 사용되는 짧은 연결입니다.
- WebSocket : 클라이언트는 Cocos Creator를 사용하여 개발되며 WebSocket은 주로 게임에서 실시간 및 강력한 상호 작용과 어려운 커뮤니케이션에 사용됩니다.
- GRPC : HTTP/2 프로토콜 GRPC를 기반으로, 소켓 연결에서 멀티 스트림 통신을 실현할 수 있습니다.
- 데이터 형식
- JSON : JSON 형식의 자체 상영으로 인해 주로 게임의 짧은 연결과 백엔드 작동 시스템 인터페이스 간의 데이터 교환에 사용됩니다.
- Protobuf : 주로 클라이언트와 서버 WebSocket과 Micro-Service 간의 데이터 교환에 사용됩니다.
서비스 구성 요소 다이어그램

- 에이전트 : 주로 클라이언트 액세스에 사용됩니다. 데이터 패킷을 직접 전달하고 백엔드 마이크로 서비스로 전달합니다. 수평으로 쉽게 확장 할 수 있습니다
- UserCenter : 모든 플레이어 데이터는 사용자 센터에서 관리되며 사용자 센터는 게임 데이터를 읽고, 쓰기, 삭제, 수정 및 확인해야합니다. .
- 게임 서버 : 주로 게임 비즈니스 로직 처리를 담당합니다
신원 인증 및 인증

- JWT를 사용하여 서비스간에 인증하십시오
- API 게이트웨이를 통한 단일 로그인
- 전 세계적으로 인증 및 모든 마이크로 서비스에서 승인을하십시오
시설 의존성
- Docker : 모든 의존 시설 및 게임 인스턴스는 Docker Community 버전을 통해 배포됩니다.
- RockCoach : 지속적인 데이터베이스로서
- Kafka : 메시지 대기열 및 스트림 플랫폼으로
- ETCD : 서비스 발견 용
- Gogs : 버전 관리에 Gogs를 사용하십시오
- Bind9 : 도메인 이름 서버, 도메인 이름 해상도 스위칭을 통한 개발 및 테스트 네트워크의 원활한 전환
Go-Kit 생성기
- YIV/GK : Go-Kit Code Generator는 Go-Kit이 현재 발견 한 유일한 화가는 매우 우아한 서비스 출력 방법을 설계합니다. 서비스 인터페이스를 작성하려면 모든 사람이 전체 엔드 포인트 세트를 작성하고 코드 패턴을 작성해야합니다. 당신은 반복적 인 일을하고 있다고 생각하고 여러 번 검색 한 후에는 kujtimiihoxha/gk의 공식적인 예와 일치하는 발전기를 찾지 못했습니다 아직 완벽하지는 않았으며, 나에게 완전히 적용 할 수 없었기 때문에 직접 포크를 변경하여 자동으로 코드를 생성하여 서비스 인터페이스를 작성할 때 중복 코드를 60% 줄일 수 있습니다 오류 확률.
시스템 환경
참조하십시오
- Gonet/2 : Yivgame은 투명 전송을 위해 스트림 사용, 카프카 소개 등과 같은 Gonet의 많은 디자인을 흡수했습니다.
- Go-Kit : Yivgame은 Go-Kit을 기반으로 개발되었습니다
- GODDD : GO에 작성된 도메인 모델을 기반으로 한 샘플 앱
- GO의 실제 지속성 : 데이터베이스 액세스 구성
- 깨끗한 건축
- 응용 프로그램을 위해 깨끗한 아키텍처를 적용합니다
- 계층 구조를 이해하는 게시물
디자인에 대한 몇 가지 생각
- 시스템의 복잡성은 간단한 단순성 뒤에 사라지지 않습니다. Go-Kit의 장점은 단순하게 보이지 않으며 코드의 디자인 목표를 직접 반영하면 소프트웨어 설계 기능을 향상시킵니다.
- Go-Kit은 사용하기 쉬운, 짧고, 평평하고 빠른 목표를 사용하는 데 적합하지 않습니다. 논리적 디커플링을 돕습니다.
- Go-Kit은 Service Interface로 시작하여 비즈니스 영역에 중점을 두는 것으로 시작하며 HTTP 또는 GRPC는 외부 세계에 게시하는 방법 일뿐입니다. 결국에는 배치됩니다.
- 자유를 추구하지 말고 소프트웨어 적응력을 추구한다고해서 코드가 표준화되어야합니다 결과를 정의하기 때문에 자유롭지 않습니다. 결과를 사용하여 작성된 서비스가 모두 비슷해 보입니다. 코드가 그림처럼 쓰여지고 편집하고 실행할 수 있습니다.
- 도입 된 마이크로 서비스 호출의 코덱과 통신은 약 2 밀리 초이며 국내 상호 핑 지연은 일반적으로 40ms입니다.
- 그것은 프레임 워크이든, 우수하고 편리하고 적합한 도구를 선택하는 것만으로 도구를 잘 사용합니다 도구가 최고라면, 그들이 잘 사용되지 않으면 나쁘다.