网络游戏架构与微服务架构不难比较

      
用户下载网游客户端,登录网游,首先会实施登录服务,登录服务重庆大学就是给你分配三个网关,因为网关后边连接的才是真的的游戏服务器。登录后,进入游戏,发出指令,比如您活动到某些地方,那几个命令会头阵送到网关,然后再由网关识别发送到“移动系统”服务,移动系总括算后再经过网关发送给玩家客户端,玩家客户端执行3个动画让您活动到某些地点。      

言语大餐

 

  回归正题,本文是多样语言总是mysql数据库的代码展现,在LZ尝试的经过中,无论是语言环境搭建、mysql依赖库的导入还是代码的品格,各类语言都各有千秋。接下来,大家就让这一个语言一一登场吧。

 

      
至于说分布式事务的题材,在网游开发中比较简单就可以解决(就算化解不了还有客服),因为兼具东西相关数据都在三个数据库,尽管不在二个数据库也是经过音信去一起。比如您砍了鬼怪一刀,你的阶段数据上涨、体力下落都在一个劳动里计算的,假如怪物被砍了一刀的盘算不在这么些服务里,那么会发一个音信给那么些服务,那多少个服务总计怪物被砍了一刀,如若总括战败,再回发1个新闻给前多少个劳务来一同那方面,若是被砍死了掉物品了,就发二个音信给物品劳务去总结,物品服务再回发音讯与主任会总计协同。那实则就是由此信息机制举办业务协同最原始的版本。

python(最高端大气上档次的语言)

  

  对于python来说,LZ在此之前就曾经写过一篇小博文,无论从哪些角度来讲,那个语言都给LZ一种伟大上的觉得。无论是它霸气的脚本语言特有的语法,依然专门的编码格式供给,都让LZ心生向往。

  以下是python高端大气上档次的代码。

# coding=utf-8
import MySQLdb
import sys

host = 'localhost'
user = 'root'
password  = '123456'   
db   = 'test'


if __name__ == '__main__':
    connection = MySQLdb.connect(host,user,password,db);
    try:
        connection.ping()
    except:
        print ('failed to connect MySQL.')
    sql = 'select * from test'
    cursor = connection.cursor()
    cursor.execute(sql)
    for row in cursor:
        print ("|" + str(row[0]) + "|" + row[1] + "|")
    cursor.close()
    connection.close()
    sys.exit()

  以下是程序输出结果,代表先后的科学。

图片 1

  尽管python在装置mysql库的时候曾一度让LZ一筹莫展,但那依然无法阻挡LZ对python的竞逐之心。见到python的API能够说让LZ惊了个呆,实在是不难格外,别具匠心。好了,多的就不说了,分数表示LZ的心。

  入门难度:★★★

  代码优雅度:★★★★★

       客户端.exe

C(最令人崇拜的言语)

  

  那么些语言在学院里LZ就学过好几皮毛,可是当下很讨厌那一个无用的实物,LZ想要写的是巨型网游,而不是出口1个矩阵,也许打字与印刷个“心形”去泡妞。但是说来也怪,到得未来,LZ已经做了两年的程序猿,近八个月的PM,却忽然之间对C那么些老家伙情有独钟,敬意油可是生,实在是怪哉怪哉。

  废话不多说,上边是LZ写的代码。

《c_mysql.h》
#ifndef C_MYSQL_H_
#define C_MYSQL_H_

#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#include <windows.h>
#include <mysql.h>

void execute_sql(char* sql);

#endif

《c_mysql.c》
#include "c_mysql.h"

#define HOST "localhost"
#define USERNAME "root"
#define PASSWORD "123456"
#define DATABASE "test"

int main()
{
    char *sql = "select * from test";
    execute_sql(sql);
    return 0;
}

void execute_sql(char* sql)
{
    MYSQL connection;
    MYSQL_RES *result_pointer;
    MYSQL_ROW result_row;
    int result, row, column, i, j;
    mysql_init(&connection);
    if (NULL == mysql_real_connect(&connection, HOST, USERNAME, PASSWORD, DATABASE, 0, NULL, CLIENT_FOUND_ROWS))
    {
        printf("Error:connection failed!\n");
        return;
    }
    mysql_query(&connection, "set names gbk");
    result = mysql_query(&connection, sql);
    if (result)
    {
        printf("Error:query failed!\n");
        mysql_close(&connection);
        return;
    }
    result_pointer = mysql_store_result(&connection);
    if (result_pointer)
    {
        row = mysql_num_rows(result_pointer);
        for (i = 1; i < row + 1; i++)
        {
            result_row = mysql_fetch_row(result_pointer);
            printf("|%s|%s|\n", result_row[0] ,result_row[1]);
        }
    }
    mysql_close(&connection);
    system("pause");
}

  以下是程序的输出,代表代码是可科学生运动转的。

图片 2

  大概是因为Java不能操纵指针,所以在写C语言的时候,使用&、*、->这么些标记感觉越发爽,不精晓真正的Cer是或不是有如此的痛感啊。上面是LZ对C语言的打分。

  入门难度:★★

  代码优雅度:★★★

  

       和微服务相比总结一下:

Java(最具噱头的言语)

  

  Java给新人的影象应该是入门不难、代码优雅、活跃度高、跨平台、开源大家庭等等,实在是当之无愧的超新星语言,而且是偶像派的。可是可惜的是,偶像派影星很简单被干掉。Java语言是LZ赖以生活的语言,由此LZ不期望做个偶像派,只好努力,争取压实力派的Javaer。

  说起这一次Java连接mysql的编写,实在没什么好说的,毕竟本身正是做这么些的,所以这一块可怜百发百中,算是最无感的2个。上面是LZ写的代码。

package cn.zxl.jmysql;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class JMysql {

    private static final String DRIVER = "com.mysql.jdbc.Driver";
    private static final String URL = "jdbc:mysql://localhost/test";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "123456";
    private static final String SQL = "select * from test";

    public static void main( String[] args ) {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            Class.forName(DRIVER);
            connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
            statement = connection.createStatement();
            resultSet = statement.executeQuery(SQL);
            while (resultSet.next()) {
                System.out.println("|" + resultSet.getString("id") + "|" + resultSet.getString("name") + "|");
            }
        } catch (Exception e) {
            System.out.println("query failed!");
        } finally {
            try {
                resultSet.close();
                statement.close();
                connection.close();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }

}

  以下是出口结果,表示程序是正确的。

图片 3

  总的来说,Java的mysql连接编写是最无感的一个,因为那是LZ相比熟稔的。就Java自身而言,LZ对它的打分如下。这里要越发表明的是,由于别的几种语言LZ都只是略知皮毛,由此本次只从最直观的几个感受去评分。

  入门难度:★★★

  代码优雅度:★★★★

  

 

php(最低调奢华的言语)

 

  PHP尽管近来也极流行,不过总以为它有点低调,但又不失内涵。作为网站制作最符合的语言之一,它连接默默的在表述团结的力量。

  以下是PHP连接mysql低调的代码。

<?php
    $mysql_server_name="localhost";
    $mysql_username="root";
    $mysql_password="123456";
    $mysql_database="test";

    $connection = mysql_connect($mysql_server_name, $mysql_username,$mysql_password);
    if(!$connection) {
        echo "connection failed!";
        return;
    }
    mysql_set_charset("gbk",$connection);
    mysql_select_db($mysql_database, $connection);
    $sql="select * from test";
    $result=mysql_query($sql, $connection);
    while($row = mysql_fetch_array($result)) {
        echo "|".$row["id"]."|".$row["name"]."|\n";
    }
    mysql_close($connection);
?>

  以下是程序运维结果,代表先后是不错的。

图片 4

  即使条分缕析观望会发现,PHP的API与C语言格外相似,那是因为PHP是利用DLL来扩展的mysql操作造成的。其它,PHP与前方四个例外的是,它不是编写翻译型语言,是一种服务端的脚本语言,由此LZ选取选拔命令来实施它。以下是LZ对它的评分。

  入门难度:★★★

  代码优雅度:★★★★

 

      
就算子服务间要通讯也是由此网关转载,比如职分系统之中要购买物品,那么职责系统一发布3个下令音讯给网关,网关再转载给物品系统等等。图中的“游戏A服务器集群”,个中“游戏A”代表你所属的游戏服务器,各类游戏服务器能承载的食指是有限的(当时的技能1个劳务器组最多同时在线也就几千人),人数满了,你就要登录到其余的服务器。“集群”表示服务配置的集群。每二个明面上的玩耍服务器,对应2个N台服务器构成的嬉戏服务集群,但只对应二个用户数据库,数据库没有动用集群技术,因为你就算采纳了数据库集群技术,在实时性方面也跟不上。

C#(最具潜力的语言)

  

  C#前不久固然也算能够,但却犹如一贯不怎么力不从心的感觉到,固然LZ非C#成员,但也认识不少C#程序猿。不过LZ个人觉得,高级形态是言语的方向,由此像C#、Java、Object-c那种被高度封装的言语总会发光发热,毕竟再后退几十年前去,使用汇编甚至二进制去写代码的生活一定是不会再过来了。

  以下是C#连日来mysql数据库的代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data.MySqlClient;

namespace CSMysql
{
    class Program
    {
        static void Main(string[] args)
        {
            MySqlConnection connection = new MySqlConnection("Database='test';Data Source='localhost';User Id='root';Password='123456';charset='utf8';pooling=true");
            MySqlCommand command = new MySqlCommand();
            command.Connection = connection;
            command.CommandText = "select * from test";
            try
            {
                command.Connection.Open();
                MySqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Console.WriteLine("|" + reader.GetInt32("id") + "|" + reader.GetString("name") + "|");
                }
                Console.ReadLine();
            }
            catch (Exception)
            {
                Console.WriteLine("query failed!");
            }
            finally
            {
                command.Connection.Close();
            }
        }
    }
}

  以下是程序运转结果,代表着程序是足以正确运行的。

图片 5

  C#的API有个别尤其,而且看样子有command就难免令人联想到command情势,不知那API里面包车型大巴贯彻是还是不是是command设计方式。总的来说,C#和Java的mysql操作API依旧距离比较大的,那让LZ有点意想不到。以下是LZ对它的评分。

  入门难度:★★★

  代码优雅度:★★★★

 

      
说到那边,掌握微服务的人只怕看出来了,上边包车型客车网关就好比nginx反向代理服务器,每1个游乐服务就好比微服务中的服务,假若你的微服务通讯协议使用的是TCP那后面服务部分基本就相同了。互连网游戏中数据访问尚未分支直接放到业务处理模块,在玩耍中每3个游戏执行逻辑不管是加载脚本、配置数据依然账户数额都以在同三个逻辑中拍卖的,不会去划分出怎么着数据库访问层、脚本访问层,这样处理有一个非常大的裨益,那就是能够拍卖复杂的逻辑,而又毫无丧失效能。

C++(最神秘莫测的语言)

  

  C++作为难度最高的语言,称之为神秘莫测一点都但是分,能驾轻就熟使用C++的,实在是少之又少。对C++有此印象,首假使因为立时LZ看Java虚拟机源码的凄凉经历,那满显示屏的宏定义,实在令LZ为温馨的智力捉急,同时也被编辑Java虚拟机的大神们深深折服。

  以下是参天深的语言总是mysql的代码,请过目。

《c++_mysql.h》
#ifndef C___MYSQL_H_
#define C___MYSQL_H_

#include <iostream>
#include <mysql_connection.h>   
#include <mysql_driver.h>   
#include <statement.h>
using namespace sql;   
using namespace std;

void execute_sql(const SQLString sql);

#endif

《c++_mysql.cpp》
#include "c++_mysql.h"

#define HOST "localhost"
#define USERNAME "root"
#define PASSWORD "123456"
#define DATABASE "test"

int main()
{
    const SQLString sql = "select * from test";
    execute_sql(sql);
    return 0;
}

void execute_sql(const SQLString sql)
{
    mysql::MySQL_Driver *driver;   
    Connection *connection;   
    Statement *statement;   
    ResultSet *result_set;   
    driver = mysql::get_mysql_driver_instance();   
    connection = driver->connect("tcp://localhost:3306", "root", "123456");   
    statement = connection->createStatement();   
    statement->execute("use test");  
    statement->execute("set names gbk");
    result_set = statement->executeQuery(sql);   
    while(result_set->next())   
    {   
        cout << "|" << result_set->getInt("id") << "|" << result_set->getString("name") << "|" << endl;   
    }   
    delete statement;   
    delete connection;  
    system("pause");
}

  以下是出口结果,代表先后能够正确运营。

图片 6

  C++那个mysql连接的章程,其API与Java的相似度极高,粗略估摸大概有九成左右。由此C++的程序除了特别捕捉和内部存款和储蓄器清理与Java某个差距之外,此外的代码拾贰分相似,但LZ始终认为采纳“.”没有应用“->”显得高端,0.0。以下是LZ的评分。

  入门难度:★★★★

  代码优雅度:★★★

 

       游戏(接口访问层)相当于:孢子框架(接口访问层)

转自:http://www.cnblogs.com/skyblog/p/4922787.html

       网关.exe

      
别的微服务痴呆行的分布式事务消除措施也是透过音讯来落实,比如支付,调用方调用支出接口失利,发五个战败音讯给新闻队列,支付接口服务监听新闻队列并处理支付退步。

      
在网游中,因为服务间通讯的是二进制音信,在编制程序时解析音讯和组建音信相当麻烦,由此须要统一筹划贰个统一的类库,这几个类库把二进制新闻传递直接成为面向对象调用。比如您调用了三个措施,其实正是向网关发送了叁个二进制音信。那用在微服务那里也是均等的,让接口的收发消息成为面向对象调用,能够进步编制程序开发的效能,又能减低通讯所发出的bug,孢子框架中的接口访问层也完了接近成效。

       游戏(Gate网关)相当于:微服务(nginx或API Gateway)

       聊天系统.exe

从编制程序上来讲,包罗以下应用:

  先来差不离介绍一下这么些网游架构,有些东西记不清了,最近的网游大牛看到可别丢砖头。

小编十年前做过网络游戏,当第一次探望微服务架构就意识它和互联网游戏架构很像,如下图:

       ….

  图片 7

       移动系统.exe

       游戏(个体劳动)也就是:微服务(个体劳动)

补给:少了风貌服务,场景服务管理进入某地图的有着能源,比如一个人要运动,总结完个人移动后,还要向地图内(可视范围内)全体人发送移动新闻。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注