Spring 在中国规模的应用:阿里巴巴集团(支付宝,淘宝,和天猫)

工程 | Josh Long | 2013 年 3 月 4 日 | ...

那么,要如何应对中国规模的运营?

Some of the companies of the Alibaba group

构建能够满足中国规模需求的企业应用所固有的挑战是无与伦比的。阿里巴巴集团是使用 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 之上构建了自己的框架。值得注意的是,其中许多代码作为开源项目在线提供

The topology of a Dubbo cluster

阿里巴巴集团实际上出于不同的原因采用了几种不同的服务方法。一种方法称为 DubboDubbo 是一个高性能服务框架。它使得通过各种 RPC 模式导出和消费服务变得容易。它还使得对这些服务进行集群化变得容易。整个系统是开源的。您可以在 GitHub 上获取代码

Dubbo 构建在许多现有的开源组件之上,包括 Apache ZookeeperRedis,当然还有 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 architecture

支付宝专门使用的另一种服务方法是他们称为 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 组件

SOFAMVC architecture

虽然 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 的全面、深入的考察。

订阅 Spring 新闻通讯

订阅 Spring 新闻通讯,保持连接

订阅

领先一步

VMware 提供培训和认证,助您快速提升。

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看全部