账号认证网关,指的是对外提供账号认证服务的应用接口。本质上是一个进程,基于某种特定协议(如HTTP协议),接收账号认证请求,通过查询账号数据库验证账号是否正确,然后返回验证结果。
写这篇文章,主要是继续补充“游戏平台架构 账号篇”的内容。如果到这里还看不明白的童鞋不妨先看看前面写的这篇文章。
账号认证网关的实现,主要有以下几个技术点:
1、作为服务端进程,接收并处理请求
2、长连接数据库,查询账号是否正确
3、缓存查询过的账号,减少重复的查询
第一点,服务端进程
我们先对前面两点做一下分析,服务端进程需要24小时监听并处理请求,而且获取请求传过来的账号信息,并进行数据库查询,将结果告知请求。
这一来一回的过程,本质就是服务端socket与客户端socket通信的过程,从监听(listen),到接受请求(accept),到接收数据(recv),然后传输数据(send),最后关闭连接的过程。
这里还有一个需要注意的问题,如何去约定传递的数据格式?哪部分内容代表账号?哪部分内容又代表什么?所以我们在通讯时服务端和客户端都会事先协议好。
为了提高开发效率,同时也使我们能集中精力去处理业务,我选用了相对成熟的libevent,而且还可以跨平台,方便以后系统迁移,通讯协议则选HTTP。
libevent是一个异步事件触发的网络库,适用于windows、linux、bsd等多种平台。libevent提供了一系列应用程序编程接口,让开发者可以设定某些事件发生时所执行的函数,也就是说,libevent实现了对系统底层网络处理的封装,使得开发者可以更简单方便的处理网络事件。
HTTP协议是互联网上应用最为广泛的一种网络协议,是服务器端和客户端请求和应答的标准之一。
使用libevent 还有一个重要原因,她也实现了对HTTP的封装。这样我们就可以集中精力去处理业务代码了。
第二点,数据库查询
数据库查询其实没多少内容。到了做这个东西的时候,数据库已经决定好是什么类型了,所要做好的是如何去连接,去查询?
主要有以下几点:
1、最好使用长连接
2、考虑使用连接池,数据库查询相对内存读写是耗时的过程
3、对查询的内容做索引优化
第三点,缓存账号
账号要如何缓存,实现方式有很多种,简单介绍3种:
1、简单的,使用成熟的c++ map容器
2、 也不难,使用memcached作缓存
3、复杂的,两层结构,第一层用hash表,第二层用链表
剩下的就是具体的实现了,交给你自己了。