1,平台的服务器整体架构

2,项目结构

3,业务结构

4,技术实现

5,业务举例

登录页:

登录:

其它的服务只是业务不同,这里省略...

6,应用的启动过程资源准备

7,json的封装

public static void CrossDomain2(HttpServletResponse response, HttpServletRequest request, Object msg) throws IOException {

response.setContentType("application/json");

final String call = request.getParameter("callBack");

final ObjectMapper mapper = new ObjectMapper();

String resp = mapper.writeValueAsString(msg);

if (!Strings.isNullOrEmpty(call)) {resp = call + "(" + resp + ")";}

PrintWriter out = response.getWriter();

out.write(resp);

out.flush();

out.close(); }

8,cookie域的算法

//构造cookie

final long time = System.currentTimeMillis();

String userId = String.valueOf(uid);

String USERINFO = userId + "," + userName + "," + time;

String u = Base64.encode(USERINFO + "," +

buildUserInfoSign(String.valueOf(userId), userName, String.valueOf(time)));

u = URLEncoder.encode(u, "utf-8");

String key = URLEncoder.encode(Base64.encode("USERINFO"), "UTF-8");

Cookie cookie = new Cookie(key, u);

//构造cookie加密部分

public static String buildUserInfoSign(String id, String name, String time) {

String userInfoSrc = id + name + time;

String key = ConfigurationUtils.get("login.cookieKey");

String userInfo = userInfoSrc + key;

String md5UserInfo = MD5Utils.digestAsHex(userInfo);

return md5UserInfo;

}

//解析cookie

public static int getUserId(HttpServletRequest request) {

int userId = 0;

String value = getCookieValueByKey(request);

if (!Strings.isNullOrEmpty(value)) {

String val[] = value.split(",");

userId = Integer.parseInt(val[0]);

}

return userId;

}

public static String getCookieValueByKey(HttpServletRequest request) {

String value = "";

Cookie[] cookies = request.getCookies();

String name = "USERINFO";

try {

name = Base64.encode(name);

name = URLEncoder.encode(name, "utf-8");

} catch (Exception e) {

log.error("USERINFO解码出错!{}", e.getMessage());

}

if (cookies != null && cookies.length > 0) {

for (Cookie cookie : cookies) {

String nameStr = cookie.getName();

if (nameStr.equals(name)) {

value = cookie.getValue();

break;

}

}

}

if (!Strings.isNullOrEmpty(value)) {

try {

value = URLDecoder.decode(value, "UTF-8");

value = Base64.decode2Str(value);

} catch (Exception e) {

log.error("URL解码出错!{}", e.getMessage());

}

String val[] = value.split(",");

String sign = buildUserInfoSign(val[0], val[1], val[2]);

if (!Strings.isNullOrEmpty(sign) && !Strings.isNullOrEmpty(val[3]) && sign.equals(val[3])) {

return value;

} else {

return "";}

}

return "";

}

9,http的理解和封装

public class HeadlessServlet extends HttpServlet implements InjectionProxy

里面加了一个对自定以的注解的过滤;

protected boolean filters(final HeadlessServletRequest request, final HeadlessServletResponse response) throws ServletException, IOException {

final Parameter parameter = this.getClass().getAnnotation(Parameter.class);

if (null == parameter)

return true;// filter methods

if (!Strings.isNullOrEmpty(parameter.method()) && !request.getMethod().equalsIgnoreCase(parameter.method())) {

notFound(response);

return false;

}

// filter parameters

boolean flag = true, emptyCheck = false;

try {

final Map<String, String[]> parameterMap = request.getParameterMap();

for (String name : parameter.value()) {

if (name.endsWith(":")) {

name = name.substring(0, name.length() - 1);

emptyCheck = true;

}

flag = parameterMap.containsKey(name);

if (emptyCheck) {

// must has parameter.

flag = flag && parameterMap.get(name) != null;

flag = flag && parameterMap.get(name).length > 0;

flag = flag && !Strings.isNullOrEmpty(parameterMap.get(name)[0]);

}

if (!flag)

break;

emptyCheck = false;

}

return flag;

} finally {

if (!flag) {

response.sendInvalidParameters();

}

}

}

10,db设计

11,老平台小结

老平台采用的架构很简单,一个Guice+Servlet,简单的把一个url映射到一个特定的Servlet,

这里借用Guice-servlet,省去了原生的servlet配置文件复杂的嫌疑,简单的使用Guice容器,

把所需资源按照分类和层级一一放到容器中初始化,简化了实例化的过程,提高了效率;业

务也不复杂,很容易从其它的游戏平台移植过来,业务的技术难点有两个,一个是跟其它服

务器的交互和通信,另外一个是缓存的使用;对于跟其它服务器的交互,主要是基于http

请求,如果对这一部分比较熟悉,只要文档给的比较规范,开发和调试起来还是完全没有问

题的;然后是缓存的问题,这里主要使用的Redis,一个key-value数据库,通过把经常用的

数据从db中查询出来,放到redis里面,需要的时候从redis里面取得,这大大提升了性能,

如果redis不稳定,可以直接从db里取得,保证了程序的健壮性;暂未进行过并发性测试,

目前能支撑2000w用户的使用已经算是一个还不错的架构。

转载于:https://www.cnblogs.com/snidget/p/3592263.html

老平台已死,整理个文档留下做纪念相关推荐

  1. JAVA毕业设计快递配送平台计算机源码+lw文档+系统+调试部署+数据库

    JAVA毕业设计快递配送平台计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计快递配送平台计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目架构:B/S架构 开发语言:Ja ...

  2. java计算机毕业设计流浪动物的救助管理平台源代码+数据库+系统+lw文档

    java计算机毕业设计流浪动物的救助管理平台源代码+数据库+系统+lw文档 java计算机毕业设计流浪动物的救助管理平台源代码+数据库+系统+lw文档 本源码技术栈: 项目架构:B/S架构 开发语言: ...

  3. java计算机毕业设计科技专业师生沟通平台源程序+mysql+系统+lw文档+远程调试

    java计算机毕业设计科技专业师生沟通平台源程序+mysql+系统+lw文档+远程调试 java计算机毕业设计科技专业师生沟通平台源程序+mysql+系统+lw文档+远程调试 本源码技术栈: 项目架构 ...

  4. android 开放平台开发,OPPO开放平台上线Android 12适配文档

    OPPO 近日悄然在开放平台添加了 Android 12 适配文档,该文档可帮助 App 开发者更好地兼容 Android 12. 虽然文档内还没有任何内容,但这标志着 OPPO 已经开始了 Andr ...

  5. python docx 设置表格字体和格式_python-docx修改已存在的Word文档的表格的字体格式方法...

    搞了好几天的表格字体格式,一直想找一种能直接一次性修改表格所有字体格式的方法(函数),但是无论用什么方法都无法修改表格字体的格式,原因应该是已存在的文档本身就具有某种格式限制,制约着里面表格里面字体格 ...

  6. JEECG 智能开发平台二次开发帮助文档

    JEECG 智能开发平台二次开发帮助文档  http://code.google.com/p/jeecg/downloads/list

  7. 计算机excel还原,3种方法找回电脑上已删除的Excel文档

    Microsoft Office Excel是微软(Microsoft)为Windows及macOS所设计的试算表软件.它的计算.绘图工具.枢纽分析表和一个称作VBA(Visual Basic for ...

  8. JAVA毕业设计计算机类专业考研交流学习平台计算机源码+lw文档+系统+调试部署+数据库

    JAVA毕业设计计算机类专业考研交流学习平台计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计计算机类专业考研交流学习平台计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目 ...

  9. java计算机毕业设计培训学校教学管理平台源码+程序+lw文档+mysql数据库

    java计算机毕业设计培训学校教学管理平台源码+程序+lw文档+mysql数据库 java计算机毕业设计培训学校教学管理平台源码+程序+lw文档+mysql数据库 本源码技术栈: 项目架构:B/S架构 ...

最新文章

  1. C++ 判断指针是否为空
  2. 新手站长们如何利用10分钟的时间内多写高质量的原创量?
  3. java单态模式_Java单态模式
  4. 在Ubuntu 16.04 LTS下编译安装OpenCV 4.1.1
  5. eclipse代码补全
  6. 手绘风格的数据可视化 (萌萌风)Sketchify,及其他可视化工具(商业风)
  7. 怎么才能点一下excel中的超链接就显示出图片?_Excel如何批量建立超链接,搭建工作台...
  8. [论文阅读] Learning a Unified Classifier Incrementally via Rebalancing
  9. php dirname(_FILE_)
  10. asp:get请求写法
  11. linux串口API编程
  12. Python学习 Day 039 - HTML
  13. Poco库学习——1
  14. 数据库版本管理(flyway)
  15. 蓝桥杯实验4--按键之独立键盘(proteus仿真)
  16. ntp VS chrony
  17. 【深度学习基础知识 - 28】三维重建中的点云、体素、mesh
  18. Axios GET 不能设置Content-Type
  19. matlab中diag什么,线性代数里的“diag”是什么意思?
  20. python输出宽度是什么意思_Python输出长度

热门文章

  1. [YTU]_2619 (B 友元类-计算两点间距离)
  2. 10.2.1 关于vc++不支持把类的成员函数定义为类的友元函数的处理
  3. ORB特征匹配(python)
  4. \00在python中
  5. css实现一侧开口三角形
  6. 第一讲 ODE几何方法
  7. XML指南——XML 确认
  8. python之发送HTML内容的邮件
  9. Android 自动生成表格
  10. 20145233《Java程序设计》课程总结