中国规模的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亿笔付费订单。凌晨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之上构建了自己的框架。值得注意的是,许多代码作为开源代码在线提供

The topology of a Dubbo cluster

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

Dubbo构建在许多现有的开源组件之上,包括Apache ZookeeperRedis,当然还有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 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本身非常有趣,但我真正喜欢的是他们构建了一个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的整个令人惊叹的深入了解。

获取Spring通讯

通过Spring通讯保持联系

订阅

领先一步

VMware提供培训和认证,以快速提升您的进度。

了解更多

获取支持

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

了解更多

即将举行的活动

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

查看全部