成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

移動后端服務BaaS現狀

移動開發
開發一個具有網絡功能的移動應用,除了要開發客戶端,還要開發服務端,還需要服務器。為了簡化移動應用的開發和部署,讓開發者只專注于客戶端的開發,而將后端服務整合成API提供給開發者調用,這就是BaaS(Backend as a Service)。

 

目前,國外至少已經有二十多家企業進入了這個領域,其中,提供的后端服務比較全面的有StackMob、Parse、Kinvey。而國內,和國外的概念比較接近的有Bmob、AMTBaaS,還有我們的Xone

StackMob

StackMob算是最早進入該領域的,成立于2010年1月,去年5月份的時候,那時該團隊還只有6個人,就獲得了750萬美元的投資。目前該團隊有24個人,每月訪問量已經超過300萬,使用其服務的應用已經達到120萬。支持的SDK已經涵蓋了iOS、Android、JavaScript、 Ruby,還有Custom Code。其中,Custom Code是用于服務端開發的,可以用Java和Scala語言進行開發。通過Custom Code,開發者就可以在服務端處理一些無法在客戶端處理的邏輯。StackMob提供的功能服務也挺全面的,大的方面,數據存儲、推送服務、地理位置服務、社交等,再細入到支持角色管理、ACL、復雜和多層的數據模型、多種查詢條件等等。

而那么多SDK中,我只看了Android的。其SDK也挺簡單易用的,應用程序自身的數據模型只要繼承StackMobModel即可,而用戶類則繼承StackMobUser,然后可以直接定義自己的屬性。另外,它也支持嵌套的數據模型,最多支持3層嵌套。比如下面的代碼:

  1. public class Task extends StackMobModel { 
  2.                                                                    
  3.     private String name; 
  4.     private Date dueDate; 
  5.     private int priority; 
  6.     private boolean done; 
  7.     private Task prerequisite; 
  8.                                                         
  9.     public Task(String name, Date dueDate) { 
  10.         super(Task.class); 
  11.         this.name = name; 
  12.         this.dueDate = dueDate; 
  13.         this.priority = 0
  14.         this.done = false
  15.     } 
  16.                                        
  17.     public void setPrerequisite(Task prereq) { 
  18.         this.prerequisite = prereq; 
  19.     } 
  20.                                    
  21. public class TaskList extends StackMobModel { 
  22.                                
  23.     private String name; 
  24.     private List<Task> tasks; 
  25.     private Task topTask; 
  26.     private TaskList parentList; 
  27.                                                                                                                                       
  28.     public TaskList(String name) { 
  29.         super(TaskList.class); 
  30.         tasks = new ArrayList<Task>(); 
  31.         this.name = name; 
  32.     } 
  33.                                                                                                                                             
  34.     public String getName() { 
  35.         return name; 
  36.     } 
  37.                                                                                                                                                           
  38.     public List<Task> getTasks() { 
  39.         return tasks; 
  40.     } 

保存數據時,代碼就可以如下:

  1. TaskList taskList = new TaskList("StackMob Tasks"); 
  2. taskList.getTasks().add(new Task("Learn about relations"new Date())); 
  3. taskList.getTasks().add(new Task("Learn about queries"new Date())); 
  4. taskList.save(StackMobOptions.depthOf(1)); 

StackMob的這種模式,簡單易懂,操作上也很方便,數據模型的擴展性也很好。

不過,文件存儲就沒這么方便了,StackMob不提供將文件上傳到它自己的平臺服務器,只提供接口,讓你將文件上傳到開發者自己的S3上面。也就是說,開發者必須自己先申請AWS的S3,才可以使用StackMob提供的文件存儲服務。

還有,StackMob的推送服務是使用Google的GCM服務的,所以,開發者還需要擁有Google的GCM賬號才能注冊使用StackMob的推送服務。

另外,其Model和Controller的分離也還不夠好。例如,對于用戶操作的方法,在StackMobUser里提供了很多方法,但在StackMob里也提供了不少方法。如果將數據操作的部分可以統一接口就更好了。

再看看StackMob提供的Custom Code,它也提供了操作后臺數據很全面的各種方法和類。使用起來也挺簡單,比如寫個hello_world的例子,后臺服務類需要實現CustomCodeMethod接口,比如下面代碼:

  1. public class HelloWorldExample implements CustomCodeMethod { 
  2.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
  3.   /** 
  4.    * This method simply returns the name of your method that we'll expose over REST for 
  5.    * this class. Although this name can be anything you want, we recommend replacing the 
  6.    * camel case convention in your class name with underscores, as shown here. 
  7.    * 
  8.    * @return the name of the method that should be exposed over REST 
  9.    */ 
  10.   @Override 
  11.   public String getMethodName() { 
  12.     return "hello_world"
  13.   } 
  14.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
  15.   /** 
  16.    * This method returns the parameters that your method should expect in its query string. 
  17.    * Here we are using no parameters, so we just return an empty list. 
  18.    * 
  19.    * @return a list of the parameters to expect for this REST method 
  20.    */ 
  21.   @Override 
  22.   public List<String> getParams() { 
  23.     return Arrays.asList(); 
  24.   } 
  25.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
  26.   /** 
  27.    * This method contains the code that you want to execute. 
  28.    * 
  29.    * @return the response 
  30.    */ 
  31.   @Override 
  32.   public ResponseToProcess execute(ProcessedAPIRequest request, SDKServiceProvider serviceProvider) { 
  33.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
  34.     //Send push messages... 
  35.     //Query the datastore... 
  36.     //Run complex server side operations.. 
  37.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
  38.     //Then prepare your custom JSON to send back to the mobile client 
  39.     Map<String, String> args = new HashMap<String, String>(); 
  40.     args.put("msg""hello world!"); 
  41.     return new ResponseToProcess(HttpURLConnection.HTTP_OK, args); 
  42.   } 
  43.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           

然后,在Android端這樣調用:

  1. StackMob.getStackMob().getDatastore().get("hello_world", new StackMobCallback() { 
  2.     @Override public void success(String responseBody) { 
  3.         //responseBody is "{ \"msg\": \"Hello, world!\" }" 
  4.     } 
  5.     @Override public void failure(StackMobException e) { 
  6.     } 
  7. }); 

StackMob教程指南:https://developer.stackmob.com/tutorials

#p#

Parse

Parse比StackMob晚成立一年,近期也得到了700萬美元的注資,目前團隊20人,有2萬名開發者使用其平臺,40萬款應用使用其服務。 支持的API有iOS、Android、JavaScript、Windows 8,以及提供了REST API和Cloud Code JS API。Cloud Code JS API和StackMob的Custom Code一樣用于服務端開發,處理自己的邏輯,不同的是,StackMob用Java或Scala開發,而Parse提供JS的接口。Parse提供的功 能服務也算是比較全面的,StackMob提供的大部分功能服務,它也提供了。而支持Windows8,這點還比StackMob領先了一步。另外,它對 ACL的設置也比StackMob靈活。StackMob只能在后臺管理頁面對角色設置ACL,而Parse可以在代碼中設置全局的ACL,也可以對每個 對象設置ACL。文件存儲方面,Parse雖然也是保存在S3,但它將用戶的文件保存在自己的平臺,而不是開發者自己的S3,這一點也比StackMob 要方便得多。

不過,Parse的SDK使用起來就沒StackMob那么方便了。Parse保存和查詢對象的代碼如下:

  1. ParseObject gameScore = new ParseObject("GameScore"); 
  2. gameScore.put("score"1337); 
  3. gameScore.put("playerName""Sean Plott"); 
  4. gameScore.put("cheatMode"false); 
  5. gameScore.saveInBackground(); 
  6.                                                                          
  7. ParseQuery query = new ParseQuery("GameScore"); 
  8. query.getInBackground("xWMyZ4YEGZ"new GetCallback() { 
  9.   public void done(ParseObject object, ParseException e) { 
  10.     if (e == null) { 
  11.       int score = object.getInt("score"); 
  12.       String playerName = object.getString("playerName"); 
  13.       boolean cheatMode = object.getBoolean("cheatMode"); 
  14.     } else { 
  15.       // something went wrong 
  16.     } 
  17.   } 

這樣子,開發者就很難定義自己的數據模型,全部操作都只能通過ParseObject了。Model和Controller完全耦合在一起,應用與Parse的耦合性非常強,如果開發者想要移植到其他平臺就會很麻煩。而且,這種模式,對于開發比較復雜的應用也將變得麻煩。

再看看Parse的Cloud Code。使用Parse的Cloud Code,需要下載Parse提供的命令行工具,然后需要用parse new命令創建一個存放代碼的目錄,還需要輸入郵箱和密碼登錄開發者的賬號,選擇一個應用,并用cd命令進入創建的目錄:

$ parse new MyCloudCode
Email: ninja@gmail.com
Password:
1:MyApp
Select an App: 1
$ cd MyCloudCode

MyCloudCode目錄會自動生成幾個文件:

-config/
  global.json
-cloud/
  main.js

其中,main.js就是保存開發者自己所有Cloud Code的地方。寫個最簡單的例子:

  1. Parse.Cloud.define("hello", function(request, response) { 
  2.   response.success("Hello world!"); 
  3. }); 

然后用parse deploy命令部署到Parse平臺上:

$ parse deploy

然后,在Android端就可以用以下代碼調用:

  1. ParseCloud.callFunction("hello"new HashMap<Object, Object>(), new FunctionCallback<String>() { 
  2.    void done(String result, ParseException e) { 
  3.        if (e == null) { 
  4.           // result is "Hello world!" 
  5.        } 
  6.    } 
  7. }); 

Parse文檔:https://parse.com/docs

#p#

Kinvey

Kinvey則是TechStars下的一家創業公司,也是去年成立,到目前為止也已經得到了700萬美元的投資,目前團隊19人,而使用其平臺的 應用數則沒有公布。前端支持的API有iOS、Android、JavaScript和REST,后端同樣提供了Backend Logic接口供開發者處理后臺邏輯。相較于StackMob和Parse,Kinvey提供的功能就沒那么全面了,缺少了角色管理,也缺少了地理位置服 務。

Kinvey的SDK有一點我比較喜歡,那就是Model和Controller有了較好的分離,Model提供了接口 MappedEntity,Controller則用KCSClient做入口。不過,數據模型的定義卻不如StackMob那樣方便,多了一步屬性與后 臺表字段的映射。代碼如下:

  1. public class MyEntity implements MappedEntity { 
  2.     private String uname; 
  3.     private String id; 
  4.                                                                                  
  5.     @Override 
  6.     public List<MappedField> getMapping() { 
  7.         return Arrays.asList(new MappedField[] { new MappedField("uname""name"), 
  8.                                                 new MappedField ("id""_id") }); 
  9.     } 
  10.                                                                                    
  11.     // Getters and setters for all fields are required 
  12.     public String getUname() { return uname; } 
  13.     public void setUname(String n) { uname = n; } 
  14.     public String getId() { return id; } 
  15.     public void setId(String i) { id = i; } 
  16.                                                                                       

其中,getMapping方法就是處理映射關系。然后保存數據就可以通過以下代碼:

  1. MyEntity item = ...; 
  2.                                                                      
  3. item.setName("Idle Blue"); 
  4.                                                                             
  5. mKinveyClient.mappeddata("collectionName").save(item, new ScalarCallback<MyEntity>() { 
  6.                                                                                   
  7.   @Override 
  8.   public void onFailure(Throwable e) { ... } 
  9.                                                                      
  10.   @Override 
  11.   public void onSuccess(MyEntity r) { ... } 
  12.                                                           
  13. }); 

其中,mKinveyClient.mappeddata("collectionName")方法得到MappedAppData,該類封裝了 MappedEntity相關的各種操作。另外,通過mKinveyClient.resource("name")方法則得到 KinveyResource,該類封裝了文件相關的各種操作。

Kinvey另外還提供了和ParseObject類似的方式,代碼如下:

  1. EntityDict album = mKinveyClient.entity("albums"); 
  2. album.putProperty("title""Idle Blue"); 
  3. album.save(new ScalarCallback<EntityDict>() { 
  4.                                                     
  5.     @Override 
  6.     public void onFailure(Throwable e) { ... } 
  7.                                                                     
  8.     @Override 
  9.     public void onSuccess(EntityDict r) { ... } 
  10.                                                                
  11. }); 

Kinvey的Backend Logic與StackMob和Parse有著很大不同。StackMob和Parse雖然處理方式不同,但基本思路都是前端傳送指定的方法(如 hello_world),后臺寫相應的代碼處理這個方法。而Kinvey的Backend Logic則是在對數據庫操作的前后分別提供接口處理。如下圖:

PreProcess提供了幾個方法:

  1. function onPreSave(request,response,modules){ 
  2.                                                                                                
  3.  
  4. function onPreDelete(request,response,modules){ 
  5.      
  6.  
  7. function onPreFetch(request,response,modules){ 
  8.                                                                                                                  

PostProcess也提供了幾個方法:

  1. function onPostSave(request,response,modules){ 
  2.                                                                                                           
  3.     
  4. function onPostDelete(request,response,modules){ 
  5.     
  6.     
  7. function onPostFetch(request,response,modules){ 
  8.  

Kinvey文檔:http://docs.kinvey.com/overview.html

#p#

Bmob

Bmob不是一家公司的名字,只是廣州一家叫鵬銳的IT公司的其中一個產品。Bmob應該算是國內第一個BaaS平臺,今年4月份的時候上線的。而 到目前為止,Bmob還只有Android的SDK,而且還是山寨Parse的,但功能比Parse少了很多,沒有角色管理,沒有ACL,也沒有關系查 詢,更沒有后端的Cloud Code,跟Parse的SDK比較一下,就會知道相比Parse少了非常多的東西,基本上就是Parse的一個簡化版。版本升級過一次,在第二版加入了 支付功能,而支付卡基本上都是些游戲卡,很明顯,這是為付費游戲提供的服務。

看看Bmob的代碼,和Parse一樣的吧:

  1. BmobObject gameScore = new BmobObject("GameScore"); 
  2. gameScore.put("score"1200); 
  3. gameScore.put("playerName""張小明"); 
  4. gameScore.put("cheatMode"false); 
  5. try { 
  6.     gameScore.save(); 
  7. catch (BmobException e) { 
  8.     // e.getMessage() 捕獲的異常信息 

Bmob第一版的時候,就出現過很多問題,如經常斷線,數據丟失等,逐漸失去開發者的信任,基本功能也還很不完善。而第二版沒有去完善那些重要的功 能,提高開發者的信任度,反而推出了支付功能,我覺得這是個錯誤的策略。首先,重點應該放在完善基本功能和提高開發者對平臺的信任度;其次,支付功能這種 安全性要求非常高的服務,只有在平臺已經非常成熟,用戶對其已經非常信任的前提下提供才會有效用,在經常斷線,數據會出現丟失的情況下,有誰敢去用支付功 能呢?

另外,Bmob還提供了很多應用分析的功能,這一點,我也覺得多余了。專業的應用分析,已經有友盟平臺了,沒必要自己再做一套。

Bmob還存在很多不成熟的地方,第一版上線到目前也已經半年多了,改善的東西很少,發展速度較慢,給我的感覺就是他們沒有抓到真正的重點,或者他們將精力移到了廣告平臺——他們的另一個產品,畢竟那是實實在在可以賺到錢的產品。

Bmob官網:http://bmob.cn/

#p#

AMTBaaS

AMTBaaS是誠邁科技最近推出的BaaS平臺,9月中旬發布了iOS的SDK,10月中旬又發布了Android的SDK。目前,處于內測階 段。提供的文檔,除了API,也只有一個用戶手冊提供下載。網站和文檔的用戶體驗都比較差,其SDK的體驗也是很差,就說一個用戶注冊的方法:

  1. register(Context context, java.lang.String useremail, java.lang.String passWord, java.lang.String confirmPwd, boolean ischeckCode, java.lang.String checkcode, AmtUserCallback amtUserCallback) 

再看看用戶注冊的操作:

  1. // 注冊消息 
  2. public static final int MESSAGE_REGISTER = 1001
  3. // 構造AmtUser對象 
  4. private AmtUser amtUser = new AmtUser(); 
  5. // 注冊 
  6. amtUser.register(UserActivity.this, “user@qq.com”, “123456”, “123456”, true, “53Fe”, new AmtUserCallback() { 
  7.     @Override 
  8.     public void onSuccess(Object object) { 
  9.         if (object != null) { 
  10.             // 回調方法中不可直接操作UI控件 
  11.             mhandler.sendMessage(mhandler.obtainMessage( 
  12.                 MESSAGE_REGISTER, object)); 
  13.         } 
  14.     } 
  15.                                                                                                                                                                                                                         
  16.     @Override 
  17.     public void onFailure(AmtException amtException) { 
  18.         if (amtException != null) { 
  19.             // 回調方法中不可直接操作UI控件 
  20.             mhandler.sendMessage(mhandler.obtainMessage( 
  21.                 MESSAGE_REGISTER, amtException)); 
  22.         } 
  23.     } 
  24. }); 
  25. /** 
  26. * 注冊回調句柄 
  27. */ 
  28. Handler handler = new Handler() { 
  29.     @Override 
  30.     public void handleMessage(Message msg) { 
  31.         super.handleMessage(msg); 
  32.         switch (msg.what) { 
  33.             case MessageTypes.MESSAGE_REGISTER: 
  34.             // 注冊失敗 
  35.             if (msg.obj instanceof AmtException) { 
  36.              AmtException amtException = (AmtException)msg.obj; 
  37.              AmtUtil.log("UserActivity""注冊失敗:"
  38.                         amtException.getMessage(), "i"); 
  39.             } 
  40.             // 注冊成功 
  41.             else if (msg.obj instanceof String) { 
  42.              String result = (String)msg.obj; 
  43.              If (AmtConstants.SUCCESS.equals(result) { 
  44.                  AmtUtil.log("UserActivity""注冊成功""i"); 
  45.              } 
  46.             } 
  47.             break
  48.         } 
  49.     } 
  50. }; 

一個注冊就這么麻煩,完全不懂用戶體驗。對于其前景不看好。

AMTBaaS官網:http://amtbaas.com/

#p#

Xone

Xone則是我們公司現在的核心產品,目前開發了兩個月左右,前端只支持 Android,目前的SDK提供的功能有版本管理、數據存儲、用戶管理、文件存儲、地理信息服務,推送服務還沒開發出來。后端也提供JS的 Backend Logic服務,剛開發完。網站也只是搭了個雛形,現在正在重新設計和完善之中。

為了將Model和Controller較好地分離并能簡單的使用SDK,我們采用了這樣的結構:

1. 數據模型我們定義了一個基類XoneEntity,類里只定義了幾個基本屬性,不帶任何數據操作的方法。另外定義了繼承它的兩個子 類,XoneGeoEntity和XoneUser,XoneGeoEntity用于帶有地理信息的數據模型,XoneUser則是用戶數據模型。應用程 序自身的數據模型則繼承XoneEntity,然后定義自己的屬性即可,不需要像Kinvey那樣還要做映射。如果應用程序自身的數據模型需要包含地理信 息,則繼承XoneGeoEntity,用戶模型則繼承XoneUser。

2. 對各種服務分類提供了接口,每個接口里定義了相應的數據操作的方法。服務接口有:

  • AppService:應用程序和平臺相關的服務接口
  • CollectionService<T extends XoneEntity>:集合相關的服務接口
  • UserService<T extends XoneUser>:用戶相關的服務接口
  • FileService:文件相關的服務接口

3. XoneClient是Controller的入口,通過XoneClient實例的getXXXService()的各種方法調用各種服務接口,再通過服務接口調用具體的數據操作方法。比如,用戶注冊:

  1. UserService<XoneUser> userService = xoneClient.getUserService(); 
  2. userService.signUp(user, callback); 

一切都還在完善之中,各種功能服務,以及網站。后續,當我們的平臺正式上線時,我們的SDK還將會開源。

Xone官網:http://xone.im/

責任編輯:徐川 來源: diandian
相關推薦

2013-07-26 10:54:40

BaaS后端即服務云存儲

2013-07-26 09:38:25

BaaS后端即服務云存儲

2015-10-23 17:47:32

BaaSPaaS移動中間件

2013-07-29 10:45:51

BaaS后端即服務云存儲

2013-07-26 13:33:45

BaaS后端即服務云存儲

2013-08-12 18:33:43

AVOSBaaS后端開發

2013-07-31 08:42:08

BaaS移動云服務移動中間件

2013-12-08 21:16:21

BaaS企業級移動移動信息化

2016-01-05 16:05:56

BaaS后端云服務

2013-07-29 10:55:21

BaaS后端即服務云存儲

2021-08-10 10:43:05

清林云BaaSAPI

2015-01-28 09:44:38

移動后端即服務MBaaS

2015-08-27 09:19:23

移動后端即服務MBaaSPaaS

2015-09-02 09:55:03

云服務MBaaS移動三層架構

2013-12-31 10:25:56

原子移動云BaaS

2014-03-18 16:36:17

云BaaS云服務

2013-05-29 09:30:51

BaaS移動中間件HTML5應用

2013-08-11 22:11:20

CloudBaaSBaaS

2023-11-07 11:36:56

BaaS后端

2020-03-26 21:32:53

BaasFaasServerless
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 最近日韩中文字幕 | 日韩av在线一区二区 | 天天成人综合网 | 久久精品无码一区二区三区 | 精品毛片 | 国产农村妇女毛片精品久久麻豆 | 一区二区三区中文字幕 | 欧美久久免费观看 | 99热都是精品 | 久久国产精品视频观看 | 99久久免费精品国产男女高不卡 | 成人免费网站 | 黄色在线免费观看视频网站 | 中文字幕成人av | 色婷婷久久久久swag精品 | 一区二区三区亚洲视频 | www.夜夜草 | 国产亚洲一区二区在线观看 | 欧美一区二区三区在线观看 | 久久久影院| 日韩欧美国产精品综合嫩v 一区中文字幕 | 日韩免费视频一区二区 | 国产视频三区 | 久久大| 91久久久久久 | 日日骚av| 日本手机在线 | 日韩精品一 | 成年人免费在线视频 | 中文字幕 在线观看 | 中文字幕日韩一区二区 | 日韩欧美不卡 | 羞羞视频在线免费 | 国产精品国产精品国产专区不卡 | 亚洲精品免费在线 | 51ⅴ精品国产91久久久久久 | 亚洲精品自拍视频 | 激情一区二区三区 | 国产区精品视频 | 国产精品爱久久久久久久 | 亚洲网址在线观看 |