老平台已死,整理个文档留下做纪念
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
總結
以上是生活随笔為你收集整理的老平台已死,整理个文档留下做纪念的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux搭建FTP
- 下一篇: Google搜索技巧-从入门到精通(从此