游戏服务器端设计文档
版本号 时间 作者
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
今日推荐
周排行