yivgame
YivGame es una solución de servidor de juegos de arquitectura de microservicio escrita en el idioma GO basado en el kit de GO. Además del servidor de juegos (Long Connection), también incluye un servidor de interfaz API para operaciones frontales y de fondo. Además del servidor en sí, la configuración detallada de la implementación de Docker también estará involucrada.
característica
- Arquitectura de microservicio
- El cliente y el servidor de juegos realizan la transmisibilidad a través de la transmisión bidireccional de GRPC
- Comunicación websocket del lado del cliente
- Implementar los puntos finales HTTP y los puntos finales de WebSocket pesos y registros
Práctica de diseño
Arquitectura de microservicio
- A través de la arquitectura de microservicio, los servidores de juegos tradicionales se dividen en diferentes microservicios
- Diferentes servidores micro pueden comunicarse sincrónicamente a través de GRPC y asincrónicamente a través de Kafka
Modelo de dominio
- Para lograr el desacoplamiento de diferentes niveles de software, cada servicio está diseñado de acuerdo con el modelo basado en el dominio.
- Divida la estructura de software de los microservicios desde el interior al exterior en la capa de negocios del juego, la capa de caso de uso, la capa de interfaz y la capa de dependencia de las instalaciones
- Cumplir estrictamente por una dependencia unidireccional desde el exterior hasta el interior entre los diversos niveles
La capa comercial implementa principalmente la lógica central del juego o servidor, no le importa las implementaciones externas y depende de los sistemas de archivos, bases de datos, etc. La capa comercial utiliza la interfaz para definir interfaces, implementa métodos de interfaz de la capa de dependencia y pasa ellos en la inyección de dependencia. Por lo tanto, a excepción de citar algunas bibliotecas estándar básicas, la capa comercial apenas se refiere a paquetes de terceros.
Modelo basado en eventos con kafka
- El método de comunicación central entre todo el sistema de microservicio es la llamada síncrona GRPC y la comunicación de eventos asíncronos utilizando Kafka como plataforma de transmisión.
- Todas las actividades que se siguen en los microservicios se publicarán a Kafka en forma de eventos generados.
Modelo y análisis de datos basados en eventos
- En el pasado, al realizar análisis de datos del juego, se registraron a través de tablas conjuntas.
- Después de usar el modelo basado en eventos, todos los comportamientos de los jugadores a los que prestamos atención se pueden registrar como eventos, diseñar diferentes atributos para diferentes eventos y lograr un análisis de datos extremadamente escalable


Estructura del directorio de proyectos
- Dado que la arquitectura de microservicio implementada por GO-kit, trate de mantenerla consistente con el ejemplo oficial de go-kit en la estructura del directorio tanto como sea posible.
- Dado que el modelo de dominio está en capas, es natural incluir el directorio de paquetes internos en la capa externa al diseñar la estructura del directorio del proyecto. La estructura del directorio en el nivel de dominio, en cambio, el directorio de paquetes de diferentes niveles se coloca bajo el directorio del mismo nivel.
No hay variables globales
- Para hacer que el software sea más claro en la lógica del código, evite estrictamente las variables globales
Caché de datos, almacenamiento de datos y kafka
- Por lo tanto, los datos del jugador se almacenan directamente en la memoria de servicio, lo que facilita el procesamiento de datos directos
- La modificación de los datos del jugador se escribe en Kafka a través de Wal, y luego el servicio de almacenamiento se escribe asincrónicamente en la base de datos.
- Dado que se utiliza el método WAL, la rehacer y la deshacer de los datos de los jugadores son fáciles de implementar
Newsql cucroachdb
- La persistencia de datos utiliza cucarachdb, una base de datos relacional que admite transacciones distribuidas
- El uso de cucarachdb puede lograr fácilmente escala horizontal, tolerancia a fallas, recuperación automática y equilibrio de carga
Comencé a usar CockroachdB de V1.0, de V1.0 a V1.0.6, CockroachdB siempre ha tenido un problema de choque en situaciones y presiones específicas. no ha sido grande. Porque casi todos los datos de YivGame están en la memoria, y solo DB debe escribirse al guardar, por lo que para todo el sistema YIVGame, no hay cuello de botella de rendimiento de DB.
Modelo
Diagrama de comunicación

- Método de comunicación
- HTTP: HTTP es una conexión corta, principalmente utilizada para la comunicación en el sistema de operación de fondo.
- WebSocket: el cliente se desarrolla con Cocos Creator, y la comunicación de conexión larga admite WebSocket.
- GRPC: Basado en el protocolo HTTP/2 GRPC, puede realizar una comunicación múltiple en una conexión de socket.
- Formato de datos
- JSON: Debido a la autointerpretación del formato JSON, se utiliza principalmente para el intercambio de datos entre conexiones cortas e interfaces del sistema de operación de backend en el juego.
- ProtoBuf: se utiliza principalmente para el intercambio de datos entre WebSocket de clientes y servidores y micro-servicio
Diagrama de componentes de servicio

- Agente: se usa principalmente para el acceso al cliente. y fácil de expandir horizontalmente
- UserCenter: Todos los datos del jugador se administran en el centro de usuarios, y el centro de usuarios es responsable de leer, escribir, eliminar, modificar y verificar los datos del juego. .
- Servidor de juegos: principalmente responsable del procesamiento de la lógica comercial de los juegos
Autenticación y autenticación de identidad

- Use JWT para autenticar entre servicios
- Inicio de sesión único a través de API Gateway
- Hacer autenticación a nivel mundial y autorización en cada microservicio
Dependencia de las instalaciones
- Docker: Todas las instalaciones de dependencia y las instancias del juego se implementan a través de la versión comunitaria de Docker
- Rockcoach: como una base de datos persistente
- Kafka: como cola de mensajes y plataforma de transmisión
- ETCD: para el descubrimiento de servicios
- Gogs: use GOG para la gestión de versiones
- Bind9: servidor de nombres de dominio, conmutación sin costura de redes de desarrollo y prueba a través de la resolución de nombres de dominio
generador de kits
- YIV/GK: GO-KIT CODE Generator es un taladro eléctrico de mano. Para escribir una interfaz de servicio, cada uno tiene que escribir un conjunto completo de punto final, establecer y transporte. Sientes que estás haciendo un trabajo repetitivo y eres muy propenso a los errores. Aún no era perfecto, y no era completamente aplicable para mí, por lo que lo desembolse y lo cambié yo mismo y lo pasé automáticamente, generar el código, lo que puede reducir el código duplicado en un 60% al escribir interfaces de servicio. probabilidad de errores.
Entorno del sistema
referirse a
- Gonet/2: YivGame ha absorbido muchos diseños de Gonet, como el uso de la transmisión transparente, la introducción de Kafka, etc.
- GO-kit: YivGame se desarrolla en base a go-kit
- Goddd: una aplicación de muestra basada en el modelo de dominio escrito en Go
- Persistencia práctica en Go: organización de acceso a la base de datos
- La arquitectura limpia
- Aplicación de la arquitectura limpia a las aplicaciones GO
- Una publicación para comprender la estructura jerárquica
Algunos pensamientos sobre el diseño
- La complejidad del sistema solo cambiará y no desaparecerá. . La ventaja de GO-kit es que no parece tan simple y refleja directamente los objetivos de diseño en el código.
- El kit no es adecuado para buscar objetivos fáciles de usar, cortos, planos y rápidos. Ayuda al desacoplamiento lógico.
- GO-Kit comienza con la interfaz de servicio, comienza con el enfoque en áreas de negocio, HTTP o GRPC es solo una forma de publicarla en el mundo exterior, y se coloca al final.
- No busque la libertad de escribir, pero pertenece a la libertad de adaptación del software. No es gratuito porque define el resultado es que los servicios escritos que usan todos se ven similares. Es tan impresionante que el código está escrito como una pintura, y se puede compilar y ejecutar.
- El códec y la comunicación de las llamadas de microservicio introducidas son de aproximadamente 2 milisegundos, y el retraso de ping mutuo doméstico suele ser de 40 ms.
- Ya sea un marco o un idioma, son solo herramientas. Si las herramientas son las mejores, serán malas si no se usan bien.