DBProxyComponent

这个组件跟LocationProxyComponent很像,也是服务器之间通信的组件。而DBProxyComponent应该是跟管理数据库服务的服务器通信的组件。

我们看到,在添加该组件的时候会在Awake方法里面获取到数据库服务器所在的IP地址,之后每次代理发送的时候,会通过NetInnerComponent创建跟数据库服务器的会话,并发送请求。

我们知道,这个请求在服务器被接受时,最后会在DBCacheComponent执行,那么,它是怎么分发到DBCacheComponent的呢?这里,我们一起来探索一下。

首先,我们来回忆一下我们的消息分发组件MessageDispatherComponent。在这个组件里面,我们给所有有MessageHandlerAttribute特性并且实现IMHandler的类都注册了事件,事件名是通过iMHandler.GetMessageType()方法获取消息类型再通过OpcodeTypeComponent获取到的操作符。

Type messageType = iMHandler.GetMessageType();
ushort opcode = this.Entity.GetComponent<OpcodeTypeComponent>().GetOpcode(messageType);

这一段在之前的学习笔记里面漏讲了,其实还是很重要的。不过这里结合实例来讲比较容易理解。

我们看到,实现iMHandler接口的有两个类,AMHandleAMRpcHandle,这两个都是抽象类,前者用于接收消息并处理,后者不仅接收消息并处理,在处理结束后还会返回结果。我们需要注意的是,这两个抽象类的泛型跟GetMessageType方法。

public abstract class AMRpcHandler<Request, Response>: IMHandler where Request : class, IRequest where Response : class, IResponse
...
public Type GetMessageType()
{return typeof (Request);
}
public abstract class AMHandler<Message> : IMHandler where Message : class
...
public Type GetMessageType()
{return typeof(Message);
}

我们看到,iMHandler.GetMessageType() 获取到的类是派生类的泛型类。这样会导致什么呢?

举个例子。

[Message(InnerOpcode.DBSaveRequest)]
[ProtoContract]
public partial class DBSaveRequest: IRequest

这是对数据库保存一条信息的请求,它的操作符是InnerOpcode.DBSaveRequest

[MessageHandler(AppType.DB)]
public class DBSaveRequestHandler : AMRpcHandler<DBSaveRequest, DBSaveResponse>

这是处理DBSaveRequest事件的类,在MessageDispatherComponent注册所有事件的时候,会查询到这个类有MessageHandler特性,并且实现了IMHandler接口,是AMRpcHandler的派生类嘛,而它所注册事件的名称,就是泛型DBSaveRequest的操作符InnerOpcode.DBSaveRequest。这样,当消息事件分发器接收到DBSaveRequest请求的时候,会把消息调度到DBSaveRequestHandler处理。

而我们之前对Session的学习也已经知道了发送消息时的打包方式,会记录消息的操作符。而接收到消息的时候,也会解析得到这个操作符,然后通过MessageDispatherComponent调度消息。忘记的去复习!


至此,我们终于走完了消息创建-打包-发送-接收-解包-分发到相对应处理器处理的整个流程。

如果我们要自定义一个消息,怎么做呢?

  1. 确定这个消息是否是请求(需要回复)。如果需要回复,则实现IRequest接口并且定义自定义回复结构,继承IResponse。记得添加Message特性并且标注操作符,新的操作符可以添加到自定义枚举里。或者添加到InnerOpcodeOpcodeOuterOpcode里面。还得添加ProtoContract,这是Protobuf-net的用法。
  2. 定义消息结构,既消息的内容。消息的内容有必要的话得按照Protobuf-net的用法定义特性。
  3. 定义处理消息的类。根据消息类型继承AMRpcHandler或者AMHandler,并把消息类型当作泛型传入。处理消息的类需要添加MessageHandler特性并且标注AppType
  4. 具体的处理消息方法需要重写处理类的Run方法。

经过上面的步骤,我们的MessageDispatherComponentOpcodeTypeComponent就会识别这些类,并注册相应的事件。当我们接收到相应的消息时,也会正确分发给对应的处理器处理。


扯远了,我们来看看数据库操作相关的请求消息会分配会分配给谁处理。

[MessageHandler(AppType.DB)]
public class DBSaveRequestHandler : AMRpcHandler<DBSaveRequest, DBSaveResponse>

喏,就是这个家伙了。我们看看它的Run方法。

DBCacheComponent dbCacheComponent = Game.Scene.GetComponent<DBCacheComponent>();
if (string.IsNullOrEmpty(message.CollectionName))
{message.CollectionName = message.Disposer.GetType().Name;
}if (message.NeedCache)
{dbCacheComponent.AddToCache(message.Disposer, message.CollectionName);
}
await dbCacheComponent.Add(message.Disposer, message.CollectionName);

正如我们最开是说的,请求在服务器被接受时,最后会在DBCacheComponent执行。

其他的事件都差不多其实。

ET框架---DBProxyComponent学习笔记(完善MessageDispatherComponent学习笔记)相关推荐

  1. 深度学习入门之PyTorch学习笔记:深度学习框架

    深度学习入门之PyTorch学习笔记 绪论 1 深度学习介绍 2 深度学习框架 2.1 深度学习框架介绍 2.1.1 TensorFlow 2.1.2 Caffe 2.1.3 Theano 2.1.4 ...

  2. 免费学习机器学习和深度学习的源码、学习笔记和框架分享

    机器学习和深度学习的免费学习源码.学习笔记和框架分享 python笔记 源码 python导入模块的的几种方式 在python中,字典按值排序 python中set的基本常用方法 python取出fr ...

  3. 《繁凡的深度学习笔记》前言、目录大纲 一文让你完全弄懂深度学习所有基础(DL笔记整理系列)

    <繁凡的深度学习笔记>前言.目录大纲 (DL笔记整理系列) 一文弄懂深度学习所有基础 ! 3043331995@qq.com https://fanfansann.blog.csdn.ne ...

  4. [深度学习笔记(1)]深度学习入门

    本系列是博主刚开始接触深度学习时写的一些笔记,写的很早了一直没有上传,趁着假期上传一下,作为分享,希望能帮助到你. 目录 前言 一.什么是深度学习 二.深度学习的应用 三.深度神经网络的难题 3.1 ...

  5. AI Studio 飞桨 零基础入门深度学习笔记1-深度学习的定义

    AI Studio 飞桨 零基础入门深度学习-笔记 人工智能.机器学习.深度学习的关系 机器学习 机器学习的实现 机器学习的方法论 案例:牛顿第二定律 确定模型参数 模型结构介绍 深度学习 神经网络的 ...

  6. 干货 | 吴恩达亲自为这份深度学习专项课程精炼图笔记点了赞!(附下载)

    来源:机器之心.AI有道 本文约7500字,建议阅读10+分钟. 本文整理了深度学习基础.卷积网络和循环网络的学习笔记,附下载哦~ [ 导读 ]吴恩达在推特上展示了一份由 TessFerrandez ...

  7. Vue 学习 之 7.01 学习笔记

    Vue  学习 之  7.01 学习笔记 1.还是复习前面的那个"品牌案例管理",但是数据不是静态写死哦,而是动态的管理,向数据库发送相关请求实现,因此,小节和昨天所学就是掌握Vu ...

  8. 深度学习入门之PyTorch学习笔记:卷积神经网络

    深度学习入门之PyTorch学习笔记 绪论 1 深度学习介绍 2 深度学习框架 3 多层全连接网络 4 卷积神经网络 4.1 主要任务及起源 4.2 卷积神经网络的原理和结构 4.2.1 卷积层 1. ...

  9. 深度学习入门之PyTorch学习笔记:多层全连接网络

    深度学习入门之PyTorch学习笔记 绪论 1 深度学习介绍 2 深度学习框架 3 多层全连接网络 3.1 PyTorch基础 3.2 线性模型 3.2.1 问题介绍 3.2.2 一维线性回归 3.2 ...

最新文章

  1. Idea SpringBoot 基于 Docker容器环境进行远程调试
  2. iOS UICollectionView的实现
  3. 有关函数模板和类模板的说法
  4. 揭开并发包底层AQS的神秘面纱
  5. mysql踢掉登录用户_centos 强制踢掉某登录用户的方法
  6. 总奖金15万,双赛道同名消歧挑战赛报名进行中
  7. 微服务与Spring-Cloud的关系(区别)
  8. java uuid静态方法_Java UUID version()方法与示例
  9. MySQL大表关联如何优化_MySQL 对于大表(千万级),要怎么优化呢?
  10. 【Arcgis】绘制武汉市行政区划地图
  11. J1939协议之通俗易懂----概述
  12. 飞猪IP-代理-换IP作用
  13. PostgreSQL创建、连接企业型地理数据库
  14. ARM发展史,初步汇总
  15. 解决ZeroDivisionError: integer division or modulo by zero问题
  16. 小米妙享更新的安装包下载到了电脑的哪里
  17. Python之禅 的翻译和解释
  18. 常用的四拍子,八拍子
  19. 生成微信支付二维码及微信支付
  20. 管理员账户没有系统维护权限处理办法

热门文章

  1. Python编程进阶,常用8大技巧!
  2. 小程序 input type=‘number‘ 不能输入小数点??
  3. 双11营业额实时数据_【好消息!】淘宝客也有自己的双11实时大屏啦
  4. 关于队里面最菜的在博客打卡第四十八天这件事
  5. centos配置nginx
  6. 兼容IE8实现页面添加水印
  7. SSH+VIM 共享剪切板实现详解
  8. android studio开发工具遇到一个新问题一直卡indexing paused due to batch update不停的转
  9. Skype测试支持Linux和MAC OS 皆为免费下载
  10. 重庆赛区ACM热身赛-8529. Cake