使用Capabilities API,您的應用程序可以檢測特定API功能的停機和計劃停機時間。 您可以使用此API來檢測應用程序何時不可用,然后繞過它來減少應用程序的停機時間。
我們該如何處理,這是個折衷方案?
1.優雅:創建一個切入所有數據存儲寫入的方面,并檢查其功能。 失敗,出現友好錯誤消息。
2.不太優雅:在每次寫入之前將功能檢查添加到存儲庫代碼中。 失敗,出現友好錯誤消息。 3.快速:寫過濾器,用于包裝整個事務并檢查數據存儲寫入。
我們如何在本地環境中對此進行測試?
1.沒有API掛鉤。 目前,我還無法找到或使用GAE Java代理來測試功能調用。
2.解決方案是使用模擬能力服務創建一個不同的版本,該服務能夠返回CapabilityStatus.DISABLED標志并進行測試。
由于時間原因,我選擇了快速方法。 稍后,我將嘗試重新討論此問題,并結合AspectJ或Google Juice來利用各個方面來解決這一明顯的跨領域問題。
Map<Capability, Boolean> apis = new HashMap<Capability, Boolean>();public void init(FilterConfig filterConfig) throws ServletException {apis.put(Capability.DATASTORE, true); apis.put(Capability.MEMCACHE, false);
}public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {HttpServletResponse httpResponse = (HttpServletResponse)res;HttpServletRequest httpRequest = (HttpServletRequest)req;CapabilitiesService service = CapabilitiesServiceFactory.getCapabilitiesService();for(Map.Entry api : apis.entrySet()) {if(api.getValue()) {CapabilityStatus status = service.getStatus(api.getKey()).getStatus();if (status != CapabilityStatus.ENABLED) {log.warn("API " + api.getKey().getPackageName() + ":" + api.getKey().getName() + " has been disabled!");httpResponse.sendRedirect(NEPAL_RES_HOST + "/html/read-only.html");return; }} } chain.doFilter(req, res);
}
命名空間API
在討論此API之前,讓我們介紹一下Multitenancy的概念。
名稱空間API最引人注目的用途之一是多租戶。 多租戶是一種軟件體系結構的名稱,在該體系結構中,運行在遠程服務器上的一個應用程序實例為許多客戶端組織(也稱為租戶)提供服務。
多租戶簡化了租戶的管理和供應。 您可以提供更簡化的,定制的用戶體驗,還可以在單??個數據庫架構下聚合不同的數據孤島。 結果,您的應用程序在擴展時變得更具可擴展性和成本效益
由于所有租戶共享相同的數據庫架構,因此數據變得更容易在租戶之間進行隔離和分析。
多租戶與多實例不同:
- 在多實例中,為不同的客戶組織設置了不同的軟件實例。
- 在多實例環境中,應用程序通常不了解客戶的差異,而在多租戶環境中,應用程序可用于隔離和分區數據。
Google App Engine中的Namespaces API使創建Google App Engine數據孤島變得容易。 該API是通過名為“命名空間管理器”的新程序包實現的。
在名稱空間管理器中設置名稱空間時,這些API將獲取當前名稱空間并在全局范圍內使用它。
任何App Engine請求都可以訪問任何名稱空間,而使應用程序可以跨多個名稱空間實施訪問控制策略。 在這種方法中,應用程序負責設置工作名稱空間。
支持名稱空間的API:
1.數據存儲
2. Memcache
3.任務隊列
使用Namespaces API,只需為每個租戶指定一個唯一的命名空間字符串,就可以在租戶之間輕松地對數據進行分區。 您只需使用“名稱空間管理器”為全局每個租戶設置名稱空間。 默認情況下,啟用了名稱空間的API始終使用當前名稱空間。
在數據存儲區中,名稱空間管理器會將名稱空間應用于每個鍵和查詢對象。
沒有Java API可以顯式設置鍵或查詢的名稱空間,所有這些操作都是通過名稱空間管理器進行的。
參考:我們的JCG合作伙伴 ReflectiveThought的 Google App Engine Java功能和命名空間API 。
相關文章:
- Java Code Geeks Andygene Web原型
- 每個程序員都應該知道的事情
- Spring MVC開發–快速教程
- SmartGWT入門,提供出色的GWT界面
- GWT 2 Spring 3 JPA 2 Hibernate 3.5教程
翻譯自: https://www.javacodegeeks.com/2011/04/app-engine-capabilities-namespaces-api.html