(文章搬运工)Asp.net Core 使用MyCat分布式数据库,实现读写分离

 

简介

 

  

  MyCat2.0版本很快就发布了,关于MyCat的动态和一些问题,大家可以加一下MyCat的官方QQ群:106088787。我们今天主要介绍一下,在我们的Asp.net Core中如何使用Mycat,这源于一个大神(Amamiya Yuuko)的分享,但是,这中间还是有少许的 坑 :

  首先,因为大神是比较忙的,而且主要分享关键技术,所以有些地方很简略,而往往这些简略的地方容易造成新手的困惑。

 

  其次,在尝试了N次失败后,我发现大神的代理程序是有问题的,具体是什么问题,我们待会详细解释,经过修改之后的代理程序,可以正常运行。

  因此,我觉得很有必要写这篇文章,一步一步搭建、测试、运行。

 

 

什么是MyCat?

 

   https://i-blog.csdnimg.cn/blog_migrate/c401f1620ef8b54b77564e1d1b599c38.png

  

  从定义和分类来看,它是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。

 

  MyCat发展到目前的版本,已经不是一个单纯的MySQL代理了,它的后端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种新型NoSQL方式的存储,未来还会支持更多类型的存储。而在最终用户看来,无论是那种存储方式,在MyCat里,都是一个传统的数据库表,支持标准的SQL语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度。

 

  此外,开发者可以根据不同的需求将表分配不同的数据节点,比如Table A存放在关系型数据库中(如MySQL),而Table B可能更适合NoSQL(如MongoDB),在MyCAT中开发者只需要简单配置,即可让MyCAT完成这一系列操作的路由。

 

   关于更多MyCat,大家可以参照官网:http://www.mycat.org.cn/

 

 

MyCat的优势

  

 

  • 基于阿里巴巴的开源项目Cobar,具备良好的稳定性、可靠性、优良的结构和优良的性能,拥有许多的项目案例。站在巨人的肩膀上,MyCAT将走的更远。
  •  
  • 广泛借鉴最好的开源项目和创新的理念,让这些融入MyCAT的基因,使MyCAT成为领先其他电商等类似的开源项目,甚至超过了一些企业级应用。
  •  
  • MyCAT技术团队的参与者都经历过至少五多年的项目经验,团队中包括一些高级软件工程师、架构师、DBA。由精英们组成的MyCAT技术团队将确保产品质量。
  •  
  • MyCAT是完全独立的社区,不依附于任何企业,遵循着完全开放、免费、开源的原则。它不像一些开源项目,重要的功能封闭在其商业产品,并使开源项目像一个装饰。
  •  
  • 支持超过60种的数据库作为数据节点,如MySQL、SQL Server、Oracle、MongoDB、DB2等

 

 

 

MyCat与ADO.NET

 

  由于MyCAT与MySQL协议有些许差异,开发者可能不能够直接使用Oracle官方提供的Mysql.Data(ADO层)来与MyCAT直接连接,因此有大神专门为.NET开发者设计了针对MyCAT优化过的ADO层驱动,即 Pomelo.Data.MyCat,开发者通过使用MyCatConnection、MyCatCommand类可以实现对MyCAT的连接与查询。

 

 

MyCat 与 Entity Framework Core

 

  由于MyCAT的协议与MySQL有所差异,导致了无论是Java平台下的Hibernate还是.NET下的Entity Framework都无法使用MySQL的provider直接来操作MyCAT。这点在EF中的Migrations以及Code First上表现的尤为明显,此外开发者不仅需要手动建库,还需要配置分片规则等,操作繁琐。

因此我们使用第三方专门为MyCAT量身打造的Entity Framework Core Provider,即 Pomelo.EntityFrameworkCore.MyCat

 

 安装Java8

 

  MyCat 需要 java cdk的支持,安装方法网上很多很详细,这里我们就不罗列了。

 

下载MyCat Server

 

  废话不多说,我们来开始我们的MyCat之旅:

  我们演示使用的服务器是:CentOS7 当然,Windows 也是支持的,我们以 CentOS为例。

 

  首先,我们在服务器安装 MySQL ,这里我安装的是 MySQL 5.7,关于 MySQL的安装,我们这里就不演示了,没有装过的朋友,网上有大片的详细安装步骤。值得注意的是,安装完MySQL之后,我们需要编辑 my.cnf 文件,将MySQL的默认编码设置为 UTF8  

 

  我们下载 MyCat Server :我是通过 wget XXXXXXXX;大家也可以直接下载下来,然后通过 FTP 传到服务器上。

 

  https://i-blog.csdnimg.cn/blog_migrate/48832342fdd93e903d99076440c500a1.png

 

  因为我们是Linux,所以我选择 linux.tar.gz,使用 Windows的朋友可以选择 win.tar.gz

  

  https://i-blog.csdnimg.cn/blog_migrate/829d40dc5307a17a81452bf91dfcc107.png

  [root@bogon ~]# wget https://github.com/MyCATApache/Mycat-download/blob/master/1.5-RELEASE/Mycat-server-1.5.1-RELEASE-20160816173057-linux.tar.gz

 

  https://i-blog.csdnimg.cn/blog_migrate/446c37101517606c218cc628ae54cc9f.png

 

   解压 MyCat Server 压缩包[root@bogon ~]# tar -xzvf Mycat-server-1.5.1-RELEASE-20160816173057-linux.tar.gz

 

  https://i-blog.csdnimg.cn/blog_migrate/c1ef34857fce18251228fe0bebb03e58.png

 

  将文件移动至 /usr/local/mycat 目录下[root@bogon ~]# mv mycat /usr/local/mycat

   

  https://i-blog.csdnimg.cn/blog_migrate/f580af63e394dc99f32996d1562d4e71.png

 

  这样,我们的 MyCat Server,就完成了,我们来运行一下:

  打开mycat/bin目录,运行 ./mycat start ,通过 ./mycat status 查看 mycat的运行情况

 

  https://i-blog.csdnimg.cn/blog_migrate/b26443c82455fdfad043564f365763cf.png

 

  

  启动:./mycat start    重新启动:./mycat restart  停止:./mycat stop  状态:./mycat status

 

 

 

下载 运行代理程序 

 

  我们使用的代理程序是由 Amamiya Yuuko 写的 Pomelo.EntityFrameworkCore.MyCat.Proxy

  

  这个代理程序是由问题的,我们前面说过了,我们先来尝试一下,对于出现的问题和解决方式,我们再讲解。

 

  我们先下载这个代理程序,下在方法跟上面 MyCat Server 一样,可以使用多种方式,大家可以直接下载到本地,解压完成后,把解压的文件通过FTP上传至proxy目录,我这里还是使用 wget

 

  https://i-blog.csdnimg.cn/blog_migrate/f5e0876c21b7513a8dba1d60809c0859.png

 

  

  [root@bogon ~]# wget https://github.com/PomeloFoundation/Entity-Framework-Core-MyCat-Proxy/releases/download/1.0.0-alpha2/MyCat-Entity-Framework-Core-Proxy.1.0.0-alpha2-netcore100.zip

   https://i-blog.csdnimg.cn/blog_migrate/54ad4e57ddb13fa9dc91c9915a554398.png

 

  创建一个目录 proxy ,将压缩包移动到此目录下

  [root@bogon ~]# mkdir proxy

  [root@bogon ~]# mv MyCat-Entity-Framework-Core-Proxy.1.0.0-alpha2-netcore100.zip proxy/MyCat-Entity-Framework-Core-Proxy.1.0.0-alpha2-netcore100.zip

 

  进入 proxy ,并解压 MyCat-Entity-Framework-Core-Proxy.1.0.0-alpha2-netcore100.zip 压缩包:

  [root@bogon ~]# cd proxy

    [root@bogon proxy]# unzip MyCat-Entity-Framework-Core-Proxy.1.0.0-alpha2-netcore100.zip

 

   编辑 config.json 文件,修改 MyCatRoot为"/usr/local/mycat"

  https://i-blog.csdnimg.cn/blog_migrate/679ad32dba3f41f6a991b242d84bc953.png

 

 

 

安装.NET Core SDK for CentOS

 

  详见:【(第十章)】发布项目到 Linux 上运行 Core 项目

 

 

运行代理程序

  

  我们来运行一下代理程序:[root@bogon proxy]# dotnet Pomelo.EntityFrameworkCore.MyCat.Proxy.dll

 

  https://i-blog.csdnimg.cn/blog_migrate/9a982be10e0706f64e98f64f4431ccc6.png

 

  我们先不管在程序中是怎么实现MyCat的,这个后面我们再讲,我们先来测试一下这个代理程序,不先解决这个代理的问题,到后面都很难知道到底是程序出错还是服务器的问题还是代理的问题:

  我在VS2015的控制台里执行:Add-Migration  MySQL_Init(也可以使用命令:dotnet ef Migrations add  MySQL_Init

  https://i-blog.csdnimg.cn/blog_migrate/6d492f6db2836bb14bcb37a0ba9b2c4c.png

 

  出错了。。。这个错误是操作超时了,这极有可能是连接不上MyCat服务器,这个问题曾困扰了我一段时间,后来突然发现忽略了一个重要的东西,防火墙。。。

  我们的代理使用的是7066端口,我们来开启一下防火墙端口,并重启防火墙:

  [root@bogon ~]# firewall-cmd --zone=public --add-port=7066/tcp --permanent

   [root@bogon ~]# systemctl restart firewalld

  https://i-blog.csdnimg.cn/blog_migrate/ba72111d7ecffdb769e578cb5d3a7cfe.png

 

   我们再来执行 Add-Migration  MySQL_Init 

  https://i-blog.csdnimg.cn/blog_migrate/67b3cffec8b38a6c8ae849c7e7d01237.png

 

  创建数据库: Update-Database -Verbose dotnet ef database update

   https://i-blog.csdnimg.cn/blog_migrate/6946ef9c874c46658c6c769335aa99c3.png

 

  https://i-blog.csdnimg.cn/blog_migrate/5105783f4ccff85967edaf890c81ee6d.png

  创建成功,看似没有什么问题。

    我们来插入几条数据看下:出错了 Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.

   超时,服务器没有响应。这是怎么回事呢,我们通过 Navicat 来连接一下 MyCat(同样服务器防火墙要开启 8066 端口,默认MyCat 是8066 端口,方法同上):

  https://i-blog.csdnimg.cn/blog_migrate/da0bcd91f25718866bd8ff9004f27bbe.png

 

  首先,我们来检查一下我们的MyCat状态:   

  https://i-blog.csdnimg.cn/blog_migrate/88b4cfc45ac82cf17f77f484db1120c9.png

 

  MyCat Server 关闭了。。。我们重启:

  https://i-blog.csdnimg.cn/blog_migrate/41736cd717619775d3bb4c19ed8c36af.png

  

  重启之后,总是自动关闭。这是什么原因?我们看下日志(/usr/local/mycat/logs/wrapper.log):

   https://i-blog.csdnimg.cn/blog_migrate/7c9010192b2a3e013dda5fc4430f8508.png

 

  这下看清楚了,是因为rule columns 有多个 values值,这个是什么东西呢,这是就是配置MyCat 规则的拆分的列的名称。

  我们来看下代理生成的rule(/usr/local/mycat/conf/rule.xml):

  https://i-blog.csdnimg.cn/blog_migrate/0e191079a98721c2dcea5376c41c67d7.png

 

   也就是说:MyCat 这个拆分规则 只支持单个,但是我们的代理生成了多个,导致 MyCat Server 错误

  我这里修改一下,改成<columns>ID</columins>,MyCat 启动就没有问题了,但是问题来了,我这里有四个实体类,其中有三个的主键都是ID,但是有一个的主键是UserID,那么只根据ID拆分显然是不合理的

  我们来看下 schema (/usr/local/mycat/conf/schema.xml): 

   https://i-blog.csdnimg.cn/blog_migrate/767f4b5e23b28c5c27cf74275587a9d5.png

 

  大家注意 table 标签的 rule 属性,都是 db_wkmvc_rule 跟 rule.xml 的 tableRule 标签的 name 属性是对应的。也就是说,这个表,按照 rule=""的规则,根据columns的值(列名,这里是主键也就是ID或UserID)拆分数据。

 

  如何解决?

  我想到的方案就是,每个表一个单独的规则,每个规则的columns值就是当前这个表的主键。

  我们来看下代理程序的源码:

  根据方法名称,我们可以看出这两个方法应该就是修改 rule.xml 和 schema.xml

   https://i-blog.csdnimg.cn/blog_migrate/c7abb3f2c7b0a3b970230144049841e8.png

 

   我们来看下GenerateRuleXml() 

  https://i-blog.csdnimg.cn/blog_migrate/edd236ae4df91f4b07381a95927a498a.png

 

  这一段就是生成xml内容的,为什么我们的 rule.xml 中的 columns 会生成 诸如:ID,ID,ID,UserID 呢?我们可以很清楚的看出 <columns>{ string.Join(",", s.Keys.First()) }</columns>

  在 foreach 循环 schema.xml 中 table 标签的时候,把他们的 Key (primaryKey) 通过 string.join 组合起来了,并且只生成了一个 tableRule 

  那么,按照我们的方案,应该是每个表(在 schema.xml 中体现就是 一个 table 标签),单独生成一个 规则。

  

  修改起来也很简单:

  我们把循环中的 ruleXml="" 改为 rulexml+="",然后把 <columns>{ string.Join(",", s.Keys.First()) }</columns> 改为当前表的 primaryKey :<columns>{ s.Keys.First() }</columns>

  

  这是修改后的完整的 public void GenerateRuleXml(List<MyCatTable> Schema, List<MyCatDataNode> DataNodes, string database, bool IsUnder16)

  public void GenerateRuleXml(List<MyCatTable> Schema, List<MyCatDataNode> DataNodes, string database, bool IsUnder16)
  {
    foreach(var s in Schema)
    {
      if (s.Keys.Count() != 1)
              continue;

      string ruleXml = "";
      string funcXml = "";
      if (IsUnder16)
      {
        ruleXml += $@"
              <tableRule name=""{ database }_{ s.TableName }_rule"">
              <rule>
              <columns>{ s.Keys.First() }</columns>
              <algorithm>{ database }_{ s.TableName }_func</algorithm>
              </rule>
              </tableRule>
              ";

        funcXml += $@"
              <function name=""{ database }_{ s.TableName }_func"" class=""org.opencloudb.route.function.PartitionByMod"">
              <property name=""count"">{ s.DataNodes.Count() }</property>
              </function>
              ";
      }
      else // 1.6+
      {

        ruleXml += $@"
              <tableRule name=""{ database }_{ s.TableName }_rule"">
              <rule>
              <columns>{ s.Keys.First() }</columns>
              <algorithm>{ database }_{ s.TableName }_func</algorithm>
              </rule>
              </tableRule>
              ";

        funcXml += $@"
              <function name=""{ database }_{ s.TableName }_func"" class=""io.mycat.route.function.PartitionByMod"">
              <property name=""count"">{ s.DataNodes.Count() }</property>
              </function>
              ";

      }

      using (var reader = XmlReader.Create(Path.Combine(MyCatRoot, "conf", "rule.xml"), new XmlReaderSettings { DtdProcessing = DtdProcessing.Ignore }))
      {
        var xml = new XmlDocument();
        xml.Load(reader);
        var mycatRule = xml.ChildNodes.Cast<XmlNode>().Single(x => x.Name == "mycat:rule");
        foreach (var x in mycatRule.ChildNodes.Cast<XmlNode>().Where(x => (x.Name == "tableRule" && x.Attributes["name"].Value == $"{ database }_{ s.TableName }_rule") || (x.Name == "function" &&         x.Attributes["name"].Value == $"{ database }_{ s.TableName }_func")).ToList())
        mycatRule.RemoveChild(x);
        mycatRule.InnerXml = ruleXml + mycatRule.InnerXml;
        mycatRule.InnerXml += funcXml;
        reader.Dispose();
        File.WriteAllText(Path.Combine(MyCatRoot, "conf", "rule.xml"), PatchXml("rule", xml.OuterXml));
      }
    }
  }

 

  我们重新编译生成,发布出来上传至服务器,替换掉我们之前的代理程序。然后重新运行一下,我们再来看下 rule.xml 和 schema.xml

  https://i-blog.csdnimg.cn/blog_migrate/893450718a1a183aa36fd84d9517b12f.png

  https://i-blog.csdnimg.cn/blog_migrate/1502cb2ba61f8b667c0b25dd6d7890c4.png

 

   是不是按照我们的预期,我们看下MyCat Server的状态:

   https://i-blog.csdnimg.cn/blog_migrate/e583dfda83d14e505b79962d61796d88.png

 

  MyCat 连接也没问题了

  https://i-blog.csdnimg.cn/blog_migrate/da719845cc1da19bb43cb246dc547bf3.png

 

   (后记:关于这个代理的问题,已经提交给作者了,这个代理程序我测试有一段时间了,当时还是alpha1版本,写文章的时候,我看到 alpha2版本貌似改进了,但是源码没有修改。)

 

 

 

如何在Asp.net Core中使用 Mycat

 

  分两部分,第一部分就是最简洁的应用第二部分是我在项目中的应用,大家自行参考。

 

   第一部分,最简洁的应用(作者 Demo):

  

   首先,我们新建一个控制台程序

  https://i-blog.csdnimg.cn/blog_migrate/5d4fc37a11ae705d0a54be92afacd0d8.png

 

  并将 Pomelo.EntityFrameworkCore.MyCat 添加至 project.json 中(Nuget:Install-Package Pomelo.EntityFrameworkCore.MyCat -Pre

  https://i-blog.csdnimg.cn/blog_migrate/b2cde74f1b49705ceba23cdfef0ad81d.png

 

  创建一个Blog模型:  

  public class Blog
  {
    public long Id { get; set; }

    public string Title { get; set; }

    public string Content { get; set; }

    public DateTime Time { get; set; }

  }

  

  创建DbContext类,并重写DbContext中的OnConfiguring方法,配置数据节点以及MyCAT服务器信息

  public class SampleContext : DbContext
  {
    public DbSet<Blog> Blogs { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
      base.OnConfiguring(optionsBuilder);

      optionsBuilder.UseMyCat("server=IP;port=8066;uid=test;pwd=test;database=blogs")
                .UseDataNode("IP", "blogs_1", "用户名", "密码")

              .UseDataNode("IP", "blogs_2", "用户名", "密码")

              .UseDataNode("IP", "blogs_3", "用户名", "密码");
    }
  }

  

  注意:

  .UseMyCat()中的 Server 是 MyCat 服务器的地址 Uid 和 Pwd 是 MyCat 的 用户名和密码,不要和数据的混了。 

  .UseDataNode()中的 Server 是节点数据库的地址 Uid 和 Pwd 是节点数据库的 用户名和密码

  如何查看 MyCat 的用户名和密码:

    打开mycat目录下的 conf 目录(我们这里是:/usr/local/mycat/conf)

     查看 server.xml 文件:

    https://i-blog.csdnimg.cn/blog_migrate/0f44ed1b9d4d5ca848c61571f2e6db33.png

    https://i-blog.csdnimg.cn/blog_migrate/8b77dfebcff80481cf89842bdfc75ee7.png

 

 

  上面插入一段,一般使用mycat的应该都知道这些文件分别是干什么的,我们这里啰嗦一下。

  我把整个的 Program.cs 内容给大家展示一下:

  https://i-blog.csdnimg.cn/blog_migrate/3adf8fcba360348adcda7fd168c2b0e5.png

 

  然后,就不多说了,你可以使用控制台命令 Add-Migration 和 Update-database 也可以使用命令 dotnet ef migrations add 和 dotnet ef database update 执行迁移和其它操作了。

 

  https://i-blog.csdnimg.cn/blog_migrate/4334252f348e4577623dc2d723e96321.png

 

 

  第二部分,我在项目中的应用:

  

  首先,在配置文件(siteconfig.json)中添加一个是否使用 MyCat 的配置:

  https://i-blog.csdnimg.cn/blog_migrate/4ec2d008a1bc158925174351075ce08a.png

 

  然后,同样在配置文件(siteconfig.json)中添加数据库节点配置:

  https://i-blog.csdnimg.cn/blog_migrate/62e657cf39c5562160099dd6a8c92b03.png

 

  在 【(第十二章)】添加对SqlServer、MySql、Oracle的支持 中,我们有个数据库选择类 DataBaseProvider.cs 

  https://i-blog.csdnimg.cn/blog_migrate/49e4f9a9fc2cf4e6d8c105cf6f531456.png

 

 

  这里面已经写了一个 _isUseMyCat 和 GetMyCatConnect(),是否使用 MyCat 这个 跟 数据库选择一样,我们从配置文件中读取这个配置返回即可:

  https://i-blog.csdnimg.cn/blog_migrate/bbb95899fd278a766a310a29f6d64f9b.png

 

  我们来重写一下 GetMyCatConnect 返回 MyCat 和 节点数据库连接的 DbContextOptionsBuilder

  

  public DbContextOptionsBuilder GetMyCatConnect(string connectionStr, DbContextOptionsBuilder _options)
  {
    _options.UseMyCat(connectionStr);

    List<MyCatDatabaseHost> hosts = new Services.ConfigServices.AppConfigurtaionServices().GetListAppSettings<MyCatDatabaseHost>("MyCatDatabaseHost");

    foreach(var host in hosts)
    {
      _options.UseDataNode(host.Host, host.Database, host.Username, host.Password, host.Port);
    }

    return _options;
  }

 

  对于读取配置的方法,我们在 【(第十二章)】添加对SqlServer、MySql、Oracle的支持 中已经完整的贴出。

 

  修改一下 Startup.cs 

  

   https://i-blog.csdnimg.cn/blog_migrate/302f75b97ded476c9c51fcdfb7c12614.png

 

  这样,我们就实现了对 MyCat的支持和切换,当然,在实际项目中,我们可能不需要这些,使用什么,是否有必要使用 MyCat 这些可能是早就定好的,因为我这个是测试学习的项目,所以罗列了各种东西。

 

 

 

 

 

 

希望跟大家一起学习Asp.net Core 

刚开始接触,水平有限,很多东西都是自己的理解和翻阅网上大神的资料,如果有不对的地方和不理解的地方,希望大家指正!

虽然Asp.net Core 现在很火热,但是网上的很多资料都是前篇一律的复制,所以有很多问题我也暂时没有解决,希望大家能共同帮助一下!

 

原创文章 转载请尊重劳动成果 http://yuangang.cnblogs.com

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
pomelo 是由网易开发的基于node.js开发的高性能、分布式游戏服务器框架, 也可作为高实时web应用框架。 Pomelo的应用范围 pomelo最适合的应用领域是网页游戏、社交游戏、移动游戏的服务端,开发者会发现pomelo可以用如此少的代码达到强大的扩展性和伸缩性。当然还不仅仅是游戏,很多人断言未来的web时代是实时web应用的时代, 我们发现用pomelo开发高实时web应用也如此合适, 而且伸缩性比其它框架好。目前不推荐将pomelo用于大型的MMO rpg游戏开发,尤其是3d游戏, 还是需要象bigworld这样的商用引擎来支撑。 Pomelo的理念 pomelo的第一个理念是让游戏(高实时web应用)服务器的开发变得非常简单, 而不是解决某类算法或系统上的难题。这个设计理念跟rails是很类似的;第二个理念是重视性能和可伸缩性,用户用pomelo开发出来的游戏天生具有很强的伸缩性,扩展也很容易。我们在性能优化上也花了很多功夫,并且会持续进行;第三个理念是让第三方很容易扩展,框架用了很多插件式的设计, 组件component、路由规则、甚至管理控制台都可以完全由第三方扩展。 Pomelo的框架组成 pomelo包括三部分: 框架, pomelo的核心, 与以往单进程的游戏框架不同, 它是高性能、分布式的游戏服务器框架,并且使用很简单 库, 包括了开发游戏的常用工具库, 如人工智能(ai), 寻路, aoi等 工具包, 包括管理控制台, 命令行工具, 压力测试工具等 pomelo特性 快速、易上手的游戏开发模型和api 高可伸缩的多进程架构, 支持MMO的场景分区和其它各类分区策略 方便的服务器扩展机制,可快速扩展服务器类型和数量 方便的请求、响应、广播、服务器通讯机制, 无需任何配置 注重性能,在性能、可伸缩性上做了大量的测试、优化 提供了较多扩展组件,包括游戏开发常用的库和工具包 提供了完整的MMO demo代码(客户端html5),可以作为很好的开发参考 基于socket.io开发,支持socket.io支持的多种语言客户端 为什么使用pomelo? 高并发、高实时的游戏服务器的开发是很复杂的工作。跟web应用一样, 一个好的开源容器或开发框架可以大大减少游戏开发的复杂性,让开发变得更加容易。遗憾的是目前在游戏服务器开发领域一直没有太好的开源解决方案。 pomelo将填补这个空白, 打造一款完全开源的高性能(并发)游戏服务器框架。 pomelo的优势有以下几点: 架构的可伸缩性好。 采用多进程单线程的运行架构,扩展服务器非常方便, node.js的网络io优势提供了高可伸缩性。 使用非常容易, 开发模型与web应用的开发类似,基于convention over configuration的理念, 几乎零配置, api的设计也很精简, 很容易上手。 框架的松耦合和可扩展性好, 遵循node.js微模块的原则, framework本身只有很少的代码,所有component、库、工具都可以用npm module的形式扩展进来。任何第三方都可以根据自己的需要开发自定义module。 提供完整的开源MMO游戏demo参考(基于HTML 5)。 一个超过1万行代码的游戏demo,使开发者可以随时借鉴demo的设计与开发思路。 在线演示:http://pomelo.netease.com/demo.html 标签:开发框架  游戏框架

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值