WawaKM随笔同步服务端架构设计初稿


WawaKM随笔同步服务端采用Java架构,服务端用Servlet技术,来接受客户端的协议请求,协议请求支持json,web服务和自定义xml格式。json是为Ajax客户端服务,Ajax客户端用YahooUI,Google Gears来做。web服务形式是让c#等智能客户端用的,调用方面会简化一些,xml格式的命令客户端要根据协议自行解析,是标准协议,由第三方合作伙伴做接口用,我们会根据同步相关用例定义一套标准的用XML描述的协议,叫KMS协议。客户端除了Ajax客户端还有c#客户端,c#客户端会做为标准的客户端来实现,做为一个示例,源码会公开,其中会使用KMS标准协议。python客户端是为了让非windows用户使用的胖客户端,delphi是一个纯win32客户端,用来弥补c#客户端占用内存大的不足,Ajax客户端用在客户不想安装客户端软件的情况下,但如安装了gears可以使用离线功能。手机客户端暂时不考虑,到时候再把标准XML协议WBXML+SYNCML适配一下。

接入层用由WSAdapter,XMLAdapter和JSONAdapter来提供给客户端调用,CommandParser组件用来解析用户的请求,这里会有一个系列的Parser类,分别解析不同协议的输入,由工厂来生成。ResponseBuilder用来把java的实体类转换成给客户端的响应格式(xml,json等),也由抽象工厂生成。SyncCommandStack是KMS的协议栈,定义命令的一些实体类。


SSO用来让客户端实现身份验证,包括登陆、注销和保持登陆,这里用微软的live id和google的认证服务做适配,大家可以用MSN帐户或GMAIL帐户来登陆系统,也可以注册我们的会员来登陆,到时候会以一致的界面对待用户。TokenCleaner用来清理超时用户票证,用户通过身份验证后会在mysql里保存用户本地登陆的凭证,并把凭证返回给客户端,客户端下次发送请求,服务端会验证客户端的凭证是否存在,当然同时会验证客户端的IP是否是创建凭证的IP,并更新服务端缓存凭证的存活时间,如果一段时间内客户端没有任何请求,服务端将清理缓存的凭证,用户下次请求就会被通知重新登陆了。当然协议里会有保持登陆的信令。

安全控制服务用来防止用户恶意攻击,比如说某一IP短时间内发送大量的登陆信令,安全控制服务会把这个IP禁止掉,直接返回403错误码,协议不会路由到后端服务。当然安全控制服务的规则和用例一户会细化。

管理系统一个web portal,用来对用户进行管理,比如禁止用户,添加敏感词过滤条目,查看日志等。

监控系统用来监控服务端的运行状况,以旁路监听的方式注入到核心服务组件,可以查看系统每秒上行的流量和下行的流量大小,每秒处理的请求数,每秒失败的事务数,当前在线的用户数等。具体和服务端的交互方式还没考虑清楚,用rmi或自己写socket接口。可惜的是java里没有找到使用windows性能计数器的组件,或许性能计数组件要自己实现。想用JNI调用win32 api实现但不知道会不会有性能问题,自己用java实现吧,看了看.net类库里性能计数器的实现代码,被一大罗抽样算法给吓回来了,真希望java有人实现了性能计数器组件。

KMSyncManager用来实现主要的业务逻辑,接入层解析命令后会把操作权转给它,它来实现逻辑,并使用数据库访问层操作数据库。

数据库访问层用Privoder模式来做,以后方便从mysql数据库切换到其它数据库,数据库访问层可能会根据性能需要用OSCache做一个缓存层。

底层的Servlet容器用Tomcat,目前还没有想到必须用Apache和JBOOS的需求。

公共组件会用一些开源的类库,velocity会被ResponseBuilder来输出XML协议给客户端,log4j用来记录日志,dom4j被CommandParser用来解析用户提交的XML命令,json-lib用来解析和生成用户的json格式的请求和响应。

最后整个系统是个无状态的系统,以后整个接入层可以很简单的实现负载均衡来缓解压力,当然SSO那里还保存着客户端登陆的身份票证,SSO做为全局的,再说SSO的凭证还在mysql里保存,所以不会有问题。如果以后db压力特别大的话先用mysql的Master/Slave技术来把数据库进行拆分,拆分的原则是根据用户的ID范围进行拆分,比如1-100之间的一个数据库,100-200一个数据库。

原文地址:https://www.cnblogs.com/onlytiancai/p/855943.html