yivgame
YivGame adalah solusi server game Microservice Architecture yang ditulis dalam bahasa GO berdasarkan go-kit. Selain server game (koneksi panjang), ini juga termasuk server antarmuka API untuk operasi front-end dan back-end. Selain server itu sendiri, konfigurasi rinci penyebaran Docker juga akan terlibat.
ciri
- Arsitektur Microservice
- Klien dan server game mewujudkan transmisibilitas melalui streaming dua arah GRPC
- Komunikasi Websocket sisi klien-server
- Menerapkan titik akhir HTTP dan bobot ujung dan log WebSocket
Praktik desain
Arsitektur Microservice
- Melalui arsitektur Microservice, server game tradisional dibagi menjadi berbagai layanan microser
- Server mikro yang berbeda dapat berkomunikasi secara serempak melalui GRPC dan secara asinkron melalui kafka
Model yang digerakkan domain
- Untuk mencapai decoupling berbagai tingkat perangkat lunak, setiap layanan dirancang sesuai dengan model yang digerakkan oleh domain.
- Bagilah struktur perangkat lunak layanan mikro dari dalam ke luar ke lapisan bisnis game, gunakan lapisan case, lapisan antarmuka dan lapisan ketergantungan fasilitas
- Benar-benar mematuhi ketergantungan satu arah dari luar ke dalam di antara berbagai tingkatan
Lapisan bisnis terutama mengimplementasikan logika inti game atau server, tidak peduli dengan implementasi eksternal, dan tergantung pada sistem file, database, dll. Lapisan bisnis menggunakan antarmuka untuk menentukan antarmuka, mengimplementasikan metode antarmuka dengan lapisan dependensi, dan melewati mereka di utama melalui suntikan ketergantungan. Oleh karena itu, kecuali untuk mengutip beberapa perpustakaan standar dasar, lapisan bisnis hampir tidak mengacu pada paket pihak ketiga.
Model yang digerakkan oleh acara dengan kafka
- Metode komunikasi inti antara seluruh sistem layanan mikro adalah panggilan sinkron GRPC dan komunikasi peristiwa asinkron menggunakan Kafka sebagai platform streaming.
- Semua kegiatan yang diikuti dalam layanan mikro akan diterbitkan ke Kafka dalam bentuk peristiwa yang dihasilkan
Model yang digerakkan oleh peristiwa dan analisis data
- Di masa lalu, ketika melakukan analisis data game, mereka dicari melalui tabel bersama.
- Setelah menggunakan model yang digerakkan oleh peristiwa, semua perilaku pemain yang kami perhatikan dapat direkam sebagai acara, merancang atribut yang berbeda untuk berbagai acara, dan mencapai analisis data yang sangat dapat diskalakan


Struktur Direktori Proyek
- Karena arsitektur layanan mikro yang diimplementasikan oleh Go-Kit, cobalah untuk tetap konsisten dengan contoh resmi Go-Kit dalam struktur direktori sebanyak mungkin.
- Karena model yang digerakkan oleh domain dilapisi, wajar untuk memasukkan direktori paket dalam di lapisan luar saat merancang struktur direktori proyek Struktur direktori di tingkat domain, sebaliknya, direktori paket level yang berbeda ditempatkan di bawah direktori level yang sama.
Tidak ada variabel global
- Untuk membuat perangkat lunak lebih jelas dalam logika kode, benar -benar hindari variabel global
Cache data, penyimpanan data dan kafka
- Oleh karena itu, data pemain secara langsung disimpan dalam memori layanan, yang memfasilitasi pemrosesan data langsung
- Modifikasi data pemain ditulis ke Kafka melalui Wal, dan kemudian layanan penyimpanan ditulis secara tidak sinkron ke database.
- Karena metode WAL digunakan, ulang dan lepaskan data pemain mudah diimplementasikan
Newsql cockroachdb
- Kegigihan Data Menggunakan CokroachDB, database relasional yang mendukung transaksi terdistribusi
- Menggunakan CokroachDB dapat dengan mudah mencapai penskalaan horizontal, toleransi kesalahan, pemulihan otomatis, dan penyeimbangan beban
Saya mulai menggunakan CokroachDB dari V1.0, dari V1.0 ke V1.0.6, CokroachDB selalu memiliki masalah kecelakaan di bawah situasi dan tekanan tertentu. belum besar. Karena hampir semua data yivgame ada dalam memori, dan hanya DB yang perlu ditulis saat menyimpan, jadi untuk seluruh sistem yivgame, tidak ada hambatan kinerja DB.
Model
Diagram komunikasi

- Metode komunikasi
- HTTP: HTTP adalah koneksi pendek, terutama digunakan untuk komunikasi dalam sistem operasi latar belakang.
- WebSocket: Klien dikembangkan menggunakan Cocos Creator, dan komunikasi lama mendukung WebSocket.
- GRPC: Berdasarkan protokol HTTP/2 GRPC, dapat mewujudkan komunikasi multi-aliran pada koneksi soket.
- Format data
- JSON: Karena interpretasi diri dari format JSON, ini terutama digunakan untuk pertukaran data antara koneksi pendek dan antarmuka sistem operasi backend dalam permainan.
- Protobuf: terutama digunakan untuk pertukaran data antara klien dan server Websocket dan layanan mikro
Diagram Komponen Layanan

- Agen: Ini terutama digunakan untuk akses klien. dan mudah diperluas secara horizontal
- UserCenter: Semua data pemain dikelola di pusat pengguna, dan pusat pengguna bertanggung jawab untuk membaca, menulis, menghapus, memodifikasi dan memeriksa data game. .
- Server game: terutama bertanggung jawab untuk memproses logika bisnis game
Otentikasi dan otentikasi identitas

- Gunakan JWT untuk mengotentikasi antar layanan
- Masuk tunggal melalui API Gateway
- Lakukan otentikasi secara global, dan otorisasi di setiap layanan mikro
Ketergantungan fasilitas
- Docker: Semua fasilitas ketergantungan dan instance permainan digunakan melalui versi komunitas Docker
- Rockcoach: Sebagai database yang persisten
- Kafka: sebagai antrian pesan dan platform stream
- ETCD: Untuk penemuan layanan
- Gog: Gunakan Gogs untuk manajemen versi
- Bind9: Domain Name Server, Switching Networks Pengembangan dan Pengujian yang Minum melalui Resolusi Nama Domain
Generator Go-Kit
- YIV/GK: Go-Kit Code Generator adalah latihan tangan-listrik. Untuk menulis antarmuka layanan, setiap orang harus menulis satu set ujung akhir, set dan transportasi. Anda merasa bahwa Anda melakukan pekerjaan berulang dan sangat rentan terhadap kesalahan. belum sempurna, dan itu tidak sepenuhnya berlaku untuk saya, jadi saya memasukkannya ke bawah dan mengubahnya sendiri dan melewatinya secara otomatis menghasilkan kode, yang dapat mengurangi kode duplikat sebesar 60% saat menulis antarmuka layanan. probabilitas kesalahan.
Lingkungan sistem
merujuk ke
- Gonet/2: Yivgame telah menyerap banyak desain dari Gonet, seperti menggunakan aliran untuk transmisi transparan, memperkenalkan kafka, dll.
- go-kit: yivgame dikembangkan berdasarkan go-kit
- Goddd: Contoh aplikasi berdasarkan model domain yang ditulis dalam go
- Kegigihan Praktis di GO: Mengatur Akses Database
- Arsitektur yang bersih
- Menerapkan arsitektur bersih untuk pergi aplikasi
- Posting untuk memahami struktur hierarkis
Beberapa pemikiran tentang desain
- Kompleksitas sistem hanya akan bergeser dan tidak akan hilang. Keuntungan dari Go-Kit adalah tidak terlihat sederhana, dan secara langsung mencerminkan tujuan desain dalam kode.
- Go-Kit tidak cocok untuk mengejar tujuan yang mudah digunakan, pendek, datar dan cepat. membantu decoupling logis.
- Go-Kit dimulai dengan antarmuka layanan, dimulai dengan fokus pada area bisnis, HTTP atau GRPC hanyalah cara untuk menerbitkannya ke dunia luar, dan pada akhirnya ditempatkan.
- Jangan mengejar kebebasan menulis, tetapi mengejar kebebasan adaptasi perangkat lunak tidak gratis karena mendefinisikan hasilnya adalah bahwa layanan yang ditulis menggunakan semuanya terlihat serupa. Sangat mengagumkan bahwa kode ini ditulis seperti lukisan, dan dapat dikompilasi dan dijalankan.
- Codec dan komunikasi panggilan layanan mikro yang diperkenalkan adalah sekitar 2 milidetik, dan penundaan ping timbal balik domestik biasanya 40ms.
- Apakah itu kerangka kerja atau bahasa, mereka hanya memilih yang sangat baik, berguna, dan cocok di industri ini Jika alatnya adalah yang terbaik, mereka akan buruk jika tidak digunakan dengan baik.