领先一步
VMware 提供培训和认证,助您快速提升。
了解更多构建能够满足中国规模需求的企业应用所固有的挑战是无与伦比的。阿里巴巴集团是使用 Spring 解决非常独特挑战的典范中国组织之一。阿里巴巴本身是一个在线拍卖网站,类似于西方的 eBay。阿里巴巴集团又拥有一些其他在线服务公司,例如 支付宝(一个安全的交易处理商,类似于西方的 PayPal),淘宝(一个比价购物引擎,类似于西方的 Shopzilla),以及 天猫(一个电子零售商,展示商家目录,类似于西方的亚马逊)。
根据 InfoQ 的文章,“在 2012 年 11 月 11 日(光棍节促销日),天猫和淘宝见证了 1.47 亿用户访问,3000 万人购物以及近 1 亿笔已支付订单。零点时,超过 1000 万用户同时在线。” “光棍节促销日”被视为一个向单身人士致敬的节日。人们会进行相亲、参加快速约会活动,并且——有点像美国的网络星期一购物——寻找商家的优惠。 淘宝报告称,单日 24 小时内的销售额达到 30 亿美元。这几乎是美国两个最大电子商务网站(合计)在 2011 年整个黑色星期五销售额的三倍!这才是惊人的规模!
阿里巴巴集团从不回避谈论他们正在做什么以及如何做。他们很友好地参加了 2012 年 12 月在北京举行的 SpringOne 大会,并在会上详细解释了他们如何使用 Spring 应对其独特的挑战。
那么,要应对中国规模需要什么?不出所料,需要不少!每家公司都有自己特定的需求和用例,并开发了相当多的定制基础设施和中间件来满足这些需求。其架构在很多方面反映了 Twitter、Facebook 和 Google 的架构师多年来描述的架构。不同之处在于,通过基于 Spring Framework 构建,他们不必独自摸索,并且可以更快地投入生产。Spring Framework 为所有这些组织提供了支撑,提供了一个通用的以 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 已成为阿里巴巴基于服务的解决方案的关键部分,并已部署到整个 Alibaba.com 系列。
您可以使用带有 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 本身非常有趣,但我真正喜欢的是他们在 Spring MVC 之上构建了一个感知 SOFA 架构的版本,称为 SOFA MVC。SOFA MVC 为 Spring MVC 提供了扩展,包括对 Velocity 模板渲染的某些优化、数据 Mock 支持、A/B 测试支持,以及基于 Spring Security 的针对某些安全漏洞(XSS、CSRF、上传过滤和 Cookie)的特定防护。此外,他们还构建了自己的部署和运行时,提供诸如 Spring 应用上下文隔离和 Servlet 3 风格的 Java 配置等功能。
这种集成的运行时方法已被证明非常强大,他们为满足非常独特的需求而采取的下一步是放弃 JBoss 等较重的运行时,转向他们自己开发的、量身定制的、更轻量级和定制化的容器,例如 Eclipse Virgo。他们认为 OSGi 是一个强大且有效的微内核,并提供了可扩展的架构。他们喜欢 OSGi 在同一机器上提供多部署隔离(在这种规模下,他们会尽可能地共置和重用应用服务器!),并且他们喜欢 OSGi 要求的服务规范。
我建议任何有机会的人都去看看阿里巴巴集团的开源项目。我访问他们组织的经历非常有价值。我了解了很多关于他们如何改变世界的信息。他们也给我提出了一些反馈意见,所有这些都已反馈到 SpringSource 的工程团队,以便您,这个社区,能够从阿里巴巴所做的进展中受益,一次一笔交易。我个人要感谢淘宝的 王敬煜、王新生、李鼎和张乐伟;天猫的 庄卓然、刘昌丁、梁飞、王福强;支付宝的 杨冰、王磊;尤其要感谢(也来自支付宝的)丁雪峰,他帮助组织了这次关于阿里巴巴集团如何使用 Spring 的全面、深入的考察。