游戏服务器端设计

游戏服务器端设计文档


版本号 时间 作者
V0.1 2011/12/6 王明明



框架结构

xxxServer
src
com.youxigu.
commons…………………所有项目通用包
cache………………数据缓存处理
codec……………….编码与解码
filter………………….mina过滤器
loader………服务器启动加载各文件
util……………..以上各包的工具类
plugin……………..系统或子系统命名包
serurity…静态实体和动态实体用服务类
template……….静态实体类包
  domain……..动态实体类包
  services………..服务类
flash
doing…………..业务逻辑处理包
handler…………所有业务事件包

sys……该系统的相关常量类,

util……子系统工具类

test……系统测试包


config………………………服务器启动配置用业务逻辑数据
data………………………….游戏业务逻辑数据
template……………………静态类实体配置
templateConfig.xml….主文件
template1.xml……..业务数据静态实体文件

templateN.xml
action…………………….相关功能活动配置文件目录
action1.xml
server.properties…………………..服务器相关参数配置文件
openapp.properties……………….第三方平台相关配置文件

doc…………………策划文档,设计文档,前后端数据接口文档等

lib............................jar包目录

logs……………….日志文件
commons

Cache
以下是缓存与业务数据相关类图

codec:
SerialCode implements Transcoder

DefaultDomainCodec implements Transcoder

Object decode(CachedData d);
CachedData encode(Object obj);


第二套方案我们可以选择serialVersionUID
对每个domain固定serialVersionUID号


SpyMemcachedUtil.java…………………….包装spymemcached客户端工具类
//创建唯一ID,自增
long getNextId(Class clazz);

ICache.java ……………………….接口

Object get(String key);
Object set(String key,Object value);
Boolean add(String key,Object value);
Object  remove(String key);
Object delete(String key);
List<T> listByHashId(String key);
Map<String,Object> map(String key);
SpyMemCacheImpl.java…………..实现以上接口类


该类为plugin.security.services里面的类提供服务
MD5Util.java

以下两个方法为SpyMemCacheImpl 类提供服务
String createKey(Class clazz,long id);
String createKey(Class clazz,long hashId,long id);

codec
使用目前已有的组织结构
interface IDomainCodec extends Serializable
int getType();
整合现有的编码解码结构.


filter
message -AMF3Object
AMF3CodecFactory.java implements ProtocolCodecFactory.java
注册到mina过滤器
AMF3Encoder.java……..实现编码

AMF3Decoder.java………实现解码

安全策略模式
SecurityCodeFactory.java implements ProtocolCodecFactory.java

SecurityDecoder.java

SecuryityEncoder.java
loader
服务器启动,加载服务器相关配置文件, 调用子系统初始化类,socket启动




Root.java………………………….服务器启动入口
指定具体的某些服务启动
void main(String[] args);
如:com.youxigu.commons. GameServer

GameLoader.java…………………lib,bin,ext,script等文件加载
void loader();
void init();
XMLLoader.java…………………调用系统解析并初始化xml文件
void loader();
void init();
IServer.java…………………..接口
void init() throws  Exception;
void start() throws Exception;
void stop() throws Exception;
void startPolicyServer() throws Exception;

具体的某个服务器实现IServer接口
GameServer.java implements IServer.java
//loader init
void init();
相关properties文件初始化为全局所用
Config.java
//服务器配置文件
private static Properties serverProps = null ;
//open app配置文件
private static Properties appProps = null ;


private void init();

public synchronized static Config getInstance();
//获取model对象
TemplateCacheServices.java
//得到某个模板下集合
Map get(Class clazz);
Object get(Class clazz,String key);//得到某个集合下单个实例
util
commons包内所用的工具类
plugin
子系统


Serurity
包括有模版类,动态实体类,用服务类
template
模版类,与data/template/目录下的xml文件对应

BaseTemplate.java

protected long id;


template extends Base template

Template m=(Template)templateCacheServices.get(Class clazz,String key);
domain
动态实体类
BaseDomain
//
protected abstract int getType();
//每个动态实体实现的方法:返回在缓存中存储的结构形式
protected abstract Enum getSType();
Domain extends IDomainCodec
Domain对象存放在memcached分N种形式
存放形式要实现getSType方法
0:原型存放
1:List<Domain>形式
2:Map<String,Domain>形式


Key=type_[0|1|2…]_[hashId]
如果存放类型是0那么  hashId=id,否则hashId是id所属者
其services层实体的方法有:
Domain findById(long hashId,long id);
Map<Long,Domain> findByHashId(long hashId);
//提供cas操作
Item gets(long id);
Boolean cas();
services
对当前动态实体类服务

提供处理业务逻辑时必要的方法:
create,update,query等方法
//创建主键ID

domain create(Domain d,long hashId);

boolean update(Domain d);

Domain findById(long id);

List<Domain> findByHashId(long hashId);

Map<String,Domain> findByHashId(long hashId);
flash
业务逻辑处理
doing
复杂多层次的业务逻辑处理,依赖于不同的services
xxxxDoingImpl.java

依赖于services层的服务类与当前层的doing类

引入spring注入服务类,以标注形式注入bean
handler
事件处理
ServerHandler.java extends IoHandlerAdapter.java
//注册事件
void init();
//业务逻辑入口
//该方法获取处理业务的handler
void messageReceived(IoSession session,Object message);


//注册区分不同的handler事件调用
HandlerConstants.java

Interface IReceiveHandler
Void execute(IoSession session,ASObject obj);
如:
UserHandler extends IReceiveHandler
依赖于 UserDoingImpl等doing 或services类

Public static final int HANDLER_TYPE = 1000;
//处理业务方法
Void execute((IoSession session,ASObject obj);
sys
子系统下的相关常量类,数组,集合,及model类的初始化


util
服务于本系统的工具类
test
单元测试,代码性能测试
conf
系统的配置文件包括有服务器参数配置,第三方接口配置和游戏业务数据配置文件
data

template
templateConfig.xml
改进现在的模块加载方法:
提供快速找到某个模版具体的某个对象

Object getTemplate(Class clazz,String key);

DataLoader.java

ILoadFinished.java

Void registerObject(Object obj,String id);

IPlugin.java

TemplateService.java

Map<String,Map<String,Object>>
*.properties
server.properties
#是否在本地Debug模式。
GAME_DEBUG=true
serverIP=127.0.0.1
serverPort=89
#缓存服务器分组IP:port
TTcacheServers=172.16.3.1:1978
TTcacheServers=172.16.3.2:1978

TTcacheServers=172.16.3.3:1978
#静态数据文件路径
templetCache=./conf/data/model/modelConfig.xml
templetDomain=com.youxigu.plugin.serurity.model.

openapp.properties
# 平台相关信息
TOAPP_URL=qzone.com
#正式app_ID
APP_ID=23475
#SECRET_KEY
SECRET_KEY=04fafa5e8b6346569bc30ed681964d60
API_KEY=3a738e535568420680f76343b9da7cda
# SECRET_KEY
SECRET_KEY_PAY=jyiui989898090909


doc
策划文档,设计文档,前后端数据接口文档等
lib
略…
logs

猜你喜欢

转载自wangmingming2008.iteye.com/blog/1310675