基于Windows Azure Mobile Service,实现云连接(Connected)的Windows 8 Metro应用
最近,在和几位朋友聊天的时候,聊到了“云+端 (Cloud plus Client/device)”的话题。老实说,这并不是一个新话题:云+端、云+设备、物联网、智慧/感知{城市|交通|社区|医疗|…},等等。这些话题在太多场合被谈及,有点听觉疲劳了。
但同时,一些潜移默化的变化在身边发生:越来越多的人已经开始把笔记本电脑扔在办公室里,丢下的不仅仅是重量,还包括了一定的计算能力、存储容量;而手上的平板/PAD/手机等,已不是被限制在娱乐和游戏等简单应用,而是可以从容不迫地进行办公和业务处理,越来越多的云服务和能力,例如Skype、Office365、SkyDrive等,在这场变革中发挥越来越重要的作用。
之前在一些会议和交流中,曾经和业界朋友分享过这方面的经验和看法,特别是微软在一些行业和领域的解决方案,例如:
政府(/智慧城市/公民服务):http://www.microsoft.com/government/ww/public-services/solutions/Pages/connected-framework.aspx
医疗卫生:http://www.microsoft.com/health/en-us/solutions/Pages/connected-health-framework.aspx
离散制造:http://www.microsoft.com/enterprise/industry/discrete-manufacturing/solutions/discrete-reference-architecture.aspx#fbid=QDCmhPepbIQ
一言以蔽之,我们正在迎来一个连接的世界(a connected world)。那么,为了实现connected的目标,需要什么样的能力?
从端/移动设备的角度,会更加重视通讯的能力;从云的角度,除了计算(Computing)、存储(Storage),网络(network)及之上的相关服务也显得更加重要,而且要充分支持不同设备、特别是移动设备的需求。
微软Windows Azure最新发布的Windows Azure Mobile Service,为移动设备提供了强大的云能力支撑。通过Windows Azure新的Portal,可以很轻松快捷地创建一个Windows Azure Mobile Services:
http://blogs.technet.com/b/nevin_dongs_blog/archive/2012/08/29/windows-azure-mobile-services.aspx
与此同时,北京时间2012年9月12日,微软Windows应用商店正式面向广大开发者开放,无论是公司、个人以及学生开发者都可以登录https://appdev.microsoft.com/StorePortals/ 注册Windows开发者账号,登录开发者中心 (http://msdn.microsoft.com/zh-cn/windows/apps/br229512) 预留所喜爱的应用程序名称,并向Windows应用商店提交应用。
听到这一好消息,立即下手申请了一个属于个人的开发者账户,同时开发一个利用Windows Azure Mobile Service的Metro应用。
头一步,先到Windows Azure Portal,进入Mobile Services,创建一个新的服务。
然后进入这个Mobile Services,点击仪表盘(Dashboard)左边,按照系统提示,开始创建一个新的Windows Store app。这一步有两个关键:
· 在Windows Azure Storage中创建一个表(Table)。当然,在功能实现的时候,还可以创建其他表,来存储推送的服务数据、通道信息等。
· 下载一个Visual Studio的解决方案(Solution)模版,里面已经初步将使用这个刚创建的Mobile Services的初始化代码写好了。即:
public static MobileServiceClient MobileService = new MobileServiceClient(
" {Mobile Service URL}",
"{Application Key}"
如下图所示:
针对这个Mobile Service,为实现对移动应用的连接和服务,还要创建和设置好访问密钥(Access Keys),如下图所示:
通过Windows Azure Portal的Mobile Service的Dashboard,可以定期捕捉和监控Mobile Service的运行情况,特别是API Calls, CPU Time, Data Out等:
对于Windows 8 Metro App,开发中首先要将Package.appxmanifest文件中一些关键参数设置好,包括Package Name等。如下图所示:
这些需要在Windows 8开发者中心注册,而不是Windows Azure Portal中。
需要提醒的是,这些参数需要自己保管好,千万不要泄露哦…
跑一下试一试,哈,接到通知喽,准备放长假了…
“世界上本没有路,走的人多了,更无路可走了。” --《北京青年》
八月初的一天,在Redmond Campus做ADR;整整一个下午,大家对眼前的架构设计所涉及的复杂场景、复杂因素进行了逐轮脑力激荡。
中间休息,看大家讨论的这么辛苦,Lindsey分享了她的一个观点:架构设计一开始可以不必过于复杂,系统复杂度会随着发展而不断增加,也许将来某一天,系统已经复杂得无法掌控了。
在身边,有不少软件企业和开发者正面对这样的困境:新技术层出不穷、让人动心,但面对新技术却只能裹步不前,一方面担心采用新技术后对原来代码修改所带来的巨大工作量,另外一方面又担心新技术所带来的新的风险,真是“不做等死,做了找死”。这样一些产品团队可能被其他人所嘲笑,但回想起来他们最初也曾经是新技术创新的领导者、实践者。
大家都喜欢看马戏团小丑把越来越多的球抛到空中、接住再抛起,旁人看起来眼花缭乱,而演员则从容不迫。而做到这一点,却很不容易,一个必经之路是:从少的球开始练起来,正所谓do more from less, go big from small。道理很简单,却是大智慧。
OK, I’ll do more from less, fine, but what’s the next?
一个关键问题是架构的演化(evolution of architecture)。最早接触到软件架构这个理论是在1999年,当时一位朋友推荐读了Mary Shaw的一本书:《Software Architecture: Perspectives on an Emerging Discipline》。
http://www.amazon.com/Software-Architecture-Perspectives-Emerging-Discipline/dp/0131829572
后面见到书店有影印本,上面写的中文书名是《软件体系结构:一门初露端倪学科的展望》,可见当时对架构认识的状态;而后几年“架构师”这个职业如同雨后春笋,取代之前“系统分析员”成为众多开发者的职业发展规划的一个目标。差不多同一时间,《设计模式Design Pattern》也开始被越来越多的人所关注,并大行其道。
对于 “软件架构”的最新解释,不妨去维基百科看看:
http://en.wikipedia.org/wiki/Software_architecture
如何做好架构设计?方法和相关技术很多,网上随便搜一下,就可以看到很多,孰优孰劣,正所谓萝卜青菜,看架构师自己的喜爱了。
但进一步谈到架构演化,就需要更多的考虑,而关键一点应该是能够全面评估现有架构,而且当新的场景、新的技术、新的需求出现的时候,能够评估它们对现有架构的影响,做出正确的决策。同时,这也是避免架构变得越来越复杂的办法,换句话说,如果一个现有架构都复杂到无法准确评估的话,是否继续演化真就已经成为一个必须马上思考的问题。
按照墨菲定律(Murphy's Law):Anything that can go wrong will go wrong(如果一件事可能变糟,那麽它一定会变得糟糕)。
个人推荐的一个方法是Carnegie Mellon大学Software Engineering Institute推动的ATAM(Architecture Tradeoff Analysis Method)方法:
(上图摘自CMU SEI网站,http://www.sei.cmu.edu/architecture/tools/evaluate/atam.cfm)
这个方法有效地将业务驱动、场景和架构属性(技术属性和非技术属性)有机地结合起来,通过螺旋方式不断推动演化。
与系统变得越来越复杂的同时,团队规模和复杂度也在增高:需要招更多的人来开发,需要增加更多地职能还进行管理,而组织规模则变得越来越大、组织结构变得越来越复杂,而这又无疑让事情变得更加难以掌控。
如何让一个团队更加有效的工作?同样,方法论很多,工具也很多。
在和TFS team交流的时候,Aaron展示了最新的Team Foundation Service和Team Foundation Server。
对于Team Foundation Service,可以访问http://tfspreview.com/ 来进行体验。这个平台不仅仅有效支撑团队的敏捷开发模式,而且还让整个团队全生命周期地掌控设计、开发和测试。尤其Aaron分享了Visual Studio团队自己使用这套工具的真实数据库及如何使用Scrum来进行开发的经验,让人振奋。
http://tfspreview.com/en-us/home/features/feature-tour/
Well, how to do more from less?
上面这个story可以归纳为:Do more from less, managing {architecture evolution} and {team} with {ATAM} & {TFS}。
“谁知道我们该梦归何处,谁明白尊严已沦为何物;是否找个理由随波逐流,或是勇敢前行挣脱牢笼;我该如何存在?” --《北京青年》
“软件系统的下一个版本要支持尽可能多的数据库,要支持尽可能多的操作系统,要支持尽可能多的手机,要支持尽可能多的…;开发要用一套代码来实现,不要增加太多工作量…”
这样的讨论,在很多开发者来看,已经成为司空见惯的工作场景;同时也是很多设计和开发工作必须要用的定式。具体执行中,方法也有很多种,例如:避免使用特定数据库的专有特性,避免使用存储过程,尽量使用标准SQL语言;避免使用新操作系统的新特性,尽量实现向下兼容,界面沿袭原有的UX风格;使用跨平台、跨设备的语言,如HTML,提高可移植性,等等。
这样的做法确实无可厚非,特别对于一些通用软件产品或软件项目。这样做的出发点也是可以理解的,或许是要覆盖更广泛的用户群,或许是避免陷入被某些上游厂商“锁住(Lock-in)”的困境。
但开发者往往要面对一个新的困境:系统运行性能不尽人意、UI界面显得平庸、无法领导“潮”流…;开发者陷入自己编织的牢笼:需要自己开发出一些增强功能,而这些功能实际上本已在底层的一些平台产品里提供了。
跳出“牢笼”,也许会有一番新天地。
这也正是产品组的Kun在架构设计评估(ADR)中,和大家分享的一些新的实践和发现。在一些客户项目中,之前的做法是基于标准SQL语言开发上层应用,对于不同厂商的数据库往往仅作为数据存储和查询的基础设施。而如今,情况发生了一些有趣的变化,一些客户已经不想忍受之前做法所带来的巨大的维护工作量和笨重迟钝的架构,从而转向更多使用SQL Server所提供的最新特性,开发出专门面向SQL Server 2012的新版本。
这是一个值得肯定的做法,因为这将满足用户的个性化需求和体验,例如对于手机,一个使用Windows Phone手机的用户,往往并不希望使用一个无法充分体验WP特性的应用,对于其他平台手机的用户也是同样。显然,一个充分挖掘手机特性的应用将更加满足用户的需求和体验。
当然,事情也许没有这么简单,尤其是对于那些通用软件产品和软件服务的提供商,他们要面对的是广大的用户群,情形将更为复杂。而驱动他们进行改变的,应该是如何看待广大消费者(Consumer)的个性化需求,即Mass Customization。这个概念提得比较早,包括制造业、服务业都适用,可以参考一下维基百科上的定义:
http://en.wikipedia.org/wiki/Mass_customization
以及Narges Kamali及Suzanne Loker的论文《Mass Customization: On-line Consumer Involvement in Product Design》:
http://jcmc.indiana.edu/vol7/issue4/loker.html
在即将发布上市的Office上,我们看到了产品如何为不同的用户提供的不同的体验。以Lync为例:
Lync for Windows Phone用户
Lync for iPhone用户
Lync for iPad用户
从开发者角度,不妨跳出惯性思维,Do more upon less, providing {better user experience} via {customization}。
最近碰到一个有意思的问题,企业用户在应用System Center的时候,除了对常规的IT资源进行监控和管理的同时,希望通过System Center Operations Manager (SCOM)能够对自己的应用进行监控,特别是一些Java写的应用。
这样的做法,显然有其明显的价值,增强了IT对业务的支持和洞察力,提高了响应的即时性和准确性。
但问题是,如何通过SCOM对Java应用进行监控?
一些常见的实现方案包括:
· Java应用将状态信息(例如业务数据状态、操作异常、流程状态、流程异常等)写入Windows Event Log,这是一个比较直观的做法,同时也是一种松耦合的方式。这种方法充分与Windows的Log机制相结合,但也需要对Windows的Event Log进行管理,特别是大量的日志文件的写入和清理,对系统本身性能、存储的影响等。
具体实现,可参考Log4j:
http://logging.apache.org/log4j/1.2/
· Java应用将状态信息(例如业务数据状态、操作异常、流程状态、流程异常等)写入文本文件,这也是比较直观的做法,具体处理逻辑可以由开发商自己来确定,并可以根据自身需要和经验进行性能优化、分布式处理等。
· 通过Windows Management Instrumentation (WMI)方式,通过Windows Service方式存储状态,并与SCOM进行互操作:
http://msdn.microsoft.com/en-us/library/aa310909(v=vs.71).aspx
这种方法可以更好地监控应用的健康度(health), SCOM可以对WMI进行更好的监控。
可以用C#,或者用C++/C来开发。
http://msdn.microsoft.com/en-us/library/windows/desktop/aa389762(v=vs.85).aspx
以上做法对于System Center 2012之前的版本,例如System Center Operations Manager 2007 R2,是可以考虑的选择。对于System Center 2012,可以考虑使用其所提供的一个Add-On:System Center 2012 – Operations Manager Component Add-On,具体参考下面网址:
http://www.microsoft.com/en-us/download/details.aspx?id=29270
安装后,基于这个包,可以实现对Java应用的监控,支持IBM WebSphere, Oracle WebLogic, Red Hat JBoss and Apache Tomcat等服务器。
具体版本如下(包括了对非Windows操作系统的支持):
Version
RHEL
SLES
Solaris
AIX
Windows
IBM WebSphere
6.1, 7.0
yes
Oracle WebLogic
10gRel3, 11gRel1
Redhat JBoss
4.2, 5.1, 6.0
Apache Tomcat
5.5, 6.0, 7.0
工具提供了对这些服务器的关键指标的监控,这样对IT Pro人员全面掌握IT资源,提供了巨大的帮助。
此外,还可以与开源工具BeanSpy对部属运行的Java应用进行深度监控。
https://github.com/liupeirong/BeanSpy#readme