• ET框架对MongoDB的使用


    一:本地测试:

    1:加载DB组件

    2:调整用户ID :  C2G_LoginGateHandler中创建玩家时id调整。(每次重启服务端创建小人ID是一样的,插入数据库会覆盖掉上传插入的数据)

    3:在C2G_EnterMapHandler.cs添加测试代码

                Player player = session.GetComponent<SessionPlayerComponent>().Player;
                // 在map服务器上创建战斗Unit,默认第一个Map服务器
                IPEndPoint mapAddress = StartConfigComponent.Instance.MapConfigs[0].GetComponent<InnerConfig>().IPEndPoint;
                
                Log.Info("向Map服务器发送创建玩家信息。Map Address :" + mapAddress.Address + "--" + mapAddress.Port);
                Session mapSession = Game.Scene.GetComponent<NetInnerComponent>().Get(mapAddress);
                M2G_CreateUnit createUnit = (M2G_CreateUnit)await mapSession.Call(new G2M_CreateUnit() { PlayerId = player.Id, GateSessionId = session.InstanceId });
                player.UnitId = createUnit.UnitId;
                response.UnitId = createUnit.UnitId;
                
    //新加的代码,测试DB
    // /************ 数据库demo ************/ //数据库操作对象 DBProxyComponent dbProxy = Game.Scene.GetComponent<DBProxyComponent>(); // //保存到数据库 await dbProxy.Save(player); Log.Info("--保存成功---"); //查询账号是否存在 Player resultd = await dbProxy.Query<Player>(player.Id); Log.Info(MongoHelper.ToJson(resultd)); //根据Account账号查找,可能有多个 List<ComponentWithId> results = await dbProxy.Query<Player>(_account => _account.Account == player.Account); Log.Info(results.Count + ""); if (results.Count > 0) { Log.Info(MongoHelper.ToJson(results[0])); }

    4:配置DB

      

    5:编译,运行

    6:查看数据库 

    二:在分布式服务端使用(这里是ET5做法,ET6听说是哪个服务使用,就哪个服务直连DB)

    1:启动一个DB服务器。加载相应组件。

    2:添加DB配置

    3:DB使用方法修改

    不能直接使用DB组件进行DB访问。需要使用DB时,向DB服务器发送相应请求,DB服务对数据库做相应操作。

    using System;
    using System.Collections.Generic;
    using System.Net;
    using ETModel;
    using MongoDB.Bson;
    using MongoDB.Bson.Serialization;
    using MongoDB.Driver;
    
    namespace ETHotfix
    {
        [MessageHandler(AppType.Gate)]
        public class C2G_EnterMapHandler : AMRpcHandler<C2G_EnterMap, G2C_EnterMap>
        {
            protected override async ETTask Run(Session session, C2G_EnterMap request, G2C_EnterMap response, Action reply)
            {
                Log.Info("--create player--");
                
                Player player = session.GetComponent<SessionPlayerComponent>().Player;
                // 在map服务器上创建战斗Unit,默认第一个Map服务器
                IPEndPoint mapAddress = StartConfigComponent.Instance.MapConfigs[0].GetComponent<InnerConfig>().IPEndPoint;
                
                Log.Info("向Map服务器发送创建玩家信息。Map Address :" + mapAddress.Address + "--" + mapAddress.Port);
                Session mapSession = Game.Scene.GetComponent<NetInnerComponent>().Get(mapAddress);
                M2G_CreateUnit createUnit = (M2G_CreateUnit)await mapSession.Call(new G2M_CreateUnit() { PlayerId = player.Id, GateSessionId = session.InstanceId });
                player.UnitId = createUnit.UnitId;
                response.UnitId = createUnit.UnitId;
                
                // // /************ 数据库demo ************/
                // //数据库操作对象
                // DBProxyComponent dbProxy = Game.Scene.GetComponent<DBProxyComponent>();
                // // //保存到数据库
                // await dbProxy.Save(player);
                // Log.Info("--保存成功---");
                // //查询账号是否存在
                // Player resultd = await dbProxy.Query<Player>(player.Id);
                // Log.Info(MongoHelper.ToJson(resultd));
                //
                // //根据Account账号查找,可能有多个
                // List<ComponentWithId> results = await dbProxy.Query<Player>(_account => _account.Account == player.Account);
                // Log.Info(results.Count + "");
                // if (results.Count > 0)
                // {
                //     Log.Info(MongoHelper.ToJson(results[0]));
                // }
                
                /************ 数据库demo 分布式服务器中************/
                //获取DB服务器地址
                IPEndPoint dbAddress = StartConfigComponent.Instance.DBConfig.GetComponent<InnerConfig>().IPEndPoint;
                
                Log.Info("获取DB服务器地址 :" + dbAddress.Address + "--" + dbAddress.Port);
                Session dbSession = Game.Scene.GetComponent<NetInnerComponent>().Get(dbAddress);
                await dbSession.Call(new DBSaveRequest { Component = player});
                
                Log.Info("--保存成功---");
                
                DBQueryResponse dbQueryResponse = (DBQueryResponse)await dbSession.Call(new DBQueryRequest { CollectionName ="Player", Id = player.Id });
                Player result = (Player)dbQueryResponse.Component;
                Log.Info(MongoHelper.ToJson(result));
                
                //序列化查询json,来着  await dbProxy.Query<Player>(_account => _account.Account == player.Account); 函数中
                ExpressionFilterDefinition<Player> filter = new ExpressionFilterDefinition<Player>(_account => _account.Account == player.Account);
                IBsonSerializerRegistry serializerRegistry = BsonSerializer.SerializerRegistry;
                IBsonSerializer<Player> documentSerializer = serializerRegistry.GetSerializer<Player>();
                string json = filter.Render(documentSerializer, serializerRegistry).ToJson();
                
                DBQueryJsonResponse resultsList = (DBQueryJsonResponse)await dbSession.Call(new DBQueryJsonRequest { CollectionName ="Player",Json = json});
                List<ComponentWithId> list = resultsList.Components;
                Log.Info(list.Count + "---size");
                if (list.Count > 0)
                {
                    Log.Info(MongoHelper.ToJson(list[0]));
                }
    
                reply();
            }
        }
    }
    View Code

    4:编译,发布到Centos7虚拟机上。

     

      

    5;运行客户端,测试

     

     

    三:摸索过程。(由于没有找到相应文档,自以为是的操作过程),以下是错误示范,以下是错误示范,以下是错误示范

    1:Gate服务中使用DB,就在Gate服务中添加DB组件:

     2:修改配置,在Gate服务配置中添加DB.

    3:DB服务还原到本地测试时的访问方式

    4:编译,发布,启动,配置文件也上传到相应位置

     

     运行前端,发现报错。

     

  • 相关阅读:
    kubernetes获取Pod内容器信息
    etcd空间配额2G限制优化
    kubernetes集群之GC处理
    kubernetes之statefulset控制器介绍
    基于MySQL Binlog的Elasticsearch数据同步实践
    Nacos
    Python最佳工程实践,建立一个完美的工程项目
    图数据库的内部结构 (NEO4j)
    5个用/不用GraphQL的理由
    Neo4J 查找两节点之间的路径
  • 原文地址:https://www.cnblogs.com/cj8988/p/14120801.html
Copyright © 2020-2023  润新知