领先一步
VMware提供培训和认证,以快速提升您的进度。
了解更多构建满足中国规模需求的企业应用程序所固有的挑战是无与伦比的。一个使用Spring大规模解决非常独特的挑战的中国典范组织是阿里巴巴集团。阿里巴巴本身就是一个在线拍卖网站,就像西方的eBay一样。阿里巴巴集团又拥有其他几家在线服务公司,例如支付宝(一个安全的交易处理器,就像西方的PayPal一样),淘宝(一个比价购物引擎,就像西方的Shopzilla一样),以及天猫(一个电子零售商,展示商家的目录,就像西方的亚马逊一样)。
根据InfoQ文章,“2012年11月11日(双十一促销日),天猫和淘宝见证了1.47亿次用户访问,3000万人次购买,近1亿笔付费订单。凌晨0点,在线用户超过1000万。”“双十一促销日”被庆祝为一种纪念单身人士的日子。人们安排相亲,参加快速约会活动,并且——有点像美国的网络星期一购物——寻找商家提供的优惠。淘宝报告称,单日24小时销售额达30亿美元。这几乎是美国两大电子商务网站(合计)2011年黑色星期五销售额的三倍!这真是惊人的规模!
阿里巴巴集团一直以来都毫不避讳地谈论他们在做什么以及如何做。他们非常友好地参加了2012年12月在北京举行的SpringOne大会,并在会上详细解释了他们如何使用Spring来应对独特的挑战。
那么,应对中国规模需要什么?不出所料,需要很多!每家公司都有其自身特定的需求和用例,并开发了许多定制的基础设施和中间件来满足这些需求。在许多方面,这些架构与多年来Twitter、Facebook和Google的架构师所描述的架构类似。不同之处在于,通过构建在Spring框架之上,他们不必孤军奋战,并且可以更快地投入生产。Spring框架支撑着所有这些组织,提供了一个通用的以POJO为中心的框架和习惯用法,同时使软件测试简单得多。在许多情况下,有才华的架构师在Spring的组件模型和运行时之上构建了自己的定制的、特定于用例的框架和中间件。
这些组织之间有很多共同点。每个组织都处理海量数据,并需要可扩展的服务和跨服务通信。通常,这些引擎支持注册表的概念,该注册表知道网络拓扑中哪些服务正在运行,哪些可用,以及类型支持的RPC契约。这样的注册表知道如何配置每个实例,同时关注整个网络拓扑。每个组织都使用消息传递以可靠、快速的方式连接系统。每个组织都通过分解其服务并独立扩展每个服务来实现最佳规模。这种分解意味着服务并非位于同一位置,现在必须承担网络通信的成本。为了最大限度地减少网络通信,使用了具有已知契约的有效传输数据的二进制表示。最后,为了向用户公开这些服务,他们构建了高度优化的、几乎无状态的Web应用程序。
阿里巴巴集团在许多不同的地方使用了各种Pivotal技术。除了使用核心Spring之外,他们还在不同的配置和用途下使用了Spring MVC、Spring Security和Groovy。
他们还利用了Spring提供的强大灵活性,并在Spring之上构建了自己的框架。值得注意的是,许多代码作为开源代码在线提供。
阿里巴巴集团实际上使用了两种不同的服务方法,原因各不相同。一种方法称为Dubbo。Dubbo是一个高性能服务框架。它使通过各种RPC模式轻松导出和使用服务成为可能。它还使这些服务的集群变得容易。整个系统是开源的。您可以在GitHub上获取代码。
Dubbo构建在许多现有的开源组件之上,包括Apache Zookeeper、Redis,当然还有Spring。很容易看出为什么Dubbo 已经成为堆栈中的关键部分,每天为超过2000项服务提供超过30亿次调用。Dubbo已成为阿里巴巴基于服务的解决方案的关键部分,并已部署到整个阿里巴巴大家庭。
您可以使用Spring命名空间轻松设置和导出使用Dubbo的服务,其工作方式如下
<!-- Application name -->
<dubbo:application name="hello-world-app" />
<!-- registry address, used for service to register itself -->
<dubbo:registry address="multicast://224.5.6.7:1234" />
<!-- expose this service through dubbo protocol, through port 20880 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- which service interface do we expose? -->
<dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" />
<!-- designate implementation -->
<bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl" />
使用服务同样简单。在客户端,您在Dubbo命名空间中使用dubbo:reference元素通过接口绑定代理。然后,您可以将对该代理的引用注入到任何需要它的服务中,如下所示
<!-- consumer application name -->
<dubbo:application name="consumer-of-helloworld-app" />
<!-- registry address, used for consumer to discover services -->
<dubbo:registry address="multicast://224.5.6.7:1234" />
<!-- which service to consume? -->
<dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" />
支付宝专门使用的一种服务方法是他们称之为SOFA的项目,它也支持在分布式(并且重要的是,位于同一位置的环境)中轻松导出和使用服务。SOFA提供许多不同的RPC样式,并提供多种绑定。使用SOFA导出服务同样简单,如下所示
<sofa:service ref="beanId" interface="MyInterface">
<sofa:binding.ws/>
</sofa:service>
<sofa:reference id="refId" interface="MyInterface">
<sofa:binding.ws/>
<sofa:reference/>
您可以配置许多不同类型的绑定,例如<sofa:service.ws />
之外的绑定:<sofa:binding.tr>
、<sofa:binding.msg>
和<sofa:binding.http>
SOFA组件
虽然SOFA本身非常有趣,但我真正喜欢的是他们构建了一个SOFA架构感知版本的Spring MVC,称为SOFA MVC。SOFA MVC为Spring MVC提供了扩展,包括对Velocity模板渲染的某些优化、数据模拟支持、A/B测试支持、基于Spring Security针对某些安全漏洞(XSS、CSRF、上传过滤和cookie)的特定保护。此外,他们还构建了自己的部署和运行时,提供了诸如Spring应用程序上下文隔离和Servlet 3风格的Java配置之类的功能。
这种集成运行时方法已被证明非常有效,而对于他们非常独特的要求,下一步是从JBoss等较重的运行时迁移到像Eclipse Virgo这样的自研、定制的、更轻量级的容器。他们认为OSGi是一个强大有效的微内核,并提供可扩展的架构。他们喜欢它为在同一台机器上部署多个应用程序提供的隔离(在那种规模下,他们试图尽可能多地将应用程序服务器放在同一位置并重复使用!),并且他们喜欢OSGi所需的服务规范。
我建议任何有机会查看阿里巴巴集团开源项目的人都可以这样做。我访问他们的组织非常有价值。我学到了很多关于他们如何改变世界的事情。他们也给了我一些反馈,这些反馈都反馈到了SpringSource的工程中,以便你们社区能够从阿里巴巴所取得的进步中受益,一次一个事务。我个人要感谢淘宝的王靖宇、王新胜、丁力、张乐伟;天猫的庄卓然、刘昌丁、梁飞、王福强;支付宝的杨冰、王磊;以及——特别是——支付宝的丁雪峰,他帮助组织了对阿里巴巴集团如何使用Spring的整个令人惊叹的深入了解。