我从事手机app服务端开发现在已经是3个年头,自己也整理出了一套相对好用的服务架构,写出来,跟大家一起分享。如有不足,还请多指教。

一:基础流程图。

其实有一点还需要加上,就是对json的压缩和加密,一来给用户节约流量,二来防止请求被截取破解我们的参数。具体先压缩后加密还是先加密后压缩这个问题看需求。

看到这个架构设计时,你们可能会说如果程序入口挂了,所有的服务都不可以用了。

所以这个架构的弱点在程序入口处,因此要有一(多)台机器做负载,负载的工具可以是HaProxy(软件)或者F5(硬件)的负载。F5比较昂贵,我没用过,haproxy的配置我就不贴了,谷歌一大把。

二:Json参数设计

手机App的灵魂是用户数,有了用户数才有一切。据我得到的数据,目前一款app从开始制作到推广到注册到充值的费用是14.6元(内部数据)。所以一款App的成功大部分取决于渠道推广。而一款手机的mac.imsi等数据是唯一标识一个手机用户的标准。可能某个用户换了一款手机,但是还想用以前的账号登录,所以userID也是必不可少的字段。但是会出现一个问题,两个mac.imsi,userID,但是他是一个用户,所以对用户信息的更新是至关重要的。但是用户数据的更新不可能放在客户端,当你界面提供了上传imsi.mac.phonenumber等字段到服务端时,用户会义无反顾的选择否。如果你偷偷上传用户的隐私数据到数据库,这是国内通用做法。不排除被用户控告的可能性。所以我们要想一起两全其美的办法。每一次都把这些信息上传上去,美其名曰:唯一标识用户。至于其它的数据,那是运营哥需要的数据,可以在数据中加上。

{    "context": {     "userID": "1",     "pwd": "fuckGfw",     "imei": "353641012835017",     "imsi": "460000000000000"     },     "reqType": {     "rt": "xxx"     }     }

每次把context中的参数进行更新,保持你所拥有的用户数据是真实值钱的。其中的rt字段为每次请求的目的(请求类型),它用来区分每次请求上来 我们需要调用那一台服务器的服务来处理请求。

服务架构和数据已经准备OK,我们接下来coding.

1:请求入口的承载类型选取

你是选择传统的.aspx页面为入口还是ashx还是wcf/wcfRest/WebApi 这个自由度很大,具体在项目中的选择主要看心情。我心情不好,所以选择.aspx页面。

主入口为Default.aspx页面,代码如下

   1:   protected void Page_Load(object sender, EventArgs e)
   2:   {
   3:      if(!IsPostBack)
   4:      {
   5:          try
   6:          {
   7:          }
   8:          catch (Exception exc)
   9:          {
  10:          }
  11:      }
  12:   }

在主入口处加一个大范围的catch,而在catch中输出系统忙。嗯,美其名曰:用户体验。

对json的压缩我使用了GZip,代码如下:

   1:      public static class CompressionHelper
   2:      {
   3:          /// <summary> 
   4:          /// Compress the byte[] 
   5:          /// </summary> 
   6:          /// <param name="input"></param> 
   7:          /// <returns></returns> 
   8:          public static byte[] Compress(byte[] input)
   9:          {
  10:              byte[] output;
  11:              using (MemoryStream ms = new MemoryStream())
  12:              {
  13:                  using (GZipStream gs = new GZipStream(ms, CompressionMode.Compress))
  14:                  {
  15:                      gs.Write(input, 0, input.Length);
  16:                      gs.Close();
  17:                      output = ms.ToArray();
  18:                  }
  19:                  ms.Close();
  20:              }
  21:              return output;
  22:          }
  23:   
  24:          /// <summary> 
  25:          /// Decompress the byte[] 
  26:          /// </summary> 
  27:          /// <param name="input"></param> 
  28:          /// <returns></returns> 
  29:          public static byte[] Decompress(byte[] input)
  30:          {
  31:              List<byte> output = new List<byte>();
  32:              using (MemoryStream ms = new MemoryStream(input))
  33:              {
  34:                  using (GZipStream gs = new GZipStream(ms, CompressionMode.Decompress))
  35:                  {
  36:                      int readByte = gs.ReadByte();
  37:                      while (readByte != -1)
  38:                      {
  39:                          output.Add((byte)readByte);
  40:                          readByte = gs.ReadByte();
  41:                      }
  42:                      gs.Close();
  43:                  }
  44:                  ms.Close();
  45:              }
  46:              return output.ToArray();
  47:          }
  48:      } 

压缩完json后,还需要加密,别脑残的说MD5,小心我抽你。这个看你对数据的安全性如何看待。如支付宝用的RSACryptoServiceProvider加密,如asp.net的ViewState用的base64编码。其实用什么编码无所谓,你只需要定制属于你自己的码表。代码我就不贴了,我怕把我1个月100块的保密费弄成10000的律师费。。。

接下来到重点了。你反序列化时可以使用Linq to Json或者Newtonsoft.json随便得到了rt字段的类型。一般同学就开始这样写了:

   1:              switch (rt)
   2:              {
   3:                  case"":
   4:                      break;
   5:                  default:
   6:                      break;
   7:              }

这样写没错,但是如果你的rt类型比较多了以后就会出现很长很长的流水代码。所以这个地方我更加建议使用依赖注入。接下来就是具体的业务逻辑处理、数据处理。

转载:http://www.cnblogs.com/YamatAmain/archive/2013/06/09/3129452.html

移动App服务端架构设计的更多相关文章

  1. 从服务端架构设计角度,深入理解大型APP架构升级

    随着智能设备普及和移动互联网发展,移动端应用逐渐成为用户新入口,重要性越来越突出.但企业一般是先有PC端应用,再推APP,APP 1.0版的功能大多从现有PC应用平移过来,没有针对移动自身特点考虑AP ...

  2. APP和服务端-架构设计(一)

    架构因人而异,不同的架构师大多会有不同的看法:架构也因项目而异,不同的项目需求不同,相应的架构也会不同.然而,有些东西还是通用的,是所有架构师都需要考虑的,也是所有项目都会有的需求,比如API如何设计 ...

  3. APP和服务端-架构设计(二)

    1. App架构设计经验谈:接口的设计 App与服务器的通信接口如何设计得好,需要考虑的地方挺多的,在此根据我的一些经验做一些总结分享,旨在抛砖引玉. 1.1 安全机制的设计 现在,大部分App的接口 ...

  4. 移动APP服务端API设计应该考虑到的问题

    2014年,移动APP的热度丝毫没有减退,并没有像桌面软件被WEB网站那样所取代, 不但如此,越来越多的传统应用.网站也都开始制作自己的移动APP,也就是我们常说的IOS客户端.android客户端. ...

  5. App服务端架构变迁

    随着移动互联网时代的到来,移动技术也随之飞速发展.如今,App已然成为绝大多数互联网企业用来获取用户的核心渠道.以往以PC为主要承载平台的各业务线,源源不断集成加入到移动项目中来,原本以产品为中心快速 ...

  6. 谈一款MOBA游戏《码神联盟》的服务端架构设计与实现

    一.前言 <码神联盟>是一款为技术人做的开源情怀游戏,每一种编程语言都是一位英雄.客户端和服务端均使用C#开发,客户端使用Unity3D引擎,数据库使用MySQL.这个MOBA类游戏是笔者 ...

  7. 谈一款MOBA类游戏《码神联盟》的服务端架构设计与实现(更新优化思路)

    注:本文仅用于在博客园学习分享,还在随着项目不断更新和完善中,多有不足,暂谢绝各平台或个人的转载和推广,感谢支持. 一.前言 <码神联盟>是一款为技术人做的开源情怀游戏,每一种编程语言都是 ...

  8. 1年内4次架构调整,谈Nice的服务端架构变迁之路

    Nice 本身是一款照片分享社区类型的应用,在分享照片和生活态度的同时可以在照片上贴上如品牌.地点.兴趣等tag. Nice从2013.10月份上线App Store到目前每天2亿PV,服务端架构经过 ...

  9. http服务端架构演进

    摘要 在详解http报文相关文章中我们介绍了http协议是如何工作的,那么构建一个真实的网站还需要引入组件呢?一些常见的名词到底是什么含义呢? 什么叫正向代理,什么叫反向代理 服务代理与负载均衡的差别 ...

随机推荐

  1. codeforces_724C_Ray Tracing

    C. Ray Tracing time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  2. R语言数据重塑

    使用cbind()函数连接多个向量来创建数据帧.此外,使用rbind()函数合并两个数据帧   使用merge()函数合并两个数据帧.数据帧必须具有相同的列名称,在其上进行合并   melt()拆分数 ...

  3. 宏基因组扩增子图表解读2散点图:组间整体差异分析(Beta多样性)

    散点图 数据点在直角坐标系平面上的分布图.在宏基因组领域,散点图常用于展示样品组间的Beta多样性,常用的分析方法有主成分分析(PCA),主坐标轴分析(PCoA/MDS)和限制条件的主坐标轴分析(CP ...

  4. PHP 之微信JSSDK类封装

    <?php class JSSDK { private $appId; private $appSecret; public function __construct($appId, $appS ...

  5. 为什么阿里规约手册要求谨慎使用Arrays.asList方法

    前言 在开发中,有时候会碰到把多个参数,或者说把数组转成List的需求,通常我们会使用 Arrays.asList()方法.但是该方法在使用的过程中,稍有不慎就会出现严重的异常.有如下代码: @Tes ...

  6. The JVM Architecture Explained

    转自:https://dzone.com/articles/jvm-architecture-explained?oid=18544920 Every Java developer knows tha ...

  7. idea SSM里配置redis

    参考文章 https://blog.csdn.net/qq_17635843/article/details/78522776

  8. 12. tie_breaker的使用原因和使用方法

    主要知识点: tie_breaker的使用原因和使用方法         一.tie_breaker的使用原因 dis_max,只是取分数最高的那个query的分数而已,完全不考虑其他query的分数 ...

  9. Django-cookie与session操作

    添加cookie: def login(req): if req.method=="POST": uf = UserInfoForm(req.POST) if uf.is_vali ...

  10. Tomcat关闭后,重新启动,session中保存的对象为什么还存在解决方法

    Tomcat关闭后,重新启动,session中保存的对象为什么还存在各们朋友大家好:         当我关闭Tomcat,重新启动后,session中保存的对象还依然存在,仍然可以使用,不知这是什么 ...